„AssertionError: Vertragscode leer“ beim Testen des Vertrags über einer bestimmten Größe. Wie kann ich es beheben?

Ich schreibe einen Vertrag für ganzzahlige Arithmetik beliebiger Länge zur Verwendung in einem größeren Projekt.

Das Problem ist, dass, sobald der Vertrag eine bestimmte Größe überschreitet, die Python-Testumgebung ethereum.tester.state().abi_contract() diesen Stack-Trace ausgibt:

Traceback (most recent call last):
  File "se_bigint.py", line 5, in <module>
    bigint = s.abi_contract('bigint.se')
  File "/home/ada/mypy/local/lib/python2.7/site-packages/ethereum/tester.py", line 166, in abi_contract
    assert len(self.block.get_code(address), "Contract code empty")
AssertionError: Contract code empty

Hier ist ein Pastebin mit funktionierendem Code: http://pastebin.com/1KppMmRx

Und hier ist ein Pastebin, das den Fehler reproduziert: http://pastebin.com/qq7mcLeM

Beachten Sie, dass der einzige Unterschied zwischen ihnen eine bedeutungslose Arbeit ist, die einer der Vertragsfunktionen hinzugefügt wird. Beachten Sie auch, dass beide Verträge erfolgreich über "serpent compile bigint.se" kompiliert werden. Ich sehe dies sowohl in der PyPI-Version als auch im aktuellen Github-Entwicklungszweig.

Ich hätte das im Ethereum-Forum gefragt, aber ich scheine dort drüben in der Kontobestätigung festzustecken.

Weiß jemand woran das liegen könnte oder wie man das umgehen kann?

Antworten (1)

Liefern Sie genug Gas für den Einsatz? Vor Homestead können Verträge ohne Code bereitgestellt werden, wenn Ihnen während der Bereitstellung das Benzin ausgeht.

Ah, das hat mir gefehlt. Für diejenigen unter Ihnen, die dies in Zukunft lesen: versuchen Sie es mit state.abi_contract("script.se",gas=10000000). Wenn das nicht funktioniert, versuchen Sie, das Gas weiter zu erhöhen.
Eine ähnliche Option ist: ethereum.tester.gas_limit = 3000000 Wenn Sie das Gas erhöhen, ist es immer noch gut, unter dem Blockgaslimit zu bleiben, da sonst der Testvertrag so wie er ist nicht im Mainnet bereitgestellt werden kann.