Übergabe eines String-Objekts mit dem Wert "0x.." als bytes32 an eine Solidity-Funktion

Ich habe Probleme, bytes32 von Javascript an eine Solidity-Funktion zu übergeben. Es wird in Solidity in ein falsches bytes32 konvertiert. Das Javascript ist ein Test, der mit truffle v3.3.1 auf testRPC v3.0.5 läuft.

MyContract {


  event myEvent(bytes32 id);
  function myTran(bytes32 arg) {
     myEvent(arg);
  }
}

Wenn ich ihm eine Zeichenfolge übergebe, funktioniert es (und myEvent gibt ein korrektes Hex aus):

myContract.myTran( "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c");

das geht auch:

var x = "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c";
return myContract.myTran(x);

Dies funktioniert, aber ich erhalte einen anderen Hex-Wert von myEvent als das übergebene Hex:

 ... tx executed before  ...
    var x = new String( tx.logs[0].args.id );
    console.log(typeof x, x); // output: string 0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c
    return myContract.myTran(x); // executes but the bytes32 in the event is different

Antworten (2)

Ich habe einen unabhängigen Testfall erstellt und es stellte sich heraus, dass die ungültigen Opcodes durch etwas anderes verursacht wurden.

Wie auch immer, das Ergebnis meiner Tests ist, dass es nur fehlschlägt, wenn ich es als String-Objekt übergebe (es akzeptiert es, konvertiert aber die 0x0..-Zeichenfolge in seine ASCII-Werte).

Übergeben als String-Objekt .valueOf():

var testFoo = "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce";
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj.valueOf());
// returns correct:
// "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce"

Als Objekt übergeben:

var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj);
// returns incorrectly converted:
// "0x2230783334316638356635656361363330343136366663666236663539316434"

Vertrag:

pragma solidity ^0.4.11;

contract Bytes32Test {
    bytes32[] public fooStore;

    function getFooStoreLength() constant returns (uint len) {
        return fooStore.length;
    }

    event logFoo(bytes32 foo);
    function sendFoo(bytes32 foo) {
        fooStore.push(foo);
        logFoo(foo);
    }

}
Exzellent! Gut erledigt. Viel Glück mit dem Rest Ihres Entwicklungszyklus.

Haben Sie versucht, das String-Primitiv zu übergeben?

var x = new String(tx.logs[0].args.id);
return myContract.myTran(x.valueOf()); 
Danke für den Tipp. mit x.valueOf()bekomme ich: Error: VM Exception while processing transaction: invalid opcodeauch
qIch stelle fest, dass Sie in Ihrem nicht indizieren event myEvent(bytes32 q);Und dann greifen Sie auf ein formatiertes Ereignisergebnis zu, indem Sie idmit angeben tx.logs[0].args.id. Könnten Sie das falsche Argument lesen?