Continuando con los posts anteriores explorando la base de datos levelDB de Ethereum (ver Ethereum: explorando base de datos leveldb, donde se explora el State Trie y Ethereum Blockchain privada, Ethereum y LevelDB: Leer, Modificar y Compilar Geth donde se ve el entorno de una red privada y más) veremos con detalle qué ocurre con la creación de un smart contract del tipo token ERC20 y con una transferencia de esos tokens entre dos cuentas, y estudiaremos de nuevo el State Trie y el Storage Trie, particularmente para el Smart Contract.
Partimos de la blockchain privada Ethereum con dos nodos validadores que hemos creado en los posts anteriores. Para facilitar las cosas, necesitamos más herramientas, que podemos configurar también en un entorno windows portable.
Entorno windows portable
A las herramientas que teníamos en el post anterior (Go, Mingw y Git) añadimos:
- Remix, para desarrollar y desplegar smart contracts con el lenguaje solidity, podemos usar la versión web https://remix.ethereum.org/ o bien descargarnos la versión de escritorio, si no queremos instalarla bastará con el zip (y descomprimirlo) https://github.com/ethereum/remix-desktop/releases
- NodeJS, que permite incorporar y ejecutar muchas herramientas, entre ellas un explorador de bloques local para nuestra red privada. Basta descargarse el archivo zip comprimido de https://nodejs.org/en/download/, descomprimirlo y añadir la ruta del ejecutable al path (incluyendo por ejemplo en el archivo bat que usamos en los posts anteriores):
[ ... ] set nodePATH=%~dp0nodejs\ set path=%PATH%;%gccPATH%;%goPATH%;%gitPATH%;%nodePATH%
- Expedition: Explorador local de bloques, es muy sencilla su instalación https://www.quicknode.com/guides/infrastructure/how-to-run-the-expedition-block-explorer-for-ethereum, https://github.com/xops/expedition#configurations
Blockchain Ethereum privada
Arracamos la blockchain privada como vimos en el post anterior. No obstante, en este he modificado el bloque génesis para que los fondos de la cuenta en el inicio sea un número razonable, simplemente cambiando los valores para ello (posteriormente efectué una transacción para tener el mismo estado que en el post anterior):
"alloc": { "598b65946815ae60c68ec34d747bae6d16690287": { "balance": "50000000000000000000" } },
Repetimos el proceso de arrancar ambos nodos en el mismo pc, con diferentes instancias de geth y cada una con su propia carpeta y puertos. Adicionalmente, para poder usar el explorador de bloques local Expedition, en el primer nodo tenemos que añadir más parámetros a geth para permitir la conexión por rcp/http que el servidor web Expedition y Remix necesitan (permitiremos CORS para cualquier dominio a sabiendas que esto no es seguro ni aconsejable, pero estamos en un entorno de pruebas y solo es para simplificar el comando, tendríamos que usar únicamente el dominio que permitimos que se nos conecte al nodo) y también permitir desbloquear la cuenta validadora con http habilitado añadiendo las opciones: --http --allow-insecure-unlock –http.corsdomain “*”
:
Primer nodo (lanzado desde una consola powershell o cmd, he comprobado que con la de git-bash ni Remix ni Expedition pueden conectarse por http/rpc al nodo)
./geth.exe --datadir eth_network --networkid 888 --port 30304 --http --allow-insecure-unlock --http.corsdomain “*” --nat extip:127.0.0.1 --unlock 0x598b65946815ae60c68ec34d747bae6d16690287 --mine --nodiscover --syncmode full
El segundo nodo:
./geth.exe --datadir eth_network2 --networkid 888 --port 30305 --authrpc.port 8552 --ipcdisable --unlock 0x347438f5a3d26e224ca448b05e932566923ece0d --mine --bootnodes "enode://e8021593007ca294dc66437fda9743f025610b210e4e0039a04596b7c981cbdc4dae556c900c530c8a032be06ec943309abf66b4585e3c5c72a702c5f3ddc4d8@127.0.0.1:30304?discport=30304" --syncmode full
Conectar el explorador de bloques local Expedition
Basta ejecutar una consola de comandos (o powershell o git-bash), ir al directorio donde lo hemos descargado y ejecutar npm start, que iniciará el servidor web, y por defecto se nos conectará a la testnet de Ethereum, basta con indicarle la dirección correcta de nuestro nodo, poniendo en el navegador la url:
http://localhost:3000/?rpcUrl=http://127.0.0.1:8545
El explorador de bloques viene bien para tener a mano más fácilmente valores de transacciones, hashes, etc
Conectar el entorno de desarrollo solidity Remix, desplegar el smart contract ERC20 y efectuar una transacción de tokens
Es sencillo conectar Remix al nodo local (que tiene que estar ejecutándose obviamente). Basta con ir al menú hom/environment y seleccionar External Http Provider, por defecto usará la conexión a nuestro nodo geth (localhost y puerto 8545 por defecto de http en geth, pues no lo hemos modificado al ejecutar el nodo) y además nos avisa de cómo tenemos que lanzar correctamente la ejecución del nodo y CORS
Con eso tendremos ya conectado remix y nos aparecerá la cuenta que tiene almacenada este nodo en su carpeta keystore (de momento sólo la validadora que creamos en el bloque génesis con su balance en Ether, que en esta prueba hemos modificado por un valor más normal de 50 ether, de los que hicimos una transferencia a otra cuenta de 0.005 ether)
Con el entorno funcionando usamos un contrato ERC20 típico de internet, p.ej. el que muestra Ethereum es su web https://ethereum.org/es/developers/tutorials/understand-the-erc-20-token-smart-contract/ pero modificaremos los valores del nombre y del Token, sus decimales y el cantidad total de tokens
pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract ERC20Basic is IERC20 { string public constant name = "My ERC20Basic"; string public constant symbol = "myERC"; uint8 public constant decimals = 3; mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed; uint256 totalSupply_ = 10; constructor() { balances[msg.sender] = totalSupply_; } function totalSupply() public override view returns (uint256) { return totalSupply_; } function balanceOf(address tokenOwner) public override view returns (uint256) { return balances[tokenOwner]; } function transfer(address receiver, uint256 numTokens) public override returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender]-numTokens; balances[receiver] = balances[receiver]+numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; } function approve(address delegate, uint256 numTokens) public override returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; } function allowance(address owner, address delegate) public override view returns (uint) { return allowed[owner][delegate]; } function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner]-numTokens; allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens; balances[buyer] = balances[buyer]+numTokens; emit Transfer(owner, buyer, numTokens); return true; } }
Para desplegar el contrato copiamos el código en Remix, lo compilamos y lo desplegamos con la cuenta que tenemos en el nodo, puesto que el contrato no tiene ninguna función payable, el valor de la transacción para desplegar el contrato ha de ser nulo (es decir, no enviamos ether al contrato, porque no nos lo está requiriendo)
Remix indica un error en la estimación del gas, pero es indiferente (veremos el resultado de la transacción exitosa en su recuadro de log) y el contrato se despliega en la siguiente dirección: 0x384FdC54BE04bfB947F7Ac1cCC0DA2C231c0CBA1
Ahora la cuenta que ha creado el contrato tiene todos los tokens (10) y efectuamos una transacción de 3 tokens a otra cuenta, d00411828e14f75b0bada0d5173974e945158615 (la misma a la que transferimos los 0.005 ether), todo desde Remix, algo muy sencillo (de nuevo sin enviar ehter en la transacción, campo Value=0):
Ahora paramos los nodos de nuestra blockchain y exploramos los resultados y la base de datos leveldb.
Para analizar los datos de una transacción a un Smart Contract es necesario conocer su interface ABI, y también nos interesa saber el código bytecode del contrato, que es lo que ejecutara la máquina virtual Ehtereum (EVM) y se almacena tal cual en la leveldb como veremos. Remix proporciona ambos desde su pantalla:
El explorador de bloque local nos permite ver y analizar ambas transacciones de creación del Smart Contract y de transferencia de tokens
Por ejemplo podemos comprobar que el input de la transacción de creacción del smart contract es precisamente el bytecode (obtenido desde Remix)
Por último podemos analizar los detalles de la transacción de transferencia de tokens, que para decodificar hace falta el ABI del smart contract:
Para decodificar el input, podemos usar p.ej la sigueinte web https://lab.miguelmota.com/ethereum-input-data-decoder/example/, introduciendo el ABI de nuestro contrato y el input de la transacción, copiado p.ej. del explorador de bloques local, que nos decodifica la cuenta receptora y la cantidad de 3 tokens.
State Trie
El análisis es idéntico al del post anterior Ethereum: explorando base de datos leveldb. Volcamos la base de datos leveldb completa con el script de ese post, cuyo resultado es el siguiente:
Key: 03b1feb6171ae67a69649d8e798fc17814462426c4a8a08fb372449d93222f02 Value: f872a02064245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8cb84ff84d048902b5d1eb9d79a78000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 Key: 0f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c Value: f870a0201147d14a9d46c37d277394cc51442ea6f10bfe350b8f0a4f7a8049172432a2b84df84b808711c37937e08000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 Key: 21dc63cbdd41e1f68b7f355d7a4588defcefaf4fb9e32b6f35c1306f5e9a398b Value: f872a02064245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8cb84ff84d018902b5d1eb9d79a78000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 Key: 23a72d53272ad8d7966d816a35a7d7addced061b8bdf656df9e77200f62052af Value: f869a036dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4b846f8440180a02e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cda03f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802 Key: 2e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cd Value: f87180808080a0638710aa86ab306a883e718bb5fe52128a4a90abf9679d3e0a97c1f3592cb0c0a057eeaffc3c39066751e494ddd3a2b4bab6a4350a04398dac1e57cf3e279a089b8080a087225f605d9d6d9d122cfc389f77268c144f21a11ef2b0763a1702e80cbf53948080808080808080 Key: 446174616261736556657273696f6e Value: 08 Key: 482547a8e05b6173ddc33a1c376390d433ffe090591ecdef79904029e20d9e9c2a Value: 0000000000000001 Key: 484613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Value: 0000000000000015 Key: 484a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0e Value: 000000000000000a Key: 484c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d5 Value: 000000000000000e Key: 48538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce2 Value: 0000000000000010 Key: 4855848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d0619 Value: 0000000000000002 Key: 4862cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f48 Value: 000000000000000c Key: 486b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1e Value: 000000000000000f Key: 486ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f32 Value: 000000000000000b Key: 487210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245c Value: 0000000000000013 Key: 4883ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Value: 0000000000000000 Key: 4886c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c86 Value: 0000000000000012 Key: 488725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e4 Value: 0000000000000001 Key: 4890db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be80 Value: 0000000000000005 Key: 4890f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049df Value: 0000000000000008 Key: 48958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae1 Value: 0000000000000007 Key: 489eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb181 Value: 0000000000000011 Key: 48a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9 Value: 0000000000000014 Key: 48a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b0 Value: 0000000000000004 Key: 48ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f5 Value: 0000000000000003 Key: 48b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487c Value: 0000000000000006 Key: 48c492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac1 Value: 000000000000000d Key: 48d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb443578 Value: 0000000000000009 Key: 4a138167e7404c69d755c6cf77847ca12d0a0ef69f1af5750dfd515375bf4fa2 Value: f869a036dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4b846f8440180a07ed0c64dc405876b5da2a2f60bf0afb614b690282e8407eaf3039eeb0de588d6a03f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802 Key: 4c617374426c6f636b Value: 4613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Key: 4c61737446617374 Value: 4613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Key: 4c617374486561646572 Value: 4613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Key: 52739b5a84cb6c567714850671716a8a3057d70cdc84a52f2e58d2ba21881de5 Value: f8518080a08f96128efe45d3af66806fff83ec3777e12666c7473aa4716d27f1b4627f7f5d8080808080a00f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c8080808080808080 Key: 536e617073686f7447656e657261746f72 Value: c6800180808080 Key: 536e617073686f744a6f75726e616c Value: 80a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea0da73a3004622ded0dd20bb0b1b729fa96a65f76b9f9f04877b9356045c724319c0f860eea0c81147d14a9d46c37d277394cc51442ea6f10bfe350b8f0a4f7a8049172432a28ccb808711c37937e080008080f0a0c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c8ecd018902b5d1eb9d79a780008080c0a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39ac0f1f0a0c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c8ecd028902b5d1eb9d79a780008080c0a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564c0f89cf0a0c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c8ecd038902b5d1eb9d79a780008080f869a006dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4b846f8440180a07ed0c64dc405876b5da2a2f60bf0afb614b690282e8407eaf3039eeb0de588d6a03f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802f86af868a006dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4f842a0841c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219ea0405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acec20a0aa0b2b06573c7057e49de5bd65474aca454aa50cc0f9b6713256f24bcd24629c471c0f89cf0a0c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c8ecd048902b5d1eb9d79a780008080f869a006dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4b846f8440180a02e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cda03f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802f86af868a006dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4f842a0526fab3158aeeb350abedb294d68cbe170d310a0e6dbed58e14861d2f3e131c7a0841c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219ec20307 Key: 536e617073686f74526f6f74 Value: fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788e Key: 5472616e73616374696f6e496e6465785461696c Value: 0000000000000000 Key: 57eeaffc3c39066751e494ddd3a2b4bab6a4350a04398dac1e57cf3e279a089b Value: e2a0326fab3158aeeb350abedb294d68cbe170d310a0e6dbed58e14861d2f3e131c703 Key: 61c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c Value: cd808902b5e3af16b18800008080 Key: 62000000000000000083ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Value: c2c0c0 Key: 6200000000000000012547a8e05b6173ddc33a1c376390d433ffe090591ecdef79904029e20d9e9c2a Value: c2c0c0 Key: 6200000000000000018725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e4 Value: c2c0c0 Key: 62000000000000000255848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d0619 Value: c2c0c0 Key: 620000000000000003ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f5 Value: c2c0c0 Key: 620000000000000004a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b0 Value: c2c0c0 Key: 62000000000000000590db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be80 Value: f871f86ef86c80843b9aca0082520894d00411828e14f75b0bada0d5173974e9451586158711c37937e0800080820635a0f0c60af579d7b04f8185918e094d9b20ec8941742b8e9945de3961cee6180b71a0014f70b7f8c7f58cf5b5b0cf718f4be7a883dddab1f23ea34aa864e64df4151fc0 Key: 620000000000000006b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487c Value: c2c0c0 Key: 620000000000000007958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae1 Value: c2c0c0 Key: 62000000000000000890f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049df Value: c2c0c0 Key: 620000000000000009d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb443578 Value: f90e1ef90e1af90e1701843b9aca00832dc6c080832dc6c0b90dc06080604052600a60025534801561001557600080fd5b506002546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610d568061006a6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad9190610b27565b60405180910390f35b6100d060048036038101906100cb9190610a66565b610239565b6040516100dd9190610b0c565b60405180910390f35b6100ee61032b565b6040516100fb9190610b49565b60405180910390f35b61011e60048036038101906101199190610a13565b610335565b60405161012b9190610b0c565b60405180910390f35b61013c61069b565b6040516101499190610b64565b60405180910390f35b61016c600480360381019061016791906109a6565b6106a0565b6040516101799190610b49565b60405180910390f35b61018a6106e8565b6040516101979190610b27565b60405180910390f35b6101ba60048036038101906101b59190610a66565b610721565b6040516101c79190610b0c565b60405180910390f35b6101ea60048036038101906101e591906109d3565b6108f5565b6040516101f79190610b49565b60405180910390f35b6040518060400160405280600d81526020017f4d7920455243323042617369630000000000000000000000000000000000000081525081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103199190610b49565b60405180910390a36001905092915050565b6000600254905090565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561038257600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561040b57600080fd5b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546104559190610bf1565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461051f9190610bf1565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105e99190610b9b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106889190610b49565b60405180910390a3600190509392505050565b600381565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040518060400160405280600581526020017f6d7945524300000000000000000000000000000000000000000000000000000081525081565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561076e57600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107b89190610bf1565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108449190610b9b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108e39190610b49565b60405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008135905061098b81610cf2565b92915050565b6000813590506109a081610d09565b92915050565b6000602082840312156109bc576109bb610cdc565b5b60006109ca8482850161097c565b91505092915050565b600080604083850312156109ea576109e9610cdc565b5b60006109f88582860161097c565b9250506020610a098582860161097c565b9150509250929050565b600080600060608486031215610a2c57610a2b610cdc565b5b6000610a3a8682870161097c565b9350506020610a4b8682870161097c565b9250506040610a5c86828701610991565b9150509250925092565b60008060408385031215610a7d57610a7c610cdc565b5b6000610a8b8582860161097c565b9250506020610a9c85828601610991565b9150509250929050565b610aaf81610c37565b82525050565b6000610ac082610b7f565b610aca8185610b8a565b9350610ada818560208601610c7a565b610ae381610ce1565b840191505092915050565b610af781610c63565b82525050565b610b0681610c6d565b82525050565b6000602082019050610b216000830184610aa6565b92915050565b60006020820190508181036000830152610b418184610ab5565b905092915050565b6000602082019050610b5e6000830184610aee565b92915050565b6000602082019050610b796000830184610afd565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610ba682610c63565b9150610bb183610c63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610be657610be5610cad565b5b828201905092915050565b6000610bfc82610c63565b9150610c0783610c63565b925082821015610c1a57610c19610cad565b5b828203905092915050565b6000610c3082610c43565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610c98578082015181840152602081019050610c7d565b83811115610ca7576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b610cfb81610c25565b8114610d0657600080fd5b50565b610d1281610c63565b8114610d1d57600080fd5b5056fea264697066735822122023376cc8dcc48a764f6e3793ebb2000453518d497d450e575633005f4e5bb6af64736f6c63430008070033820636a0b235d2ceddba2713ff366352b3377650b70693964a2e6f188a59e82ebb44fbb8a04e690f4a6d0883600e5ce3ed00d49858735314dbf2088808a66bfcce7ef9ff37c0 Key: 62000000000000000a4a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0e Value: c2c0c0 Key: 62000000000000000b6ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f32 Value: c2c0c0 Key: 62000000000000000c62cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f48 Value: c2c0c0 Key: 62000000000000000dc492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac1 Value: c2c0c0 Key: 62000000000000000e4c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d5 Value: c2c0c0 Key: 62000000000000000f6b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1e Value: f90e1bf90e17f90e1402843b9aca00830cafdc8080b90dc06080604052600a60025534801561001557600080fd5b506002546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610d568061006a6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad9190610b27565b60405180910390f35b6100d060048036038101906100cb9190610a66565b610239565b6040516100dd9190610b0c565b60405180910390f35b6100ee61032b565b6040516100fb9190610b49565b60405180910390f35b61011e60048036038101906101199190610a13565b610335565b60405161012b9190610b0c565b60405180910390f35b61013c61069b565b6040516101499190610b64565b60405180910390f35b61016c600480360381019061016791906109a6565b6106a0565b6040516101799190610b49565b60405180910390f35b61018a6106e8565b6040516101979190610b27565b60405180910390f35b6101ba60048036038101906101b59190610a66565b610721565b6040516101c79190610b0c565b60405180910390f35b6101ea60048036038101906101e591906109d3565b6108f5565b6040516101f79190610b49565b60405180910390f35b6040518060400160405280600d81526020017f4d7920455243323042617369630000000000000000000000000000000000000081525081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103199190610b49565b60405180910390a36001905092915050565b6000600254905090565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561038257600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561040b57600080fd5b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546104559190610bf1565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461051f9190610bf1565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105e99190610b9b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106889190610b49565b60405180910390a3600190509392505050565b600381565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040518060400160405280600581526020017f6d7945524300000000000000000000000000000000000000000000000000000081525081565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561076e57600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107b89190610bf1565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108449190610b9b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108e39190610b49565b60405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008135905061098b81610cf2565b92915050565b6000813590506109a081610d09565b92915050565b6000602082840312156109bc576109bb610cdc565b5b60006109ca8482850161097c565b91505092915050565b600080604083850312156109ea576109e9610cdc565b5b60006109f88582860161097c565b9250506020610a098582860161097c565b9150509250929050565b600080600060608486031215610a2c57610a2b610cdc565b5b6000610a3a8682870161097c565b9350506020610a4b8682870161097c565b9250506040610a5c86828701610991565b9150509250925092565b60008060408385031215610a7d57610a7c610cdc565b5b6000610a8b8582860161097c565b9250506020610a9c85828601610991565b9150509250929050565b610aaf81610c37565b82525050565b6000610ac082610b7f565b610aca8185610b8a565b9350610ada818560208601610c7a565b610ae381610ce1565b840191505092915050565b610af781610c63565b82525050565b610b0681610c6d565b82525050565b6000602082019050610b216000830184610aa6565b92915050565b60006020820190508181036000830152610b418184610ab5565b905092915050565b6000602082019050610b5e6000830184610aee565b92915050565b6000602082019050610b796000830184610afd565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610ba682610c63565b9150610bb183610c63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610be657610be5610cad565b5b828201905092915050565b6000610bfc82610c63565b9150610c0783610c63565b925082821015610c1a57610c19610cad565b5b828203905092915050565b6000610c3082610c43565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610c98578082015181840152602081019050610c7d565b83811115610ca7576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b610cfb81610c25565b8114610d0657600080fd5b50565b610d1281610c63565b8114610d1d57600080fd5b5056fea264697066735822122023376cc8dcc48a764f6e3793ebb2000453518d497d450e575633005f4e5bb6af64736f6c63430008070033820636a020ae798a6d4d63ab28f58483d1c55534930b118896413835d0649c134fb7329da03c31d33d07db53c342246a7592b18ad60e7b200706b01bc65a4638fc757b7c51c0 Key: 620000000000000010538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce2 Value: c2c0c0 Key: 6200000000000000119eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb181 Value: c2c0c0 Key: 62000000000000001286c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c86 Value: c2c0c0 Key: 6200000000000000137210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245c Value: c2c0c0 Key: 620000000000000014a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9 Value: c2c0c0 Key: 6200000000000000154613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Value: f8aff8acf8aa03843b9aca0082cddf94384fdc54be04bfb947f7ac1ccc0da2c231c0cba180b844a9059cbb000000000000000000000000d00411828e14f75b0bada0d5173974e9451586150000000000000000000000000000000000000000000000000000000000000003820636a08e72dfd86f58b979183c2e66dc938f62aa66ea85502d7ac372164ea33305eac0a01bbe6f002374f183ae4253d3c4b4ed2458e8b3897224342b5b3cafc6a61b3566c0 Key: 633f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802 Value: 608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad9190610b27565b60405180910390f35b6100d060048036038101906100cb9190610a66565b610239565b6040516100dd9190610b0c565b60405180910390f35b6100ee61032b565b6040516100fb9190610b49565b60405180910390f35b61011e60048036038101906101199190610a13565b610335565b60405161012b9190610b0c565b60405180910390f35b61013c61069b565b6040516101499190610b64565b60405180910390f35b61016c600480360381019061016791906109a6565b6106a0565b6040516101799190610b49565b60405180910390f35b61018a6106e8565b6040516101979190610b27565b60405180910390f35b6101ba60048036038101906101b59190610a66565b610721565b6040516101c79190610b0c565b60405180910390f35b6101ea60048036038101906101e591906109d3565b6108f5565b6040516101f79190610b49565b60405180910390f35b6040518060400160405280600d81526020017f4d7920455243323042617369630000000000000000000000000000000000000081525081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103199190610b49565b60405180910390a36001905092915050565b6000600254905090565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561038257600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561040b57600080fd5b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546104559190610bf1565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461051f9190610bf1565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546105e99190610b9b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106889190610b49565b60405180910390a3600190509392505050565b600381565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040518060400160405280600581526020017f6d7945524300000000000000000000000000000000000000000000000000000081525081565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561076e57600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107b89190610bf1565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108449190610b9b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108e39190610b49565b60405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008135905061098b81610cf2565b92915050565b6000813590506109a081610d09565b92915050565b6000602082840312156109bc576109bb610cdc565b5b60006109ca8482850161097c565b91505092915050565b600080604083850312156109ea576109e9610cdc565b5b60006109f88582860161097c565b9250506020610a098582860161097c565b9150509250929050565b600080600060608486031215610a2c57610a2b610cdc565b5b6000610a3a8682870161097c565b9350506020610a4b8682870161097c565b9250506040610a5c86828701610991565b9150509250925092565b60008060408385031215610a7d57610a7c610cdc565b5b6000610a8b8582860161097c565b9250506020610a9c85828601610991565b9150509250929050565b610aaf81610c37565b82525050565b6000610ac082610b7f565b610aca8185610b8a565b9350610ada818560208601610c7a565b610ae381610ce1565b840191505092915050565b610af781610c63565b82525050565b610b0681610c6d565b82525050565b6000602082019050610b216000830184610aa6565b92915050565b60006020820190508181036000830152610b418184610ab5565b905092915050565b6000602082019050610b5e6000830184610aee565b92915050565b6000602082019050610b796000830184610afd565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610ba682610c63565b9150610bb183610c63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610be657610be5610cad565b5b828201905092915050565b6000610bfc82610c63565b9150610c0783610c63565b925082821015610c1a57610c19610cad565b5b828203905092915050565b6000610c3082610c43565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610c98578082015181840152602081019050610c7d565b83811115610ca7576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b610cfb81610c25565b8114610d0657600080fd5b50565b610d1281610c63565b8114610d1d57600080fd5b5056fea264697066735822122023376cc8dcc48a764f6e3793ebb2000453518d497d450e575633005f4e5bb6af64736f6c63430008070033 Key: 636c697175652d83ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Value: 7b226e756d626572223a302c2268617368223a22307838336162343536396138393036323462376161336566366362623164303932653031353331643834376234363162373036366364356439323363346561666431222c227369676e657273223a7b22307833343734333866356133643236653232346361343438623035653933323536363932336563653064223a7b7d2c22307835393862363539343638313561653630633638656333346437343762616536643136363930323837223a7b7d7d2c22726563656e7473223a7b7d2c22766f746573223a6e756c6c2c2274616c6c79223a7b7d7d Key: 638710aa86ab306a883e718bb5fe52128a4a90abf9679d3e0a97c1f3592cb0c0 Value: e2a0305787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0a Key: 657468657265756d2d636f6e6669672d83ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Value: 7b22636861696e4964223a3737372c22686f6d657374656164426c6f636b223a302c22656970313530426c6f636b223a302c2265697031353048617368223a22307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c22656970313535426c6f636b223a302c22656970313538426c6f636b223a302c2262797a616e7469756d426c6f636b223a302c22636f6e7374616e74696e6f706c65426c6f636b223a302c2270657465727362757267426c6f636b223a302c22697374616e62756c426c6f636b223a302c22636c69717565223a7b22706572696f64223a36302c2265706f6368223a33303030307d7d Key: 657468657265756d2d67656e657369732dfba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788e Value: 7b22307835393862363539343638313561653630633638656333346437343762616536643136363930323837223a7b2262616c616e6365223a2230783262356533616631366231383830303030227d7d Key: 6800000000000000006e Value: 83ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Key: 68000000000000000083ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Value: f9027ea00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001808347b760808463ad7b9cb8890000000000000000000000000000000000000000000000000000000000000000347438f5a3d26e224ca448b05e932566923ece0d598b65946815ae60c68ec34d747bae6d166902870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000083ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd174 Value: 01 Key: 6800000000000000012547a8e05b6173ddc33a1c376390d433ffe090591ecdef79904029e20d9e9c2a Value: f90256a083ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001018347c94c808463c534e3b861da83010b00846765746888676f312e31392e358777696e646f77730000000000bc796b239b0b48b1f4568534f9e03337ef4a3e1b12ba5293cf63757eedda9cd94582ae2b80da35f53689532fbe2c1eceb5cafa3d2b4e331ca71561bcca23e0ce01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 6800000000000000012547a8e05b6173ddc33a1c376390d433ffe090591ecdef79904029e20d9e9c2a74 Value: 02 Key: 6800000000000000016e Value: 8725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e4 Key: 6800000000000000018725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e4 Value: f90256a083ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002018347c94c808463c5336db861da83010b00846765746888676f312e31392e358777696e646f7773000000000020f90551b5837114f87c5f38ede03fba584bbf0a67f0d463ddd079907dbda2d373b198a440070401200efd184856fe60541c2f8a3b4150b2b67cc42bb9a06bcc00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 6800000000000000018725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e474 Value: 03 Key: 68000000000000000255848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d0619 Value: f90256a08725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002028347db3d808463c534e9b861da83010b00846765746888676f312e31392e358777696e646f77730000000000cafc8d72ae946f6744044d784742b2257cf24b31aa7c12da48d8c55b9fac56fd0520708fe22f4616fe190724b28ee0f712b69684e2c232ddc1f99370f9fa67c001a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000255848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d061974 Value: 05 Key: 6800000000000000026e Value: 55848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d0619 Key: 6800000000000000036e Value: ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f5 Key: 680000000000000003ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f5 Value: f90256a055848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d0619a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002038347ed32808463c53525b861da83010b00846765746888676f312e31392e358777696e646f77730000000000431d3a96acbd941b86c7683d3453c0bc71072a1f322d26fb61490098bcf50890672424f7ed6b4ded3a68fbd94523534c02159b9cad3f81a6d9d8fbc1546e5dc801a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000003ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f574 Value: 07 Key: 6800000000000000046e Value: a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b0 Key: 680000000000000004a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b0 Value: f90256a0ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002048347ff2c808463c53561b861da83010b00846765746888676f312e31392e358777696e646f777300000000003727c4ebba67e1c2058a5e3516ac34d4672afcfeccf7131d640c3a57da4b97bc6819d0e82744138199aa64a8e96c6e940fe134a46251af72e27b30be20d5e3ab01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000004a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b074 Value: 09 Key: 6800000000000000056e Value: 90db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be80 Key: 68000000000000000590db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be80 Value: f90258a0a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0da73a3004622ded0dd20bb0b1b729fa96a65f76b9f9f04877b9356045c724319a0bfe61eef3bf0ddc808d3a1495ca247e3c6321b0021db69b42d6cd322abe47852a0056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002058348112a8252088463c5359db861da83010b00846765746888676f312e31392e358777696e646f77730000000000c770d470468cc1de6ec6afd8f08c61bdde02e9a251558049f4e673d2f68f3d9562eeb8573bb24f691babb0d6885e40854c9142dd8be52b8d3aee0ae3c936c72e00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000590db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be8074 Value: 0b Key: 6800000000000000066e Value: b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487c Key: 680000000000000006b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487c Value: f90256a090db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be80a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0da73a3004622ded0dd20bb0b1b729fa96a65f76b9f9f04877b9356045c724319a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002068348232d808463c57064b861da83010b00846765746888676f312e31392e358777696e646f77730000000000b6ca543fe28f813defd1323f22ff431298ef37d4278d2931b0b1d1162bfb18b025ae38db641f2a17974f647db0dcf59e9daf96ed875badb7e54de8a4dfb32d2a00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000006b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487c74 Value: 0d Key: 6800000000000000076e Value: 958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae1 Key: 680000000000000007958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae1 Value: f90256a0b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0da73a3004622ded0dd20bb0b1b729fa96a65f76b9f9f04877b9356045c724319a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020783483534808463c570a0b861da83010b00846765746888676f312e31392e358777696e646f77730000000000d57ac934b4c1d2afba96ba26f74dc89267ab82abd013aeda47348123bc31e1a911c9f6e3dfc01eeca8f44c0ec13faa23fd4cfc8df284dc2ec423ce72d4e8d08800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000007958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae174 Value: 0f Key: 6800000000000000086e Value: 90f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049df Key: 68000000000000000890f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049df Value: f90256a0958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0da73a3004622ded0dd20bb0b1b729fa96a65f76b9f9f04877b9356045c724319a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020883484740808463c66368b861da83010b00846765746888676f312e31392e358777696e646f777300000000002e46ccc3c3191be24f8e6830305c17242f4fd3eb277df7c8cc66bb9b22d6ee2134cd6f08721256ea5e5e3944794c836f840cbafcc42ca50bf91eef51ea17828a01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000890f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049df74 Value: 11 Key: 6800000000000000096e Value: d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb443578 Key: 680000000000000009d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb443578 Value: f90259a090f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049dfa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39aa08b5994595c8d75d05671d80e4364a498a44c2f3ed57b85a8afb89178b0c17ed4a0b769fd25cdff8e1059fcdde93c8ae51f1afd036af67019d02e20362092d269dbb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209834859508301f0678463c663a4b861da83010b00846765746888676f312e31392e358777696e646f777300000000008252c6c5c272ea7a33e924ecd83b7973a095d5375e561596c52c131f392d9fea3c8d6fea474b346f36cc3afe309d3389ad8ab16b1cd978b0912bd28f180fdd9d00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000009d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb44357874 Value: 13 Key: 68000000000000000a4a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0e Value: f90256a0d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb443578a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a83486b65808463c663e0b861da83010b00846765746888676f312e31392e358777696e646f77730000000000669a87d404f990200e4094e484497b18661d72d7b45f9d915444c3ef3c249e5475813fe92bb381d611b161d3f1b544c02828aa9961716556a4abf437f1851caa00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000a4a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0e74 Value: 15 Key: 68000000000000000a6e Value: 4a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0e Key: 68000000000000000b6ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f32 Value: f90256a04a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b83487d7e808463c6641cb861da83010b00846765746888676f312e31392e358777696e646f77730000000000396f1e3b897383a91bcfec1c805a3ef51785e138ef6b02ce83864245a71303584940ccd8351839c70f7f2d31d29ad4390bb3af21f2786337872b3ef10713158000a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000b6ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f3274 Value: 17 Key: 68000000000000000b6e Value: 6ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f32 Key: 68000000000000000c62cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f48 Value: f90256a06ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f32a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c83488f9c808463c66458b861da83010b00846765746888676f312e31392e358777696e646f7773000000000006a972a92b6d4ba46639e4cc99edeb7278f8c287c2a9ad0471db0dbccf971f1055eeab3d1d06b3924f9ec9aed05228056f9772f256f8e2294eb5ac8d08479f6400a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000c62cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f4874 Value: 19 Key: 68000000000000000c6e Value: 62cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f48 Key: 68000000000000000d6e Value: c492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac1 Key: 68000000000000000dc492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac1 Value: f90256a062cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f48a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d8348a1be808463c66494b861da83010b00846765746888676f312e31392e358777696e646f777300000000001d77ed320d45d01c768cca457ffabe6b11487a87a79c5540f78c4a4d74987b2b51ae7c4000df28952758c441cf0ebe167867a73357ce0f3f7785e889dc52182001a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000dc492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac174 Value: 1b Key: 68000000000000000e4c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d5 Value: f90256a0c492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a06ccbcec25a3a76ca2d4175bec3063bc00698afe75a78a01ffb74c18d30f1c39aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e8348b3e5808463c6686eb861da83010b00846765746888676f312e31392e358777696e646f77730000000000158e908569ba486e55a5eb4b2466ba2c716e7ef9ea27e3e3f692a3fe8b6e154108e49a8469ff598f200f12496f7183fa0a6754313bcea5a925f78cbdac750af601a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000e4c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d574 Value: 1d Key: 68000000000000000e6e Value: 4c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d5 Key: 68000000000000000f6b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1e Value: f90259a04c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564a01eeac921ff3aa474a2ad39e3001efc0ee37ac977f68ce506a754997a2dfc27b4a08d91efbbb0d70e091c580f6ea555a3a2c42f2264f2af82c1350d84836ba8ea5fb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f8348c610830cafdc8463c668aab861da83010b00846765746888676f312e31392e358777696e646f77730000000000e8c55935e5fa5340d85b056a81cec8c5262e419c73f9800a5f1442c3b4a5bb8e03ba6d4dfef3577fb7f7ab214d60b36c538c6cd84afc1457cd8ed4f7a05ab73801a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000000f6b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1e74 Value: 1f Key: 68000000000000000f6e Value: 6b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1e Key: 680000000000000010538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce2 Value: f90256a06b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002108348d840808463c668e6b861da83010b00846765746888676f312e31392e358777696e646f7773000000000057fb30994f8f89051f64839d307b374b9ac82e7249f3434287d8737612e0394446a71473195b64bf48525a11cfd5d213bdfc29e533dc911886121f41574dbe0a01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000010538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce274 Value: 21 Key: 6800000000000000106e Value: 538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce2 Key: 6800000000000000116e Value: 9eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb181 Key: 6800000000000000119eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb181 Value: f90256a0538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002118348ea75808463c66922b861da83010b00846765746888676f312e31392e358777696e646f777300000000002e883de7181187562b6361b76b7c5dd7710c6b2a1feca878d2705b332b26ee181e14367efaa6d17c31011893ea32603205d44a0869d4e7c52864b60022fa04f900a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 6800000000000000119eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb18174 Value: 23 Key: 6800000000000000126e Value: 86c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c86 Key: 68000000000000001286c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c86 Value: f90256a09eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb181a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002128348fcae808463c6695eb861da83010b00846765746888676f312e31392e358777696e646f777300000000000ed7e3405016e77780ffb70fbdc7841a106b03442f29156c168cf2542f30162e2704ed13aa93526b8dee93abdd8134e764464f197e775493bcf18d9a2b12726e00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 68000000000000001286c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c8674 Value: 25 Key: 6800000000000000136e Value: 7210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245c Key: 6800000000000000137210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245c Value: f90256a086c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c86a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021383490eec808463c6699ab861da83010b00846765746888676f312e31392e358777696e646f77730000000000767b97621a6dc27becc8518ff9c8db1b133a3323472dacab2f58f92b5bea16bc2d7eb30915254f995fe2b8927cc2c9ffe076127eafad107793890cd4ac55d86701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 6800000000000000137210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245c74 Value: 27 Key: 6800000000000000146e Value: a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9 Key: 680000000000000014a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9 Value: f90256a07210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002148349212e808463c669d6b861da83010b00846765746888676f312e31392e358777696e646f77730000000000a0c557ecbe938d91f052ee1af4134ff174fc1ea2126f9acb87241198a9f5d67a1f0fe02e63de144176537fe34dbf899471190b810f98320faaef53829bb7580a00a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 680000000000000014a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b974 Value: 29 Key: 6800000000000000154613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Value: f90258a0a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0b2b06573c7057e49de5bd65474aca454aa50cc0f9b6713256f24bcd24629c471a01f044ef5b3b03dc78905028854b329903140a06efbb2d6bd389fc7e5bb57bedaa026e5628387018f80bb40da23fa6d8509ae1815377bcab83ea815c3c590d2f318b901000000000000000000000000000000000000000000000002000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000002000000000000000000000000000000010000000002001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000001004000000000000000000000000000000000000000000000000000000000000000000000000000001000000002158349337582cddf8463c66a12b861da83010b00846765746888676f312e31392e358777696e646f77730000000000517f68b82f355268cc0311551273d5d32e621d39d25d744b2d9c4eb7de1523af151d5f2e6103cb65f1a0d1c15d5c4aeacd9b2366324e3abdea94272e45b99d9600a00000000000000000000000000000000000000000000000000000000000000000880000000000000000 Key: 6800000000000000154613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf274 Value: 2b Key: 6800000000000000156e Value: 4613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Key: 6c0c419b83027470789746f3695e82dd94cb2b34317249bbcd9a91d9fee9155c78 Value: 15 Key: 6c24bf9610b05a13b7016509bdf05b071f34396255dd54a3a20cb7974431b08940 Value: 05 Key: 6cc3321a0a23690c55cbce1cacc0c0feddf84b014d9349e5687c83fe8ee59e4288 Value: 09 Key: 6cec9a63eb2e662e61e9885d513734933d1487cf4e8da30e4452fb424d2d8f8caf Value: 0f Key: 72000000000000000083ab4569a890624b7aa3ef6cbb1d092e01531d847b461b7066cd5d923c4eafd1 Value: c0 Key: 7200000000000000012547a8e05b6173ddc33a1c376390d433ffe090591ecdef79904029e20d9e9c2a Value: c0 Key: 7200000000000000018725bc6e82bcd8e29a8b929c72fc2f780c9be085aba63be922b0651373e2c3e4 Value: c0 Key: 72000000000000000255848acb5eda62f93dabfe16cc6c38cc1352486167fef9c7acb8b6e6c08d0619 Value: c0 Key: 720000000000000003ab8281425d78bec313de13ff4bb9056faa854791409e3cab1ca785cb6cb1e6f5 Value: c0 Key: 720000000000000004a9fa7c89a41e4a062cecbf2e8a9184648334dedbded6dc79cb20a7dee75376b0 Value: c0 Key: 72000000000000000590db87c55ab26dbd559c85441dc60711f6e5771baa46ae56e4ae71ddf394be80 Value: c6c501825208c0 Key: 720000000000000006b8b44fe5c69b730eddc8207b366cce4cfc6403184f3a71599ef254b01d0b487c Value: c0 Key: 720000000000000007958b1070970be8fadad971814847aa5b56d41d4da34172c3b30819c2948c3ae1 Value: c0 Key: 72000000000000000890f074df011ae3b8cb04e18d5522cf68ff94270fdec76c8e04737096411049df Value: c0 Key: 720000000000000009d8f17ef5723beb00851d5525a0b047c722f5605c4868f1b4b5b9ab8ebb443578 Value: c7c6808301f067c0 Key: 72000000000000000a4a72b38748d3a578a68a03bb0b7c4132251cc5bd7370f9258b8514c97160eb0e Value: c0 Key: 72000000000000000b6ccfdcd9eb27ecee527834d6162753207fdc99e41fc1c34e1ca4e740a4b50f32 Value: c0 Key: 72000000000000000c62cd6d4f7ef404a97690277455544f688b664da36bde0fc276d996e426d52f48 Value: c0 Key: 72000000000000000dc492e6763d0a0236f48aee20797a5d9e49b5629d11d48c65297bda03d7842ac1 Value: c0 Key: 72000000000000000e4c0ac884fa549fdd5a260b60607c6de1c6ccd31c85a3115f046288db3f4853d5 Value: c0 Key: 72000000000000000f6b4cb11ec46771fb9d4b35cfa2f5437a269675a04013ec91ae27d6285a693d1e Value: c7c601830cafdcc0 Key: 720000000000000010538f556db255a3afbe506723989a4b46120e26896f0e67963b6f5d0261ce7ce2 Value: c0 Key: 7200000000000000119eed632c88ebaca8e55a700103d4dc43a622926a2a8992ca46ad6248372fb181 Value: c0 Key: 72000000000000001286c64c392d67a1b52fc3590ea9ffa65efc659f764ab656c101ee7eee88690c86 Value: c0 Key: 7200000000000000137210ab2e720edfb83f0c5ec7b89126563945ddcf567df4d06ef8f357cba4245c Value: c0 Key: 720000000000000014a8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9 Value: c0 Key: 7200000000000000154613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Value: f8a5f8a30182cddff89df89b94384fdc54be04bfb947f7ac1ccc0da2c231c0cba1f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000598b65946815ae60c68ec34d747bae6d16690287a0000000000000000000000000d00411828e14f75b0bada0d5173974e945158615a00000000000000000000000000000000000000000000000000000000000000003 Key: 756e636c65616e2d73687574646f776e Value: d180cf8463c542b88463c5525d8463c5527c Key: 7ed0c64dc405876b5da2a2f60bf0afb614b690282e8407eaf3039eeb0de588d6 Value: f85180808080a0638710aa86ab306a883e718bb5fe52128a4a90abf9679d3e0a97c1f3592cb0c0808080a0a8ccc84cc209cb819712eb1f1152c82f77f0114c3d1bd66b446f1573561930448080808080808080 Key: 87225f605d9d6d9d122cfc389f77268c144f21a11ef2b0763a1702e80cbf5394 Value: e2a0341c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219e07 Key: 8f96128efe45d3af66806fff83ec3777e12666c7473aa4716d27f1b4627f7f5d Value: f872a02064245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8cb84ff84d038902b5d1eb9d79a78000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 Key: a635ca34f999df2deb14d6e7e10eee696e334880d6483d5338319efafd7cc44e Value: f8518080a021dc63cbdd41e1f68b7f355d7a4588defcefaf4fb9e32b6f35c1306f5e9a398b8080808080a00f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c8080808080808080 Key: a8ccc84cc209cb819712eb1f1152c82f77f0114c3d1bd66b446f157356193044 Value: e2a0341c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219e0a Key: b2b06573c7057e49de5bd65474aca454aa50cc0f9b6713256f24bcd24629c471 Value: f851a023a72d53272ad8d7966d816a35a7d7addced061b8bdf656df9e77200f62052af8080808080808080808080a0ffde5ed0c3d5c43585691cfa8a26c01d82bc88e76514542e0d6c2d848f99299580808080 Key: bab13a31d132623bfee3549eaff29dcb998cda7206d44af729cdbe22b5aa1564 Value: f851a04a138167e7404c69d755c6cf77847ca12d0a0ef69f1af5750dfd515375bf4fa28080808080808080808080a052739b5a84cb6c567714850671716a8a3057d70cdc84a52f2e58d2ba21881de580808080 Key: da73a3004622ded0dd20bb0b1b729fa96a65f76b9f9f04877b9356045c724319 Value: e21ca0a635ca34f999df2deb14d6e7e10eee696e334880d6483d5338319efafd7cc44e Key: fba52fedda0de0c44f7f2745739f5e98e10f1124bc04f92a1bc8355fbe58788e Value: f873a120c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8cb84ff84d808902b5e3af16b1880000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 Key: ffde5ed0c3d5c43585691cfa8a26c01d82bc88e76514542e0d6c2d848f992995 Value: f8518080a003b1feb6171ae67a69649d8e798fc17814462426c4a8a08fb372449d93222f028080808080a00f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c8080808080808080 Error: <nil>
El último bloque está en la levelDB (y también lo conocemos con el explorador de bloques local)
Con el hash del último bloque podemos buscar la clave (key) en levelDB para obtener el header del bloque:
key = 68 + número de bloque con fomrato 16 bytes(21 en hexadecimal es 0x15) + hash del bloque
Key: 6800000000000000154613e5bedd3511e54b88a57aa1fe7811c50112235b12aa369ccd2584358fccf2 Value: f90258a0a8f15a485f9f17 .... 000000000000000000000000880000000000000000
El valor está codificado en RLP, y decodificado resulta:
["0xa8f15a485f9f17b6e3f1a246e33a05a9800354178cb0c613a774de58161115b9","0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","0x0000000000000000000000000000000000000000","0xb2b06573c7057e49de5bd65474aca454aa50cc0f9b6713256f24bcd24629c471","0x1f044ef5b3b03dc78905028854b329903140a06efbb2d6bd389fc7e5bb57beda","0x26e5628387018f80bb40da23fa6d8509ae1815377bcab83ea815c3c590d2f318","0x00000000000000000000000000000000000000000000020000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000020010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000010040000000000000000000000000000000000000000000000000000000000000000000000000000010000000","0x02","0x15","0x493375","0xcddf","0x63c66a12","0xda83010b00846765746888676f312e31392e358777696e646f77730000000000517f68b82f355268cc0311551273d5d32e621d39d25d744b2d9c4eb7de1523af151d5f2e6103cb65f1a0d1c15d5c4aeacd9b2366324e3abdea94272e45b99d9600","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000"]
Nos interesa el valor del StateRoot (los valores son Parent Hash, Ommers Hash, Beneficiary, State Root, …), el cuarto valor: 0xb2b06573c7057e49de5bd65474aca454aa50cc0f9b6713256f24bcd24629c471, buscando en leveldb:
Key: b2b06573c7057e49de5bd65474aca454aa50cc0f9b6713256f24bcd24629c471 Value: f851a023a72d53272ad8d7966d816a35a7d7addced061b8bdf656df9e77200f62052af8080808080808080808080a0ffde5ed0c3d5c43585691cfa8a26c01d82bc88e76514542e0d6c2d848f99299580808080
Decodificado el valor RLP tenemos un Nodo Rama (17 campos)
["0x23a72d53272ad8d7966d816a35a7d7addced061b8bdf656df9e77200f62052af","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0xffde5ed0c3d5c43585691cfa8a26c01d82bc88e76514542e0d6c2d848f992995","0x","0x","0x","0x"]
Ruta (posición) ‘0’ : 0x23a72d53272ad8d7966d816a35a7d7addced061b8bdf656df9e77200f62052af
Ruta ‘c’ : 0xffde5ed0c3d5c43585691cfa8a26c01d82bc88e76514542e0d6c2d848f992995
Ruta «0»
Key: 23a72d53272ad8d7966d816a35a7d7addced061b8bdf656df9e77200f62052af Value: f869a036dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4b846f8440180a02e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cda03f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802
decodificado el valor RLP:
["0x36dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4","0xf8440180a02e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cda03f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802"]
El primer campo representa un Nodo Hoja con un número impar de nibbles (prefijo 0x3), el resto contiene lo que falta del hash, y que tenemos que completar al inicio con la ruta que hemos seguido, en este caso únicamente «0»
hash completo: 06dbe9564960cd334c7eac42b1f7e0bdf8ee21b24968ea84ade32e6102baf8a4
Y es el valor del hash keccak256 de la dirección del contrato, que hemos visto antes que se desplegó en la dirección 0x384FdC54BE04bfB947F7Ac1cCC0DA2C231c0CBA1.
El segundo campo de nuevo está codificado en RLP y decodificado nos proporciona el estado de la cuenta del contrato:
["0x01","0x","0x2e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cd","0x3f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802"]
Cuyos campos son: Nonce=1, Balance=0, Storage Root, Code Hash.
El análisis del Storage Trie lo dejamos para un siguiente apartado, pues no es sencillo. El Code Hash sí es sencillo analizarlo en la levelDB pues su contenido es justamente el Bytecode del Smart Contract:
Realmente en levelDB no hay una clave (key) con el Code Hash tal cual, sino con el prefijo el 63, que convertido en ASCII es ‘c’ (código, según schema.go)
Key: 633f7040d0572ea8ef7884dbf6c2810ba9fc341eb7b284e33f4ea9b3469dff2802Value: 608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce56714610….. -> bytecode
Ruta «c»
Key: ffde5ed0c3d5c43585691cfa8a26c01d82bc88e76514542e0d6c2d848f992995 Value: f8518080a003b1feb6171ae67a69649d8e798fc17814462426c4a8a08fb372449d93222f028080808080a00f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c8080808080808080
El valor está codificado en RLP, y decodificándolo obtenemos un Nodo Rama, Branch Node, y es ya casi idéntico al caso del post anterior, salvo que al haber modificado los balances, los hashes no son los mismos, pero el análisis sí:
["0x","0x","0x03b1feb6171ae67a69649d8e798fc17814462426c4a8a08fb372449d93222f02","0x","0x","0x","0x","0x","0x0f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c","0x","0x","0x","0x","0x","0x","0x","0x"]
- Ruta «2» -> 0x03b1feb6171ae67a69649d8e798fc17814462426c4a8a08fb372449d93222f02, valor decodificado:
["0x2064245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c","0xf84d048902b5d1eb9d79a78000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"]
Prefijo 0x20 nodo Hoja con número de nibbles par (hash restante, nuestra ruta ahora es ‘c2‘)
primera cuenta: Keccak256(598b65946815ae60c68ec34d747bae6d16690287) = c264245df25118b8c2b07f8d67fab2bcdc6ea50a250f89e4aacf5cab94b3bc8c
y el valor codificado en RLP, que deodificado proporciona el estado de esta cuenta:
["0x04","0x02b5d1eb9d79a78000","0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"]
Nonce 4, balance= 49995000000000000000 Wei , Storage Trie y Code Hash que representan los valores nulos.
- Ruta «8» -> 0x0f39018e386a5a8733e5bb4dfaebce90aa692c6835322ea24ad1c340cc863e6c, valor decodificado:
["0x201147d14a9d46c37d277394cc51442ea6f10bfe350b8f0a4f7a8049172432a2","0xf84b808711c37937e08000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"]
Prefijo 0x20 nodo Hoja con número de nibbles par (hash restante, nuestra ruta ahora es ‘c8′)
segunda cuenta: Keccak256(d00411828e14f75b0bada0d5173974e945158615) = c81147d14a9d46c37d277394cc51442ea6f10bfe350b8f0a4f7a8049172432a2
y el valor codificado en RLP, que deodificado proporciona el estado de esta cuenta
["0x","0x11c37937e08000","0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"]
Nonce 0, balance= 5000000000000000 wei y Storage Trie y Code Hash que representan los valores nulos.
Storage Trie
El análisis del Storage Trie no es inmediato, pues las variables se almacenan en pares clave,valor de una manera peculiar. EL storage Trie de cada contrato puede almacenar claves de 32 bytes, y la manera de gestionar el espacio y acceder a los valores, depende del tipo de variable, de la posición según el orden de aparición de esa variable en el código fuente (solidity) del contrato y si se trata de arrays, mappings o estructuras de datos, del índice correspondiente. Algunas referencias con explicaciones más elaboradas:
- https://www.adrianhetman.com/unboxing-evm-storage/
- https://medium.com/coinmonks/decoding-the-memory-of-an-ethereum-contract-52c256f83f07
- http://web.archive.org/web/20190624144959/https://solidity.readthedocs.io/en/develop/miscellaneous.html
Acceder a las variables en la blockchain
Todas estas referencias aclaran cómo acceder a las variables almacenadas del Smart Contract en la blockchain, en cada Storage Trie, y es necesario entenderlo para luego ver cómo se implementa en LevelDB. Las variables del localizan mediante su posición según orden de aparición en el código fuente (empezando desde ‘0’), aunque las variables de tipo Array se localizan en la posición que viene dada por el hash keccak256(P), siendo P el lugar por orden de aparición en el código fuente, por otra parte, los valores de las variables tipo mapping, pares (clave,valor) se localizan en la posición que viene dada por el hash keccak256( K concatenado con P) donde K el la clave (key) y P igual que antes el lugar de aparaición en el código fuente del mapping.
Hay que tener en cuenta que se trabaja con 32 bytes, como las direcciones de cuenta tienen 20 bytes (40 caracteres en hexadecimal), hay que poner 24 ceros a la izquierda (12 bytes). Para acceder a los valores, la consola geth proporciona la siguiente función:
https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat
En nuestro caso particular, el orden de las variables en el código fuente es el siguiente (las constantes no se almacenan en el Storage Trie, forman parte del código Bytecode)
Según lo anterior, lo más sencillo e inmediato es acceder a la variable de tipo sencillo entero totalSupply_ (uint256), que en la consola accederíamos simplemente con la dirección del Smart Contract y la posición de esta variabe, posición 2:
El valor devuelto ocupa 32 bytes (64 caracteres en hexadecimal sin contar «0x»), y «a» en hexadecimal corresponde a «10» en decimal, que es justo el valor asignado a totalSupply_.
Ahora procedemos a obtener los valores de la variable balances, que en este Smart Contract están definidos mediante un mapping, cuya clave es la dirección de la cuenta que tiene tokens, y el valor es el número de tokens que posee (el otro mapping de la variable allowed es anidado y se haría recursivamente)
Tenemos dos cuentas con tokens, que puestas con 32 bytes:
0x000000000000000000000000d00411828e14f75b0bada0d5173974e945158615 0x000000000000000000000000598b65946815ae60c68ec34d747bae6d16690287
Puesto que la variable mapping balances aparece en primer lugar en el código fuente (las constantes no cuentan), entonces la posición es ‘0’ , y convertido a 32 bytes, es el valor que tenemos que concatenar a cada uno de los anteriores, y hallar el hash Keccak256 de ese número de 64 bytes para tener la posición en el almacenamiento del smart contract:
Keccac(000000000000000000000000598b65946815ae60c68ec34d747bae6d166902870000000000000000000000000000000000000000000000000000000000000000) = a9dedd507e87a821138aa740d510fe117109cbb8c2dc9fff9aacab345f088d57
Keccac(000000000000000000000000d00411828e14f75b0bada0d5173974e9451586150000000000000000000000000000000000000000000000000000000000000000) = 5fba0787be7d32d14e99723cb546a85de7a554629b2517c4d3bd908a8c953069
Ahora podemos usar en la consola la función getStorageAt y comprobamos que obtenemos los correspondientes valores de los balances del token del Smart Contract para cada cuenta
Storage Trie en LevelDB
Analizamos ahora el Storage Trie, partiendo del valor del Storage Root en el Estado de la cuenta del contrato, obtenido en el State Trie, StorageRoot =0x2e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cd.
Buscando los valores en la leveldb:
Key: 2e8d7ed11d4a78b32716c9538d25c98ec13842db4fa39c82eac6cfca12bfb0cd Value: f87180808080a0638710aa86ab306a883e718bb5fe52128a4a90abf9679d3e0a97c1f3592cb0c0a057eeaffc3c39066751e494ddd3a2b4bab6a4350a04398dac1e57cf3e279a089b8080a087225f605d9d6d9d122cfc389f77268c144f21a11ef2b0763a1702e80cbf53948080808080808080
Antes de analizar cada uno de los nodos que aparecen, teniendo en cuenta el apartado anterior sobre las posiciones de las variables en el almacenamiento, pues resulta que la clave (key) en LevelDB de una variable del Smart Contract viene dada por el hash Keccak256 de su Posición en el almacenamiento (calculada según el tipo de variable que sea y según el orden de aparición en el código fuente)
Siendo para una variable del Smart Contract, y usando siempre 32 bytes: L = Lugar de aparición en el código fuente (empezando en 0 y sin contar las constantes) P= Posición en el Almacenamiento del Smart Contract (32 bytes disponibles para las posiciones) K = Clave en LevelDB Posicion en almacenamiento Variable sencilla uint256 -> P = L Mapping (address => uint256) -> P = Keccak256( address concatenado con L) Key/Clave en LevelDB = Keccak256(P) Variable sencilla uint256 -> K = Keccak256(P) -> K = Keccak256(L) Mapping (address => uint256) -> K = Keccak256(P) -> K = Keccak256(Keccak256( address concatenado con L))
Con las posiciones calculadas en el apartado anterior, tenemos entonces los siguientes cálculos, marcados en colores lasl claves que han de existir en levelDB
Claves en Storage Trie de las variables del Smart Contract almacenadas en la blockchain |
---|
Uint256 totalSupply_ Orden de aparición en código fuente: 2 Posición: 0000000000000000000000000000000000000000000000000000000000000002 Clave levelDB: Keccak256(0000000000000000000000000000000000000000000000000000000000000002) = 405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace |
Mapping (address => uint256) balances Orden de aparición en código fuente: 0 Cuenta 598b65946815ae60c68ec34d747bae6d16690287 Posición: Keccak256(000000000000000000000000598b65946815ae60c68ec34d747bae6d166902870000000000000000000000000000000000000000000000000000000000000000) = a9dedd507e87a821138aa740d510fe117109cbb8c2dc9fff9aacab345f088d57 Clave LevelDB: Keccac256(a9dedd507e87a821138aa740d510fe117109cbb8c2dc9fff9aacab345f088d57) = 841c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219e |
Mapping (address => uint256) balances Orden de aparición en código fuente: 0 Cuenta d00411828e14f75b0bada0d5173974e945158615 Posición: Keccak256(000000000000000000000000d00411828e14f75b0bada0d5173974e9451586150000000000000000000000000000000000000000000000000000000000000000) = 5fba0787be7d32d14e99723cb546a85de7a554629b2517c4d3bd908a8c953069 Clave LevelDB: Keccac256(5fba0787be7d32d14e99723cb546a85de7a554629b2517c4d3bd908a8c953069)= 526fab3158aeeb350abedb294d68cbe170d310a0e6dbed58e14861d2f3e131c7 |
El campo Value al decodificarlo (RLP) nos proporciona un Nodo Rama, Branch Node, con las índices 4, 5 y 8 ocupados por otras claves, y el resto nulos. Son los tres valores de las variables almacenadas, el initialSupply y el balance de las dos cuentas con tokens:
["0x","0x","0x","0x","0x638710aa86ab306a883e718bb5fe52128a4a90abf9679d3e0a97c1f3592cb0c0","0x57eeaffc3c39066751e494ddd3a2b4bab6a4350a04398dac1e57cf3e279a089b","0x","0x","0x87225f605d9d6d9d122cfc389f77268c144f21a11ef2b0763a1702e80cbf5394","0x","0x","0x","0x","0x","0x","0x","0x"]
- Ruta 4 -> key 0x638710aa86ab306a883e718bb5fe52128a4a90abf9679d3e0a97c1f3592cb0c0
Value: e2a0305787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0a, que decodificado proporciona:
[«0x305787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace»,»0x0a»]
El prefijo 0x3 indica que es un nodo Hoja, con un hash restante de un número de nibbls (bytes) impar, siendo el hash entonces 405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace y el valor 0x0a, que es 10 en decimal, variable initialSupply_, y comprobamos el valo correcto de la clave en el cálculo de la tabla anterior.
- Ruta 5-> key 0x57eeaffc3c39066751e494ddd3a2b4bab6a4350a04398dac1e57cf3e279a089b
Value: e2a0326fab3158aeeb350abedb294d68cbe170d310a0e6dbed58e14861d2f3e131c703, que decodificado proporciona:
[«0x326fab3158aeeb350abedb294d68cbe170d310a0e6dbed58e14861d2f3e131c7″,»0x03»]
De nuevo prefijo 0x3, Nodo Hoja, siendo el hash 526fab3158aeeb350abedb294d68cbe170d310a0e6dbed58e14861d2f3e131c7, valor calculado en la tabla anterior, y el valor 0x03, 3 en decimal, balance en tokens de la cuenta destino
- Ruta 8 -> key 0x87225f605d9d6d9d122cfc389f77268c144f21a11ef2b0763a1702e80cbf5394
Value: e2a0341c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219e07, decodificado
[«0x341c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219e»,»0x07″]
Prefijo 0x3, Nodo hoja con hash: 841c846524bae4fd3aa9bce27d996677d4651df966ba3296d5788c40bec8219e, valor calculado en la tabla anterior, y valor 0x07, 7 en decimal, balance en tokens de la cuenta origen
Por tanto, ya conocemos cómo se almancenan en la base de datos LevelDB las claves y valores almacenados por un Smart Contract en su Storage Trie.
[…] e interpretado el State Trie (cuentas) y el Storage Trie (almacenamiento de los smart contracts), https://abrazalaweb.net/2023/01/ethereum-leer-leveldb-smart-contract-y-storage-trie/, […]