簡體   English   中英

關於 Solidity 中 ABI 的問題

[英]Questions about ABI in Solidity

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

  1. 即使我們可以直接從接口調用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');
    }
  1. 我已經閱讀了很多關於 ABI 的內容,我對有些人說它是 JSON 格式而有些人說它是字節格式感到困惑。 什么是對的?

您可以使用簡短的形式,如您的示例,無需完整的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM