关于Solidity中ABI的问题



我正在研究Uniswapv2代码,我被ABI卡住了。https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol

  1. 为什么在call方法中使用ABI,即使我们可以直接从接口调用transfer函数
bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
.
.
.
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
}
  1. 我读了很多关于ABI的文章,有些人说它是JSON格式,有些人则说它是字节形式,我对此感到困惑。什么是正确的

您可以像您的示例一样使用不带完整ABI的简短形式。

web3js的ABI是JSON形式。它用于简单地调用所有现有的函数和参数。如果您使用许多函数和参数,那么JSON ABI会更好地使用。

你使用了带有选择器的短破解版本——这不是一种可读性很好的代码风格。

1-

我相信token.call(abi.encodeWithSelector(SELECTOR, to, value));令牌是另一个合约实例,并且在合约内部调用。call用于执行另一个合同的代码

2-

ABI对有关智能合约功能和事件的信息进行编码。它充当EVM级字节码和高级智能之间的接口合同程序代码。与部署在以太坊区块链,外部程序需要ABI和地址智能合约。ABI由以下部分组成:

•所有功能名称

•功能的输入和输出类型

•所有事件名称及其参数

合同有十六进制表示和二进制表示:

  • Contract.abi:它包含JSON格式的智能合约的abi。

  • Contract.bin:它包含智能合约代码二进制的十六进制表示。

最新更新