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 bytes
a 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 Signed
evento, veo que hay una matriz vacía. Si trato de leer datos, obtengo ceros (en realidad es más extraño, me signType
llenan 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.
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 bytes
a 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 .
ética
var sign = '0x1234';
? IIRC funcionó para mí, pero no usé Truffle o TestRPC.ética
byte16
pero para aislar sus problemas, intente deciruint
primero un signType: se rellena con ceros yatest
que solo tiene 4 bytes, y está usandobyte16
.