Konvertierung von Uint in Bytes32 - wie macht das Sinn [duplizieren]

Ziemlich einfacher Code hier:

pragma solidity ^0.4.13;

contract Oracle{
    event Print(string _name, bytes32 _value);
    bytes32 key;

    function Store(bytes32 _key) returns (bytes32) {
        key = _key;
        Print("Key",_key);
        return _key;
    }

}

Jetzt versuche ich, den Wert 1 als Schlüssel zu speichern.

Mit Remix,

entered key: 1
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

entered key: "0x01"
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

Jetzt ein seltsames:

entered key: "0x1"
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

Und auch seltsam:

entered key: "1"
printed key: 0x3100000000000000000000000000000000000000000000000000000000000000

Und auch super seltsam ... wenn Sie NodeJS verwenden, um eine Rohtransaktion zu pushen:

Entered:1
Printed key: 0x1000000000000000000000000000000000000000000000000000000000000000

Die Frage also, warum geben mir "0x1" und "0x01" und 1 alle die gleiche Antwort auf Remix und nicht auf Knoten? Und warum ist 1 in Anführungszeichen etwas anderes?

Antworten (1)

Nach deinen Beispielen:

eingegebener Schlüssel: 1 gedruckter Schlüssel: 0x0100000000000000000000000000000000000000000000000000000000000

Bytes werden als Array von 256-Bit-Werten gespeichert (in Ihrem Fall mit einer Größe von 32 Bytes), sodass Sie den Wert von uint 1 im ersten Byte des Arrays speichern, das einfach 0x01 ist, und der Rest des Arrays ist null.

eingegebener Schlüssel: "0x01" gedruckter Schlüssel: 0x01000000000000000000000000000000000000000000000000000000000000

In Solidity wird "0x01" in sein String-Äquivalent umgewandelt, da es sich um einen gültigen Hex-Wert für eine 256-Bit-Uint handelt

eingegebener Schlüssel: "0x1" gedruckter Schlüssel: 0x0100000000000000000000000000000000000000000000000000000000000

Dasselbe wie oben, da 0x01 dasselbe wie 0x1 ist, genau wie 0x001 und 0x000001, sie alle den ganzzahligen Wert von 1 haben

eingegebener Schlüssel: "1" gedruckter Schlüssel: 0x31000000000000000000000000000000000000000000000000000000000000

Dies ist der ASCII-Hex-Wert der Zeichenfolge "1", die 0x31 ist

Eingegeben: 1 Gedruckter Schlüssel: 0x100000000000000000000000000000000000000000000000000000000000

Ich habe es noch nie mit NodeJS versucht, daher kann ich diese Frage leider nicht beantworten. Ich hoffe, ich habe Ihre anderen Fragen trotzdem beantwortet.

Danke James, gute Sache. Es ist etwas ärgerlich, seltsam für das nicht vertraute bisschen, aber zumindest macht es jetzt ein bisschen mehr Sinn