Wie rufe ich die vorkompilierten Verträge aus meinem Vertrag auf?

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 DebugEreignis wird ausgelöst.

Aber wenn Sie den Code so verwenden, wie er ist, passieren seltsame Dinge. Die Transaktion wird gesendet und abgebaut! ABER das DebugEreignis 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 myContractVariablen und des Anfangs 0xzum dataFeld)

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.

Da Sie eine private Kette verwenden, sind Sie sich nicht sicher, ob dies hilft: ethereum.stackexchange.com/questions/1607/…
Vielen Dank! Das haben wir bereits versucht; hätte den ursprünglichen Beitrag ergänzen sollen. Leider hat es das Problem nicht gelöst / die Ergebnisse geändert.
Es ist auch kein Problem, eine Funktion in einem geminten Vertrag auf die oben gezeigte Weise über ihre Adresse aufzurufen. Aber wenn Sie normale Verträge verwenden , muss der Name der Schnittstellenfunktion ( foo) mit dem Namen im normalen Vertrag identisch sein, da der Name Teil der Signatur ist.

Antworten (1)

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.