So übergeben Sie beliebige Bytes an eine Funktion (2016)

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, bytesvon 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 SignedEreignis 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 signTypemit 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.

Hast du es einfach versucht var sign = '0x1234';? IIRC hat bei mir funktioniert, aber ich habe weder Truffle noch TestRPC verwendet.
Ich weiß auch nicht, warum signType ist byte16, aber um Ihre Probleme zu isolieren, versuchen Sie es zuerst mit einem uintsignType: Es wird mit Nullen aufgefüllt, da testes nur 4 Bytes ist, und Sie verwenden byte16.

Antworten (1)

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

Diese Antwort ist nicht mehr korrekt, siehe ethereum.stackexchange.com/questions/13483/…
Tatsächlich habe ich den Titel und die Antwort der Frage aktualisiert. Ich bin mir nicht sicher, ob es Vorrang oder Notwendigkeit gibt, dies jetzt als Duplikat zu markieren.