Cómo pasar bytes arbitrarios a una función (2016)

Estoy tratando de implementar un contrato que almacenará bytes blob, una matriz dinámica de bytes.

Por ejemplo, tengo la siguiente estructura:

Sign {
    address signer;
    bytes16 signType;
    bytes   sign;
}

más un evento:

event Signed(
    bytes16 signType,
    bytes sign
);

y tratando de configurarlo:

function addSignature(byte16 signType, bytes sign) {
    // ... store data
    ... = Sign(msg.sender, signType, sign) 
    // raise event
    Sign(signType, sign);
}

El problema de que no encuentro la forma de pasar bytesa la función desde Javascript.

Estoy usando Truffle e intenté seguir el código Javascript:

var type = web3.fromAscii('test', 16);
var sign = [0x12, 0x34]; //also tried web3.toBigNumber('0x1234');
contract.addSignature(type, sign, {from: myAccount, gas: 2000000});

realiza una transacción, pero no veo el valor correcto almacenado en mi contacto. Por ejemplo, al escuchar el Signedevento, veo que hay una matriz vacía. Si trato de leer datos, obtengo ceros (en realidad es más extraño, me signTypellenan con una gran variedad de ceros).

¿Cuál es una forma adecuada de usar una matriz de bytes arbitraria? caliente para enviar a contrato, cómo leer?

PD: estoy usando Truffle con TestRPC.

¿Lo intentaste simplemente var sign = '0x1234';? IIRC funcionó para mí, pero no usé Truffle o TestRPC.
Además, no sé por qué signType es, byte16pero para aislar sus problemas, intente decir uintprimero un signType: se rellena con ceros ya testque solo tiene 4 bytes, y está usando byte16.

Respuestas (1)

EDITAR: consulte Cómo pasar bytes arbitrarios a una función en Remix

Se cambió el comportamiento en Remix, así que vea arriba; lo siguiente fue para una versión anterior de Remix/browser-solidity.

Para pasar bytesa una función, pase los bytes como una cadena hexadecimal.

Ejemplo en Solidity Browser :

contract SimpleStorage {
    bytes storedData;
    function set(bytes x) {
        storedData = x;
    }
    function get() constant returns (bytes retVal) {
        return storedData;
    }
}

Haga clic en "Crear", luego en "Establecer" ingrese "0x1234" o cualquier cadena hexadecimal arbitraria.

Haga clic en "Establecer", luego en "Obtener" y verá sus datos, codificados de acuerdo con el ABI .

Esta respuesta ya no es correcta, consulte ethereum.stackexchange.com/questions/13483/…
De hecho, actualicé el título y la respuesta de la pregunta. No estoy seguro de la precedencia o la necesidad de marcar esto ahora como un duplicado.