Skip to content

Latest commit

 

History

History
53 lines (40 loc) · 1.79 KB

ABI编码.md

File metadata and controls

53 lines (40 loc) · 1.79 KB

ABI 编码

代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IERC20 {
    function transfer(address, uint) external;
}

contract Token {
    function transfer(address, uint) external {}
}

contract AbiEncode {
    function test(address _contract, bytes calldata data) external {
        (bool ok, ) = _contract.call(data);
        require(ok, "call failed");
    }

    function encodeWithSignature(
        address to,
        uint amount
    ) external pure returns (bytes memory) {
        // Typo is not checked - "transfer(address, uint)"
        return abi.encodeWithSignature("transfer(address,uint256)", to, amount);
    }

    function encodeWithSelector(
        address to,
        uint amount
    ) external pure returns (bytes memory) {
        // Type is not checked - (IERC20.transfer.selector, true, amount)
        return abi.encodeWithSelector(IERC20.transfer.selector, to, amount);
    }

    function encodeCall(address to, uint amount) external pure returns (bytes memory) {
        // Typo and type errors will not compile
        return abi.encodeCall(IERC20.transfer, (to, amount));
    }
}

描述

在Solidity中,abi.encode函数可用于将数据编码为ABI(应用二进制接口)格式。 ABI是一种标准化的接口规范,用于在不同的智能合约之间传递数据。

在此示例中,我们定义了一个名为AbiEncode的合约,其中包含一个名为encodeData的函数。该函数接受两个参数-一个整数和一个布尔值,并使用abi.encode将它们编码为ABI格式。然后,该函数返回一个bytes类型的结果,其中包含已编码的数据。

请注意,您可以使用abi.encodePackedabi.encodeWithSignature等其他编码函数,具体取决于您需要对数据执行的操作。