Una Máquina Virtual Ethereum maneja el almacenamiento de un contrato en celdas, cada una es accedida por una dirección de 32 bytes y contiene un valor de 32 bytes. Una visión simplificada:
Pero en la implementación RSK, hay una nueva característica: una celda puede contener una cantidad arbitraria de datos, un byte array:
Esta característica está expuesta desde nuevos métodos en la interfaz de Repository:
/** * Put a value <span style="color:orange">in</span> storage of an account at a given key * * <span style="color:cyan">@</span>param addr of the account * <span style="color:cyan">@</span>param key of the data to store * <span style="color:cyan">@</span>param value is the data to store */ <span style="color:orange">void</span> addStorageRow<span style="color:cyan">(</span><span style="color:orange">byte</span><span style="color:cyan">[]</span> addr<span style="color:cyan">,</span> DataWord key<span style="color:cyan">,</span> DataWord value<span style="color:cyan">);</span> <span style="color:orange">void</span> addStorageBytes<span style="color:cyan">(</span><span style="color:orange">byte</span><span style="color:cyan">[]</span> addr<span style="color:cyan">,</span> DataWord key<span style="color:cyan">,</span> <span style="color:orange">byte</span><span style="color:cyan">[]</span> value<span style="color:cyan">);</span> /** * Retrieve storage value from an account <span style="color:orange">for</span> a given key * * <span style="color:cyan">@</span>param addr of the account * <span style="color:cyan">@</span>param key associated <span style="color:orange">with</span> <span style="color:orange">this</span> value * <span style="color:cyan">@</span><span style="color:orange">return</span> data <span style="color:orange">in</span> the form of a <span style="color:cyan"><</span>code<span style="color:cyan">></span>DataWord<span style="color:cyan"><</span>/code<span style="color:cyan">></span> */ DataWord getStorageValue<span style="color:cyan">(</span><span style="color:orange">byte</span><span style="color:cyan">[]</span> addr<span style="color:cyan">,</span> DataWord key<span style="color:cyan">);</span> <span style="color:orange">byte</span><span style="color:cyan">[]</span> getStorageBytes<span style="color:cyan">(</span><span style="color:orange">byte</span><span style="color:cyan">[]</span> addr<span style="color:cyan">,</span> DataWord key<span style="color:cyan">);</span>
Los nuevos métodos son addStorageBytes y getStorageBytes. Fue relativamente fácil agregarlos (el año pasado), porque la estructura interna que guarda el almacenamiento (un “trie”) ya estaba preparada para manejar datos de arreglos de bytes.
La implementación RSK está usando esta capacidad desde contratos precompilados y no está disponible para contratos EVM, de la máquina virtual.
En esta serie de post, quiero describir nuevas características que podrían agregarse al almacenamiento de RSK, y a las extensiones posibles para su uso desde de la EVM.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez