我正在研究Uniswapv2代码,我被ABI卡住了。https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol
- 为什么在
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');
}
- 我读了很多关于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:它包含智能合约代码二进制的十六进制表示。