Wie rufe ich die Funktionsaufrufadresse aus dem bereitgestellten Vertrag zur Verwendung mit MetaMask Send + Transaktionsdaten ab?

Ich habe einen Vertrag in meinem testrpc-Netzwerk bereitgestellt.

$ 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...

Wie erhalte ich die Adresse für die Funktion contribute(aus dem Beispielcode für https://dappsforbeginners.wordpress.com/tutorials/contracts-that-send-transactions/ ), die so aussieht:

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;
}

Ich nehme an, ich muss die Funktionsadresse abrufen und diese dann als Parameter im MetaMask-Sendedialog unter angeben transaction data. Ich kann die eth als Betrag senden, richtig? Dann werden msg.valueund msg.senderals Kontext für den Anruf bereitgestellt.

Antworten (1)

Ich nehme an, ich muss die Funktionsadresse abrufen und diese dann als Parameter im MetaMask-Sendedialog unter angeben transaction data. Ich kann die eth als Betrag senden, richtig?

Ja.

Um die Methoden-ID zu erhalten (siehe Was ist eine ABI und warum wird sie für die Interaktion mit Verträgen benötigt? ), müssen Sie kanonische Typen verwenden und sie dann mit Keccak-256 hashen und die ersten 4 Bytes nehmen.

Beispiel

Für contribute(uint)müssen Sie verwenden contribute(uint256).

Geben Sie contribute(uint256)ein Tool wie https://emn178.github.io/online-tools/keccak_256.html ein

Du wirst kriegenc1cbbca71c96db867642d5aeca3697d2e3bd24b386562e2b7004d1b0f4fbaaed

Die ersten 4 Bytes (8 Hex-Zeichen) sind c1cbbca7.

0xc1cbbca7Sie können dies anhand von https://www.4byte.directory überprüfen

ID      text signature      bytes signature
3752    contribute(uint256) 0xc1cbbca7

0xc1cbbca7ist das, was Sie in die Transaktionsdaten von MetaMask eingeben , ABER Sie müssen den uint256-Parameter noch in codieren contribute.

Beispiele finden Sie unter https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples .

Die manuelle Kodierung für die ABI kann schwierig und fehleranfällig sein. Möglicherweise rufen Sie die falsche Funktion im Vertrag auf oder senden Ihre ETH an eine Funktion, die Ihnen nicht das gibt, wonach Sie suchen. Seien Sie vorsichtig und überprüfen Sie immer, ob Sie dies tun müssen. In diesem Beispiel könnten Sie einen Fehler bei der Codierung der Kampagnen-ID machen und am Ende ETH an die falsche Kampagne senden (und möglicherweise verlieren).