Ich versuche, einen der vorkompilierten Verträge aus meinem Vertrag aufzurufen. In diesem Fall ist es die ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
Funktion mit der Adresse 0x0..01.
pragma solidity ^0.4.3;
contract Precompile {
function foo (bytes32, uint8, bytes32, bytes32) returns (address);
}
contract Testcontract {
address last = 0x0;
event Debug(string message, address res);
Precompile prec = Precompile(0x0000000000000000000000000000000000000001);
function testMe () {
last = prec.foo("\x00", uint8(0), "\x00", "\x00");
Debug("testMe()", last);
}
}
Beim Auskommentieren der Zeile last = prec.foo("\x00", uint8(0), "\x00", "\x00");
funktioniert alles einwandfrei und das Debug
Ereignis wird ausgelöst.
Aber wenn Sie den Code so verwenden, wie er ist, passieren seltsame Dinge. Die Transaktion wird gesendet und abgebaut! ABER das Debug
Ereignis wird NICHT ausgelöst. Web3 gibt auch den Transaktionshash zurück. Beispiel Parity-Mining:
2016-11-02 16:24:28 Imported #176 ffbe…53cd (1 txs, 0.94 Mgas, 6.53 ms, 0.65 KiB)
Ich verwende Parity und eine private Kette mit dem folgenden Genesis-Block: https://gist.github.com/Kyroy/741a275a7af7b60ae66dc59d27089dcd
Ich habe den Vertrag mit dem Online-Compiler https://ethereum.github.io/browser-solidity/ kompiliert und verwende eine leicht modifizierte Version. (Hinzufügen der myContract
Variablen und des Anfangs 0x
zum data
Feld)
var testcontractContract = web3.eth.contract([{"constant":false,"inputs":[],"name":"testMe","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"message","type":"string"},{"indexed":false,"name":"res","type":"address"}],"name":"Debug","type":"event"}]);
var testcontract = testcontractContract.new(
{
from: web3.eth.accounts[0],
data: '0x60606040526000600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff02191690836c010000000000000000000000009081020402179055506001600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff02191690836c010000000000000000000000009081020402179055506102068061008e6000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063524158401461003c57610037565b610002565b346100025761004e6004805050610050565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663debc39516000600060405160200152604051827c0100000000000000000000000000000000000000000000000000000000028152600401808060008152602001506020018260ff168152602001806000815260200150602001806000815260200150602001915050602060405180830381600087803b156100025760325a03f1156100025750505060405180519060200150600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff02191690836c010000000000000000000000009081020402179055507f14186b8ac9c91f14b0f16f9e886356157442bb899be26513dfe1d4d5929a5bac600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825260088152602001807f746573744d6528290000000000000000000000000000000000000000000000008152602001506020019250505060405180910390a15b56',
gas: 4700000
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
myContract = contract;
}
})
Nachdem der Vertrag abgebaut wurde, verwende ich die folgenden Befehle, um auf das Ereignis zu warten und die Funktion aufzurufen:
var evt = myContract.Debug(function (err, data) { console.log('Debug', err, data); });
myContract.testMe({from: web3.eth.accounts[1]});
Ich habe auch versucht:
Bauen Sie Parity selbst mit println!
in die vorkompilierten Funktionen, um zu testen, ob sie aufgerufen werden. Sie sind nicht. Aber bei der Verwendung sha256(..)
erscheinen meine Ausgaben auf der Konsole.
Vorher sha256(..)
und nachher anwenden last = prec.foo("\x00", uint8(0), "\x00", "\x00");
. Die erste Zeile wird ausgeführt und ich sehe die Ausgabe auf der Konsole. Aber die Zeile nach dem vorkompilierten Vertragsaufruf wird NICHT ausgeführt.
Die Lösung für dieses Problem ist ganz einfach. Verwenden Sie solc v0.3.6!
In Solc v0.4.0 fügten sie hinzu:
Der Funktionsaufruf wird ausgelöst, wenn der Zielvertrag keinen Code enthält
An den Adressen der Vorkompilierungen befindet sich kein Code, da sie direkt in den Clients behandelt werden, sodass dieser Test fehlschlägt. Ich weiß jedoch nicht, warum meine Hinrichtung nicht fehlschlägt.
eth
Jakob Eberhardt
Kyroy
foo
) mit dem Namen im normalen Vertrag identisch sein, da der Name Teil der Signatur ist.