Ich versuche, einen Vertrag zu implementieren, der Bytes Blob speichert, ein dynamisches Bytes-Array.
Zum Beispiel habe ich folgende Struktur:
Sign {
address signer;
bytes16 signType;
bytes sign;
}
plus eine Veranstaltung:
event Signed(
bytes16 signType,
bytes sign
);
und versuche es einzustellen:
function addSignature(byte16 signType, bytes sign) {
// ... store data
... = Sign(msg.sender, signType, sign)
// raise event
Sign(signType, sign);
}
Das Problem, dass ich keinen Weg finden kann, bytes
von Javascript an die Funktion zu übergeben.
Ich verwende Truffle und habe folgenden Javascript-Code ausprobiert:
var type = web3.fromAscii('test', 16);
var sign = [0x12, 0x34]; //also tried web3.toBigNumber('0x1234');
contract.addSignature(type, sign, {from: myAccount, gas: 2000000});
Es führt eine Transaktion durch, aber ich sehe keinen korrekten Wert, der in meinem Kontakt gespeichert ist. Wenn ich zum Beispiel auf das Signed
Ereignis höre, sehe ich, dass es ein leeres Array gibt. Wenn ich versuche, Daten zu lesen, bekomme ich Nullen (eigentlich ist es seltsamer, ich werde signType
mit einer langen Reihe von Nullen aufgefüllt).
Was ist ein richtiger Weg, um ein beliebiges Byte-Array zu verwenden? heiß zum Vertrag senden, wie lesen?
PS Ich verwende Truffle mit TestRPC.
BEARBEITEN: Siehe So übergeben Sie beliebige Bytes an eine Funktion in Remix
Das Verhalten in Remix wurde geändert, siehe oben; Folgendes war für eine ältere Version von Remix / Browser-Solidity.
Um bytes
an eine Funktion zu übergeben, übergeben Sie die Bytes als Hex-String.
Beispiel im Solidity-Browser :
contract SimpleStorage {
bytes storedData;
function set(bytes x) {
storedData = x;
}
function get() constant returns (bytes retVal) {
return storedData;
}
}
Klicken Sie auf „Create“ und geben Sie bei „Set“ „0x1234“ oder eine beliebige Hex-Zeichenfolge ein.
Klicken Sie auf „Setzen“, dann auf „Get“ und Sie sehen Ihre Daten, verschlüsselt nach ABI .
eth
var sign = '0x1234';
? IIRC hat bei mir funktioniert, aber ich habe weder Truffle noch TestRPC verwendet.eth
byte16
, aber um Ihre Probleme zu isolieren, versuchen Sie es zuerst mit einemuint
signType: Es wird mit Nullen aufgefüllt, datest
es nur 4 Bytes ist, und Sie verwendenbyte16
.