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 [].
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_node
si 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
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.
Gudsaf
Fortuna