如何從部署的合約中檢索函式呼叫地址以使用 MetaMask 發送 + 交易數據?
我已經在我的 testrpc 網路中部署了一個合約。
$ truffle deploy Using network 'development'. Running migration: 1_initial_migration.js Deploying Migrations... Migrations: 0x9ec9e7fedb27068a70aedf453012bbced070d1e0 Saving successful migration to network... Saving artifacts... Running migration: 2_deploy_contracts.js Deploying CrowdFunding... CrowdFunding: 0x61a235a21078920353dbb719e7c1e6bd8c8e182b Saving successful migration to network... Saving artifacts...
如何獲取如下所示的函式地址(來自https://dappsforbeginners.wordpress.com/tutorials/contracts-that-send-transactions/
contribute
的範常式式碼):function contribute(uint campaignID) { Campaign c = campaigns[campaignID]; Funder f = c.funders[c.numFunders++]; f.addr = msg.sender; f.amount = msg.value; c.amount += f.amount; }
我假設我需要獲取函式地址,然後在 MetaMask 發送對話框中將其作為參數提供
transaction data
。我可以將 eth 作為金額發送,對嗎?然後,msg.value
和msg.sender
作為呼叫的上下文提供。
我假設我需要獲取函式地址,然後在 MetaMask 發送對話框中將其作為參數提供
transaction data
。我可以將 eth 作為金額發送,對嗎?是的。
要獲取方法 ID(請參閱什麼是 ABI 以及為什麼需要與合約互動?),您需要使用規範類型,然後使用 Keccak-256 對其進行雜湊處理並獲取前 4 個字節。
例子
對於
contribute(uint)
,您需要使用contribute(uint256)
.進入
contribute(uint256)
像https://emn178.github.io/online-tools/keccak_256.html這樣的工具你會得到
c1cbbca71c96db867642d5aeca3697d2e3bd24b386562e2b7004d1b0f4fbaaed
前 4 個字節(8 個十六進製字元)是
c1cbbca7
.
0xc1cbbca7
您可以通過https://www.4byte.directory仔細檢查ID text signature bytes signature 3752 contribute(uint256) 0xc1cbbca7
0xc1cbbca7
是您在 MetaMask 的交易數據中放入的內容,但您仍然需要將 uint256 參數編碼為contribute
.有關範例,請參見https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples。
為 ABI 手動編碼可能很棘手並且容易出錯。你最終可能會在合約上呼叫錯誤的函式,或者將你的 ETH 發送到一個無法為你提供所需內容的函式。小心並始終仔細檢查您是否需要這樣做。 在此範例中,您可能會錯誤地對活動 ID 進行編碼,並最終將 ETH 發送(並可能失去)錯誤的活動。