У меня возникли проблемы с передачей bytes32 в функцию твердости из javascript. Он преобразуется в неверный байт32 в солидности. JavaScript — это тест, работающий с truffle v3.3.1 на testRPC v3.0.5.
MyContract {
event myEvent(bytes32 id);
function myTran(bytes32 arg) {
myEvent(arg);
}
}
Когда я передаю ему строку, она работает (и myEvent выдает правильный шестнадцатеричный код):
myContract.myTran( "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c");
это тоже работает:
var x = "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c";
return myContract.myTran(x);
Это работает, но я получаю от myEvent шестнадцатеричное значение, отличное от переданного шестнадцатеричного значения:
... 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
Я создал независимый тестовый пример, и оказалось, что неверные коды операций были вызваны чем-то другим.
В любом случае, результат моих тестов заключается в том, что он терпит неудачу, только если я передаю его как объект String (он принимает его, но преобразует строку 0x0.. в свои значения ascii).
Передается как объект String .valueOf():
var testFoo = "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce";
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj.valueOf());
// returns correct:
// "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce"
Передано как объект:
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj);
// returns incorrectly converted:
// "0x2230783334316638356635656361363330343136366663666236663539316434"
Договор:
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);
}
}
Вы пытались передать примитив строки?
var x = new String(tx.logs[0].args.id);
return myContract.myTran(x.valueOf());
x.valueOf()
я получаю: Error: VM Exception while processing transaction: invalid opcode
такжеq
свой event myEvent(bytes32 q);
И затем вы получаете доступ к отформатированному результату события, указав id
с помощью tx.logs[0].args.id
. Может быть, вы читаете неправильный аргумент?
Максимум