Solidity verwendet staticcall oder call, um die Parameter aufzurufen, die die Struktur in der Methode enthalten

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 callFunktionsaufrufen 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 Sie staticcalleinen 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.

Guess you like

Origin blog.csdn.net/ling1998/article/details/129965390