So verwenden Sie Strukturparameter im Aufruf
Wenn die benutzerdefinierte Struktur wie folgt lautet:
struct User{
uint8 userType;
uint8 age;
}
Wenn Call zum Aufrufen der Methode verwendet wird, muss der Strukturparameter als geschrieben werden
(uint8,uint8)
Das Folgende ist ein Beispiel, einschließlich eines Arrays von Strukturen, das auch die Verwendung von staticcall und call umfasst
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
struct User{
uint8 userType;
uint8 age;
}
contract Test {
User[] public users;
address[] public addrs;
bytes public payloadBytes;
function testCall() external {
User memory user = User(1,25);
User[] memory users0 = new User[](1);
users0[0] = user;
addrs.push(0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc);
bytes memory payload = abi.encodeWithSignature("testCalled(address[],(uint8,uint8)[])", addrs, users0);
payloadBytes = payload;
(bool success, ) = address(this).call(payload);
require(success, "call fail.");
}
function testCalled(address[] memory _addr, User[] memory _user) external{
require(_addr.length == _user.length, "Len is not the same.");
for (uint8 i = 0; i < _user.length; i++) {
addrs.push(_addr[i]);
users.push(_user[i]);
}
}
function testStaticcall() external {
User memory user = User(1,25);
User[] memory users0 = new User[](1);
users0[0] = user;
addrs.push(0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc);
bytes memory payload = abi.encodeWithSignature("testStaticcalled(address[],(uint8,uint8)[])", addrs, users0);
payloadBytes = payload;
(bool success, ) = address(this).staticcall(payload);
require(success, "staticcall fail.");
}
function testStaticcalled(
address[] memory _addrs,
User[] memory _users
) external view returns (uint256, uint256, address[] memory, User[] memory) {
return (_addrs.length, _users.length, addrs, users);
}
}
Der Unterschied zwischen staticcall und call
Mithilfe von
call
Funktionsaufrufen können Zustandsvariablen in einem Vertrag geändert werden. Wenn Sie jedoch nur den Status des externen Vertrags abfragen möchten, ohne ihn zu ändern, sollten Siestaticcall
einen Funktionsaufruf verwenden. Sie können die Statusvariablen im Vertrag nicht ändern, wenn Sie also abfragen möchten, ohne die Statusvariablen des externen Vertrags zu ändern , verwenden Sie staticcall.