[英]Questions about ABI in Solidity
我正在研究 Uniswapv2 代码,但我被 ABI 困住了。 https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol
transfer
function,为什么还要使用带有call
方法的 ABI? 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。
web3js 的 ABI 是 JSON 形式。 它用于简单地调用所有现有的函数和参数。 如果您使用许多 function 和参数 -- JSON ABI 更适合使用。
您使用了带有选择器的短黑客版本 - 这不是很好的可读代码风格。
1-
我相信token.call(abi.encodeWithSelector(SELECTOR, to, value));
token 是另一个合约实例,在合约内部调用。 call
用于执行另一个合约的代码
2-
ABI 对有关智能合约功能和事件的信息进行编码。 它充当 EVM 级字节码和高级智能合约程序代码之间的接口。 为了与部署在以太坊区块链上的智能合约进行交互,外部程序需要 ABI 和智能合约的地址。 ABI 由以下部分组成:
• 所有 function 名称
• 输入和output类功能
• 所有事件名称及其参数
合约有十六进制表示和二进制表示:
Contract.abi:这包含 JSON 格式的智能合约的 ABI。
Contract.bin:这包含智能合约代码二进制的十六进制表示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.