pasando el objeto String con el valor "0x .." como bytes32 a una función de solidez

Tengo problemas para pasar bytes32 a una función de solidez desde javascript. Se está convirtiendo a bytes32 incorrectos en solidez. El javascript es una prueba, que se ejecuta con truffle v3.3.1 en testRPC v3.0.5.

MyContract {


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

Cuando le paso una cadena, funciona (y myEvent emite un hexadecimal correcto):

myContract.myTran( "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c");

esto también funciona:

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

Esto funciona, pero recibo un valor hexadecimal diferente de myEvent que el hexadecimal pasado:

 ... 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

Respuestas (2)

Creé un caso de prueba independiente y resultó que los códigos de operación no válidos fueron causados ​​por otra cosa.

De todos modos, el resultado de mis pruebas es que falla solo si lo paso como un objeto String (lo acepta pero convierte la cadena 0x0... en sus valores ASCII).

Pasado como objeto String .valueOf():

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

Pasado como objeto:

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

Contrato:

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);
    }

}
¡Excelente! Bien hecho. Buena suerte con el resto de tu ciclo de desarrollo.

¿Has probado a pasar la cadena primitiva?

var x = new String(tx.logs[0].args.id);
return myContract.myTran(x.valueOf()); 
gracias por el consejo. con x.valueOf()consigo: Error: VM Exception while processing transaction: invalid opcodetambién
Noté que no está indexando qen su event myEvent(bytes32 q);Y luego está accediendo a un resultado de evento formateado, especificando idcon tx.logs[0].args.id. ¿Podría estar leyendo el argumento equivocado?