So übergeben Sie beliebige Bytes an eine Funktion in Remix (2017)

Nach dieser Frage könnte ich einen einfachen Vertrag schreiben wie:

contract SimpleStorage {
  bytes input;
  function setInput(bytes enterBytes){
    input = enterBytes;
  }
}

Die Verwendung von „0x1234“ als Parameter in Remix „funktioniert nicht“ und speichert „0x307831323334“ im Speicherarray. Ändere ich den Code auf bytes2dann funktioniert alles wie gewollt mit dem gleichen Befehl. Wie kann ich dasselbe mit einem dynamischen Array tun?

contract SimpleStorage {
  bytes2 input;
  function setInput(bytes2 enterBytes){
    input = enterBytes;
  }
}
Ich denke, Eingabe und Ausgabe von Funktionen sollten im Remix konsistent sein. Daher habe ich dieses Problem eingereicht: github.com/ethereum/remix/issues/496

Antworten (2)

  1. Sie können Bytes-Parameter in Remix oder Browser-Solidity übergeben, da das Array aus einzelnen Bytes beispielsweise ["0x00","0xaa", "0xff"] äquivalent zu "0x00aaff" ist.
  2. Ich weiß nicht warum, aber die Remix-IDE und Browser-Solidity interpretieren "0xaabb11 ..." als Zeichenfolge. Für Entwicklungs- und Testzwecke im privaten oder Testnetz können Sie den folgenden Code verwenden. Die Funktion hexStrToBytes führt die Konvertierung durch. Sie können das Ergebnis verwenden, wie es in der Funktion setInputFromHex gezeigt wird

Code:

contract SimpleStorage 
{
    bytes input;

    function setInput(bytes enterBytes){
        input = enterBytes;
    }

    function getInput()
    returns (bytes)
    {
        return input;
    }

    function setInputFromHex(string hex_str)
    {
        input = hexStrToBytes(hex_str);
    }

    function hexStrToBytes(string hex_str) constant
    returns (bytes)
    {
        //Check hex string is valid
        if (bytes(hex_str)[0]!='0' ||
            bytes(hex_str)[1]!='x' ||
            bytes(hex_str).length%2!=0 ||
            bytes(hex_str).length<4)
            {
                throw;
            }

        bytes memory bytes_array = new bytes((bytes(hex_str).length-2)/2);

        for (uint i=2;i<bytes(hex_str).length;i+=2)
        {
            uint tetrad1=16;
            uint tetrad2=16;

            //left digit
            if (uint(bytes(hex_str)[i])>=48 &&uint(bytes(hex_str)[i])<=57)
                tetrad1=uint(bytes(hex_str)[i])-48;

            //right digit
            if (uint(bytes(hex_str)[i+1])>=48 &&uint(bytes(hex_str)[i+1])<=57)
                tetrad2=uint(bytes(hex_str)[i+1])-48;

            //left A->F
            if (uint(bytes(hex_str)[i])>=65 &&uint(bytes(hex_str)[i])<=70)
                tetrad1=uint(bytes(hex_str)[i])-65+10;

            //right A->F
            if (uint(bytes(hex_str)[i+1])>=65 &&uint(bytes(hex_str)[i+1])<=70)
                tetrad2=uint(bytes(hex_str)[i+1])-65+10;

            //left a->f
            if (uint(bytes(hex_str)[i])>=97 &&uint(bytes(hex_str)[i])<=102)
                tetrad1=uint(bytes(hex_str)[i])-97+10;

            //right a->f
            if (uint(bytes(hex_str)[i+1])>=97 &&uint(bytes(hex_str)[i+1])<=102)
                tetrad2=uint(bytes(hex_str)[i+1])-97+10;

            //Check all symbols are allowed
            if (tetrad1==16 || tetrad2==16)
                throw;

            bytes_array[i/2-1]=byte(16*tetrad1+tetrad2);
        }

        return bytes_array;
    }
}
Dies hängt nur mit der Aufschrift "warten, um abgebaut zu werden" auf. Es kann sein, dass mein Bytes-String zu lang ist
@ZMitton Wenn Sie etwas in der Blockchain speichern müssen, z. B. wenn Sie setInputFromHex ausführen , benötigen Sie einen Mining-Prozess. Es ist nicht das Problem dieses Vertrages - es ist die Regel. Wenn Sie an Ihrem eigenen Knoten arbeiten, beginnen Sie mit dem Mining. Die Funktion hexStrToBytes benötigt keinen Mining-Prozess (Code wurde bereits bearbeitet).
Ich habe das Kopfgeld basierend auf Lösung 1 vergeben. Dies löst das Problem der Eingabe von Bytes aus Remix/Browser-Solidity. Danke
@ZMitton Könnten Sie die Antwort bitte als "beantwortet" markieren?
Wenn jemand eine schnelle Möglichkeit zum Debuggen benötigt, habe ich dieses kleine Hilfsprogramm erstellt, um es schneller zu machen: Zufallsbytegenerator für Remix

Nehmen wir an, ich habe eine Funktion, deren Eingabeparameter ist

bytes32

bytes32[ ] // array of type bytes 32

uint8

das sieht aus wie:

 function abc(bytes32 id, bytes32[ ] name,uint8 version) returns(bool)
    {  
        //
    }

Um die Funktion (mit Remix) zu provozieren, müssen Sie nun Parameter übergeben, die wie folgt aussehen:

"0x12",["0x1262","0x12","0x12"],8
Aber wenn wir diese Funktion innerhalb des Vertrags aufrufen. Können wir dann " " im Bytes-Feld übergeben?????
Ich bin verwirrt darüber, dass ich kein Byte [] zum Remixen weitergeben kann. Ich habe alles versucht, auch das, was Sie oben vorgeschlagen haben.