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
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);
}
}
Haben Sie versucht, das String-Primitiv zu übergeben?
var x = new String(tx.logs[0].args.id);
return myContract.myTran(x.valueOf());
x.valueOf()
bekomme ich: Error: VM Exception while processing transaction: invalid opcode
auchq
Ich stelle fest, dass Sie in Ihrem
nicht indizieren event myEvent(bytes32 q);
Und dann greifen Sie auf ein formatiertes Ereignisergebnis zu, indem Sie id
mit angeben tx.logs[0].args.id
. Könnten Sie das falsche Argument lesen?
max