Transactions

如何從部署的合約中檢索函式呼叫地址以使用 MetaMask 發送 + 交易數據?

  • August 2, 2017

我已經在我的 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.valuemsg.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 發送(並可能失去)錯誤的活動。

引用自:https://ethereum.stackexchange.com/questions/19034