Was ist das gemeinsam genutzte Nibble dieses Erweiterungsknotens?

Ich habe hier einen Erweiterungsknoten:

Taste:

000b17906abb9f83c5e190bc3d0bed212e66bf44d99997c53c2071e1413194b6

Wert:

[

3866a6d45a815576000da23c1a017179233e9d6437806aef7c2264588739d0,

f84d80890159f20bed00f00000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470,

]

Dieser zweite Wert des Erweiterungsknotens kann unter Verwendung von RLP in diesen decodiert werden

Wert:

[

"",

0159f20bett00f00000,

56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421,

c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470,

]

Was ist das gemeinsam genutzte Nibble dieses Erweiterungsknotens? Wo ist das Präfix? Dies wird alles im gelben Papier diskutiert, und ich hatte gehofft, eine Klärung darüber zu erhalten, wo diese Werte zu finden sind, wenn das Byte [] tatsächlich decodiert wird.

hast du das gelesen: Patricia Tree ? Vielleicht hilft es. Ich fange gerade an, es zu lesen.
Ich habe den Artikel darüber gelesen, wie Merkle Patricia Trials aufgebaut sind. Jetzt, da ich Daten habe, hatte ich gehofft, jemand könnte mir helfen, ein wenig Sinn daraus zu machen. Normalerweise werde ich auf das gelbe Papier oder das Ethereum-Wiki verwiesen. Aber diese Ressourcen sprechen normalerweise über die Technologie anstelle der Rohdaten, also hoffte ich, dass jemand etwas weiter gehen könnte, um zu erklären, was ich hier habe oder was der Artikel von Patricia Tree über „ein spezielles ‚Terminator‘-Flag“ oder „ein Knabbern“ spricht an den Schlüssel angehängt, der sowohl den Abschlussstatus als auch die Parität codiert." Also ist das Knabbern 0?

Antworten (1)

Zuallererst ist dies der Notenerweiterungsknoten - das ist Blatt. Sie können die Funktion state._get_node_type() in Python verwenden, um das zu verstehen.

Wenn dieser Knoten wirklich eine Erweiterung ist, muss er so aussehen:

extension_node:[key,value]

, oder weil Wert in Erweiterungsknoten = Hash des nächsten Knotens (normalerweise ist der Typ des nächsten Knotens branch_node, aber es kann sein, leaf_nodedass er größer ist und sich nicht daran erinnert, wie viele Bits) dieser Knoten so aussieht:

extension_node:[key,hash_of_branch_node]
// or
extension_node:[key,hash_of_leaf_node]

Damit ist Ihre Darstellung überhaupt nicht gut - sieht aus, als wären Sie in ein Durcheinander geraten, weil Sie Folgendes haben:

some_node:[key,data]
// or
leaf_node:[key,data]

In Ihrem Beispiel sehen Sie nur einen Knoten in der Datenbank, bei dem der Schlüssel ein Hash in der DB ist, Wert - der Knoten, der hinter diesem Schlüssel gespeichert ist.

Key   = hash in LevelDB =
      = 000b17906abb9f83c5e190bc3d0bed212e66bf44d99997c53c2071e1413194b6
Value = node of merkle tree =
      = [
            3866a6d45a815576000da23c1a017179233e9d6437806aef7c2264588739d0,
            f84d80890159f20bed00f00000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
        ]

Schauen wir uns also den Knoten an:

node k = merkle tree node key =
       = 3866a6d45a815576000da23c1a017179233e9d6437806aef7c2264588739d0
node v = merkle tree node value =
       = data = info about wallet which encoded in node k
       = f84d80890159f20bed00f00000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

Es wird für Sie interessant sein , schauen wir uns meine eigene Blockhain am Blattknoten an, die per Hash in der DB gespeichert ist

f44517e043e683d6c64eb208107b67db33051664f3350f1107f674365402d4b2

leaf node (hash in DB) : f44517e043e683d6c64eb208107b67db33051664f3350f1107f674365402d4b2
leaf node (value in DB): [
                            '4{\xaerrz\x9e\x8b~\x9f\xc8\xc2.i\x03E\x17\x93g\x91_}lW\xc4>L\x86:\xe4\x8b' ,
                            "\xf8^\x80\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
                             x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0V\xe8\x1f\x17\x1b\xccU\xa6\xff\
                             x83E\xe6\x92\xc0\xf8n[H\xe0\x1b\x99l\xad\xc0\x01b/\xb5\xe3c\xb4!\xa0\xc5\xd2F\
                             x01\x86\xf7#<\x92~}\xb2\xdc\xc7\x03\xc0\xe5\x00\xb6S\xca\x82';{\xfa\xd8\x04]\x85\xa4p"
                         ]
leaf node k: '4{\xaerrz\x9e\x8b~\x9f\xc8\xc2.i\x03E\x17\x93g\x91_}lW\xc4>L\x86:\xe4\x8b'
leaf node v: "\xf8^\x80\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
              x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0V\xe8\x1f\x17\x1b\xccU\xa6\xff\
              x83E\xe6\x92\xc0\xf8n[H\xe0\x1b\x99l\xad\xc0\x01b/\xb5\xe3c\xb4!\xa0\xc5\xd2F\
              x01\x86\xf7#<\x92~}\xb2\xdc\xc7\x03\xc0\xe5\x00\xb6S\xca\x82';{\xfa\xd8\x04]\x85\xa4p"

Das ist also ein Blattknoten. Um zu verstehen, was es ist, müssen wir das wissen, wenn wir es betrachten

  1. StateRoot: Schlüssel des Knotens ist Brieftasche, Wert des Knotens sind Daten über diese Brieftasche
  2. TransactionRoot: Schlüssel sind Big-Endian-Ganzzahlen, die die Transaktionsanzahl im aktuellen Block darstellen

Decodieren Sie also aus dem RLP-Blattwert:

[   '',
    '\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
    'V\xe8\x1f\x17\x1b\xccU\xa6\xff\x83E\xe6\x92\xc0\xf8n[H\xe0\x1b\x99l\xad\xc0\x01b/\xb5\xe3c\xb4!',
    "\xc5\xd2F\x01\x86\xf7#<\x92~}\xb2\xdc\xc7\x03\xc0\xe5\x00\xb6S\xca\x82';{\xfa\xd8\x04]\x85\xa4p"
]

Wir haben Informationen über Wallet:

[   '',
    '0100000000000000000000000000000000000000000000000000',
    '56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
    'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'
]

Also, wo ist Knabbereien? Nibbles werden in Schlüsseln verwendet, z. B. Blattknoten k und Erweiterungsknoten k, schauen wir uns das an:

extension node key: [ '\x1b' ]
leaf node key     : [ '4{\xaerrz\x9e\x8b~\x9f\xc8\xc2.i\x03E\x17\x93g\x91_}lW\xc4>L\x86:\xe4\x8b' ]

Jeder Schlüssel wird von RLP mit Nibbles (Terminator und ungerade Flags) gepackt. Aber wenn wir einen Erweiterungsknoten haben, der mit einem blattgeschorenen Schlüssel verknüpft ist, der im Erweiterungsknoten gespeichert ist. Andernfalls, wenn wir haben, dass beide Schlüssel nur ein Nibble länger sind, wie z. ) der Knoten im Verzweigungsknoten. In diesem Fall ist der gemeinsame Schlüssel also [ '\x1b' ] = [ '1b' ] = '11011' für unser Blatt.

Unseren gemeinsamen Schlüssel können wir in Hex decodieren und dadurch sehen:

extension node key: [ '1b' ]

Danach können wir unsere Nibbles sehen, dafür müssen wir 2 Funktionen von trie.py (pyethereum/ethereum) verwenden:

without_terminator(nibbles)
unpack_to_nibbles(bindata)

So wie das:

without_terminator(unpack_to_nibbles('1b')) = 11 = our key without nibbles (HexPrefix)

Außerdem müssen Sie wissen, dass Nibbles nur die Hälfte von Byte (xxxxbbbb) sind, um zu sehen, dass Sie Byte abrufen und nach der Dekodierung in Bits danach suchen müssen. Lass uns das tun. Wir haben '1b', decodieren Sie es in Bits: '0001 1011', nach dem Entfernen von HexPrefix erhalten wir '1011' - das ist unser gemeinsamer Schlüssel.

In Ihrem Fall wird der gemeinsame Schlüssel hier nirgendwo gespeichert , aber weil 3866a6d45a815576000da23c1a017179233e9d6437806aef7c2264588739d0 - Blatt des Zweigs , besteht er aus Teilen und wird im Schlüsselwert dieses Blatts und der Zweigknotenposition gespeichert, die dieses Blatt betrachten.

Wie wir Knabbereien erhalten, können Sie in trie.py sehen in:

pack_nibbles(nibbles)
without_terminator(nibbles)
unpack_to_nibbles(bindata)

Sehen wir uns auch den echten Erweiterungsknoten an . In diesem Fall haben wir extension_node, die auf leaf_node zeigen. Die Darstellung muss also so aussehen (Beispiel aus meiner eigenen Blockchain):

extension node (hash in DB) : [ 'bac02ec3c4fa5a468f711a626a42a23b32031fb9bc9255ed27a428dabee61544']
extension node (value in DB): [ '\x1b', ''e\x96K\x85n\xf0k[\xe4\x19\x9bI\xf2\xc1\x06E\x82E\x80Y\x8b6\x90\xf8\x13\x8d\xdc@S?\x12F'']
    extension node k (value in DB): [ '\x1b' ] <<-key packed by RLP with nibbles (terminator and odd flags)
    extension node v (value in DB): [ '65964b856ef06b5be4199b49f2c10645824580598b3690f8138ddc40533f1246' ] <<-encoded ranch node to hex

Indem man Zweig bekommt

state._decode_to_node(extension_node_v)

wir erhalten den Merkle-Zweigknotenwert:

[
    '',
    '\xf4E\x17\xe0C\xe6\x83\xd6\xc6N\xb2\x08\x10{g\xdb3\x05\x16d\xf35\x0f\x11\x07\xf6t6T\x02\xd4\xb2',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '',
    '\x00\xa4\xe2/Dk-!\x05\x19H\xa6\x04\xd4\xc0\xf1&<\xb5&m\xc4f\xdd\xb7\xa6\xd6\x8c\xe1U<\x18',
    ''
]

Knoten durch Hash gespeichert

'\xf4E\x17\xe0C\xe6\x83\xd6\xc6N\xb2\x08\x10{g\xdb3\x05\x16d\xf35\x0f\x11\x07\xf6t6T\x02\xd4\xb2'

ist unser Blatt mit Geldbörse schon mal zu sehen.