передача объекта String со значением «0x..» в виде bytes32 в функцию твердости

У меня возникли проблемы с передачей 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

Ответы (2)

Я создал независимый тестовый пример, и оказалось, что неверные коды операций были вызваны чем-то другим.

В любом случае, результат моих тестов заключается в том, что он терпит неудачу, только если я передаю его как объект 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. Может быть, вы читаете неправильный аргумент?