Es kann kein Wert durch Aufrufen einer Methode aus einem anderen Vertrag abgerufen werden

Ich habe zwei Verträge erstellt, um Speicher- und Validierungsregeln zu trennen.

ValidationService.sol

pragma solidity ^0.4.16;
import "./Storage.sol";

contract ValidationService {

Storage public store;


 constructor(address add) public{
    store=Storage(add);
 }


 function getMyNumber() public constant returns (uint) {

     return store.getNumber();

 }


}

Speicher.sol

pragma solidity ^0.4.16;

contract Storage {

uint public mynum = 5;


  function getNumber() public constant returns (uint) {
    return mynum;
  }

 }

Ich habe die getMyNumber-Methode aufgerufen, die die getNumber-Methode des Speichervertrags aufgerufen hat, und sie sollte 5 als Ausgabe zurückgeben.

validationservice.getMyNumber.call()

Der obige Code funktioniert gut in der Remix- und Truffle-Entwicklungsumgebung, aber er funktioniert nicht in einem privaten Blockchain-Netzwerk mit Geth.

Wenn ich die getNumber-Methode des Speichervertrags direkt von der Geth-Konsole aus aufrufe, funktioniert es einwandfrei.

Kann jemand bitte anleiten, wo mein Fehler ist

Ich habe den Fehler in der Miner-Konsole gefunden, nachdem die Ausführlichkeitsoption aktiviert wurde. Ethereum hat die Fehlermeldung „Ungültiger Opcode 0x3d“ ausgegeben, wenn ich die getMyNumber-Methode aufrufe. Bitte helfen Sie mir, wenn jemand diesen Fehler kennt und weiß, wie er behoben werden kann.

Antworten (3)

Ich habe das Problem gelöst. Ich habe "byzantiumBlock": 0 in der Datei genesis.json verwendet und die private Blockchain neu erstellt.

Weitere Einzelheiten finden Sie unter

Ungültiger Opcode 0x3d

Danke euch allen

Das funktioniert gut. Der einzige Fall, in dem es nicht funktioniert, ist, wenn Sie bei der Bereitstellung nicht die richtige Adresse übergeben validationService.

Hoffe das hilft

Ich gebe die richtige Adresse weiter. Die Methode wurde ohne Fehler erfolgreich ausgeführt, gibt aber immer 0 statt 5 zurück.

Wenn Sie unten Fehler erhalten-

call to ValidationService.getMyNumber errored: VM error: revert.
revert  The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value. Debug the transaction to get more information. 

dann verwenden Sie die falsche Adresse. Es wäre großartig, wenn Sie weitere Informationen zu dem Fehler mitteilen könnten, mit dem Sie konfrontiert sind.

Methode wird erfolgreich ohne Fehler ausgeführt. Auf der Geth-Konsole wird 0 statt 5 zurückgegeben.
Ich habe Miner mit Verbosity Level 5 ausgeführt und festgestellt, dass die Fehlermeldung „Ungültiger Opcode 0x3d“ angezeigt wird, wenn ich die Methode getMyNumber aufrufe. Bitte leiten Sie mich an, was dieser Fehler ist und wie er behoben werden kann