Die Funktion von Smart Contracts funktioniert im Testnet, aber nicht im privaten Netzwerk

Ich habe einen Smart Contract erstellt (ERC20-Implantation). Der Vertrag läuft super mit testrpc, ropsten und rinkeby, aber ich möchte ihn in einem privaten Netzwerk verwenden. Wenn der Vertrag im privaten Netzwerk bereitgestellt wird, erhalten einige der Funktionen die Warnung „Gasanforderung der Funktion hoch: unendlich im Remix“, und wenn ich versuche, mit dem Vertrag zu kommunizieren, schlägt die Transaktion immer fehl. Gibt es einen Grund, warum ein Vertrag in einem Netzwerk perfekt funktioniert, aber nicht in dem anderen? Ich habe in meinem Genesis-Block ein sehr hohes "gasLimit" eingestellt

Genesis-Datei des privaten Netzwerks:

{
"config": {
"chainId": 51190,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},

"alloc"      : {},
"coinbase"   : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x400",
"extraData"  : "",
"gasLimit"   : "0xffffd8",
"nonce"      : "0x0000000000000042",
"mixhash"    : 
"0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : 
"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp"  : "0x00"
}

Soliditätscode:

myToken.sol:

constructor (address _interfaceData) 
  public
  {
   interfaceData = DataContract(_interfaceData);
  }

function transfer(address _to, uint256 _value) public returns (bool) {
    if (interfaceData.isTransferWhitelistOnly()) {
      require(isUserAllowedToTransfer(msg.sender));
    }
    return super.transfer(_to, _value);
 }

BasicToken.sol:

function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
}

DataContract.sol:

bool public isTransferWhitelistOnly;

Jede Hilfe wird geschätzt

Geben Sie den Code an. Wir können Ihnen nicht sagen, was nicht stimmt, wenn Sie uns nicht zeigen, was nicht richtig funktioniert.
Sie haben keine Byzantinum-Opcodes aktiviert, und da neue Versionen des Solc-Compilers solche Opcodes verwenden, werden Ihre Verträge in Ihrem privaten Testnetz fehlschlagen.

Antworten (1)

Ohne Details ist es nicht möglich zu wissen, dass dies "das" Problem ist, aber es ist ein Verdächtiger.

Der Byzantium Fork ist eine Protokolländerung. Folglich besteht eine Inkompatibilität zwischen kompiliertem Code ab einer bestimmten Version und Blockchain-Knoten, auf denen ein älteres Protokoll ausgeführt wird. Ihr privates Netzwerk besteht möglicherweise aus Knoten, die ein älteres Protokoll ausführen, als Ihr kompilierter Code erwartet.

Zusammenfassend lässt sich sagen, dass sich das Funktionsantwortformat weiterentwickelt hat, sodass die Dinge auf beiden Seiten dieselbe Grammatik verwenden müssen, sonst gibt es Probleme.

Sie sagen, dass der Code in verschiedenen öffentlichen Netzwerken ausgeführt wird, sodass davon ausgegangen werden kann, dass er den neuesten Knoten erwartet.

Ich hoffe es hilft.

Hallo Rob. Ich verwende Geth-Version 1.8.16-stable, Sloc-Version: 0.4.25-develop.2018.6.21+commit.32f2db78.Linux.g++. Ich habe den für die Übertragung verwendeten Code hinzugefügt. (die Funktion, die in meinem privaten Netzwerk fehlschlägt). Ich denke, das sind die neusten Versionen, oder? Danke