Überprüfen der Länge von bytes32 [] im Vertragskonstruktor löst mit ungültigem Opcode aus

Dies ist mein Vertragskonstrukteur:

 function   MyContract ( address _owner ,  bytes32 []  _array )   { owner =  _owner ; 
         require ( _array . length >   1 ); 
     } 

Die require(_array.length > 1) dass der Vertrag fehlschlägt mit:

 Error :  VM Exception   while  processing transaction :  invalid opcode at Object . InvalidResponse   ( /usr/ local / lib / node_modules / truffle / build / cli . bundled . js : 37295 : 16 ) at / usr / local / lib / node_modules / truffle / build / cli . bundled . js : 224765 : 36 at / usr / local / lib / node_modules / truffle / build / cli . bundled . js : 66971 : 11 at / usr / local / lib / node_modules / truffle / build / cli . bundled . js : 208348 : 9 at XMLHttpRequest . request . onreadystatechange ( /usr/ local / lib / node_modules / truffle / build / cli . bundled . js : 209773 : 13 ) at XMLHttpRequestEventTarget . dispatchEvent ( /usr/ local / lib / node_modules / truffle / build / cli . bundled . js : 67130 : 18 ) at XMLHttpRequest . _setReadyState ( /usr/ local / lib / node_modules / truffle / build / cli . bundled . js : 67420 : 12 ) at XMLHttpRequest . _onHttpResponseEnd ( /usr/ local / lib / node_modules / truffle / build / cli . bundled . js : 67575 : 12 ) at IncomingMessage .< anonymous >   ( /usr/ local / lib / node_modules / truffle / build / cli . bundled . js : 67535 : 24 ) at emitNone ( events . js : 110 : 20 ) 

Warum löst dies eine Ausnahme aus? Und wie löse ich das?

BEARBEITEN

 contract ( 'MyContract' ,   function ( accounts )   { 
     const  testParams =   { _owner :  accounts [ 0 ], _array :   [ "first" ,   "second" ,   "third" ], 
     }; 

     let  testMyContract ; describe ( "New MyContract:" ,   async   function ()   { before ( async   function ()   { testMyContract =   await   MyContract . new (... Object . values ( testParams )); 
         }); it ( "sets the first account as the contract creator" ,   async   function ()   { 
             let  owner =   await  testMyContract . owner . call (); 
             assert . equal ( owner ,  accounts [ 0 ],   "Owner does not match." ); 
         }); it ( "sets the topic result names correctly" ,   async   function ()   { 
             let  resultName1 =   await  testMyContract . getResultName ( 0 ); 
             assert . equal ( web3 . toUtf8 ( resultName1 ),  testParams . _resultNames [ 0 ],   "Result name 1 does not match." ); 

             let  resultName2 =   await  testMyContract . getResultName ( 1 ); 
             assert . equal ( web3 . toUtf8 ( resultName2 ),  testParams . _resultNames [ 1 ],   "Result name 2 does not match." ); 

             let  resultName3 =   await  testMyContract . getResultName ( 2 ); 
             assert . equal ( web3 . toUtf8 ( resultName3 ),  testParams . _resultNames [ 2 ],   "Result name 3 does not match." ); 
         }); 
         }); 
     }); 
 } 

Migrationsskript

 var   SafeMath   =  artifacts . require ( "./SafeMath.sol" ); 
 var   MyContract   =  artifacts . require ( "./MyContract.sol" ); 
 var   MyContractCreator   =  artifacts . require ( "./MyContractCreator.sol" ); 

 module . exports =   function ( deployer )   { deployer . deploy ( SafeMath ); deployer . link ( SafeMath ,   MyContract ); deployer . deploy ( MyContract ); deployer . link ( MyContract ,   MyContractCreator ); deployer . deploy ( MyContractCreator ); 
 }; 
Der Fehler ist, dass _array keine Länge größer als 1 hat, dann muss geworfen werden.
Entschuldigung, ich hätte es klarstellen sollen. Meine Tests schlagen mit dieser Ausnahme fehl, obwohl die Array-Länge größer als 1 ist.
Ungültiger Opcode, der durch einen Wurf generiert wurde, der einzige Wurf in Ihrem Code, der durch die Anforderung generiert wurde. Wenn Sie die Anforderung entfernen, funktioniert es? Möglicherweise codiert Ihr Javascript-Aufruf das Array nicht richtig. Wie erfolgt Ihr Javascript-Aufruf?
@Ismael Ja, wenn ich die Anforderung entferne, geht es gut. Ich habe mein OP so bearbeitet, dass es meinen ersten Test enthält.
Ich habe Ihr Beispiel ausprobiert und es funktioniert hier. Verwenden Sie ein Bereitstellungsskript? Möglicherweise liefern Sie dort nicht genügend Parameter.

Antworten (1)

Das Problem lag im Bereitstellungsskript. Es ist fehlgeschlagen, weil es keinen Parameter erhalten hat:

 deployer . deploy ( MyContract );   

Und wenn der Konstruktor aufgerufen wurde, schlägt er aufgrund der Anforderung fehl.

Stellen Sie diesen Vertrag entweder nicht bereit, übergeben Sie Dummy-Werte zum Testen (und entfernen Sie sie für die endgültige Bereitstellung).

 deployer . deploy ( MyContract ,   "0x12341234" ,   [ "0x01" ,   "0x02" ,   0x03 ]); 

Eine andere Möglichkeit besteht darin, die Anforderung zu entfernen.