¿Cuál es el nibble compartido de este nodo de extensión?

Tengo un nodo de extensión aquí:

Llave:

000b17906abb9f83c5e190bc3d0bed212e66bf44d99997c53c2071e1413194b6

Valor:

[

3866a6d45a815576000da23c1a017179233e9d6437806aef7c2264588739d0,

f84d80890159f20bed00f00000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f72333c927e7db2db7c7c7c4c6c6c4c6c4c6c6c6c6c6c6c4

]

El segundo valor de este nodo de extensión se puede decodificar usando RLP en este

Valor:

[

"",

0159f20cama00f00000,

56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421,

c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470,

]

¿Cuál es el nibble compartido de este nodo de extensión? ¿Dónde está el prefijo? Todo esto se discute en el documento amarillo y esperaba tener alguna aclaración sobre dónde encontrar estos valores al decodificar el byte [].

leíste eso: Patricia Tree ? Tal vez ayude. Estoy empezando a leerlo.
He leído el artículo sobre cómo se diseñan los intentos de Merkle Patricia. Ahora que tengo datos, esperaba que alguien pudiera ayudarme a darle un poco de sentido. Por lo general, me dirigen al papel amarillo o al wiki de ethereum. Pero estos recursos generalmente hablan sobre la tecnología en lugar de los datos sin procesar, por lo que esperaba que alguien pudiera ir un poco más allá al explicar lo que tengo aquí o lo que dice el artículo de Patricia Tree sobre "una bandera especial de 'terminator'" o "Un mordisco es adjunta a la clave que codifica tanto el estado del terminador como la paridad". Entonces, ¿el mordisco es 0?

Respuestas (1)

En primer lugar, este es el nodo de extensión de nota: esta es la hoja. Puede usar la función state._get_node_type() en Python para entender eso.

Si este nodo es realmente una extensión, debe verse así:

extension_node:[key,value]

, o porque el valor en los nodos de extensión = hash del siguiente nodo (generalmente el siguiente tipo de nodo es branch_node, pero puede ser leaf_nodesi tiene un tamaño mayor que no recuerda cuántos bits) este nodo se ve así:

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

Entonces, por eso, su representación no es buena en absoluto: parece que está en un lío, porque tiene:

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

En su ejemplo, solo ve el nodo en la base de datos donde la clave es hash en DB, valor: nodo guardado detrás de esa clave.

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

Entonces, echemos un vistazo al nodo:

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

Será interesante para usted , veamos mi propio blockchain en el nodo de hoja almacenado en DB por hash

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"

Entonces, este es el nodo hoja. Para entender qué es debemos saber que si miramos

  1. StateRoot: la clave del nodo será la billetera, el valor del nodo serán los datos sobre esa billetera
  2. TransactionRoot: la clave serán números enteros big-endian que representan el recuento de transacciones en el bloque actual

Entonces decodifique del valor de la hoja RLP:

[   '',
    '\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"
]

Tenemos información sobre la billetera:

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

Entonces, ¿dónde está Nibbles? Los nibbles se usan en las claves, por ejemplo, el nodo de hoja k y el nodo de extensión k, veámoslo:

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' ]

Cada clave empaquetada por RLP con nibbles (terminador y banderas impares). Pero si tenemos un nodo de extensión vinculado a la clave de hoja cortada guardada en el nodo de extensión. De lo contrario, cuando tenemos ambas claves, son solo un nibble más largo, como '0001' y '0005', que la clave para el nodo de rama en sí, el nibble final está codificado implícitamente por la posición (posiciones 1 (000_1) y 5 (000_5) ) de los nodos en el nodo de rama. Entonces, en ese caso, la clave compartida es [ '\x1b' ] = [ '1b' ] = '11011' para nuestra hoja.

Nuestra clave compartida que podemos decodificar a hexadecimal y ver por eso:

extension node key: [ '1b' ]

Después de eso podemos ver nuestros nibbles, para eso debemos usar 2 funciones de trie.py (pyethereum/ethereum):

without_terminator(nibbles)
unpack_to_nibbles(bindata)

Como eso:

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

También debe saber que nibbles es solo la mitad del byte (xxxxbbbb), para ver que necesita obtener el byte y buscarlo después de decodificarlo en bits. Vamos a hacer eso. Tenemos '1b', lo decodificamos en bits: '0001 1011', después de eliminar HexPrefix obtenemos '1011': esta es una clave compartida.

En su caso, la clave compartida no se almacena en ningún lugar aquí , pero debido a que 3866a6d45a815576000da23c1a017179233e9d6437806aef7c2264588739d0 - hoja de rama , consta de partes y se almacena en el valor clave de esa hoja y la posición del nodo de rama que mira esa hoja.

Cómo obtenemos los nibbles que puedes ver en trie.py en:

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

También veamos el nodo de extensión real . En este caso, obtuvimos extension_node que apunta a leaf_node. Entonces, la representación debe verse como (ejemplo de mi propia cadena de bloques):

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

Al obtener rama

state._decode_to_node(extension_node_v)

obtenemos el valor del nodo de rama de merkle:

[
    '',
    '\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',
    ''
]

Nodo guardado por hash

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

es nuestra hoja con billetera vista antes.