¿Dónde se almacena la cadena en el almacenamiento de solidez?

Estoy tratando de verificar dónde se almacena una cadena en el almacenamiento en Solidity .

Para probar esto estoy usando este código:

pragma solidity 0.5.4;

contract AssemblyString {
    string s; // slot 0

    function set(string calldata _s) external {
        s = _s;
    }

    function get(uint i) public view returns (bytes32){
        bytes32 r;
        assembly {
            r := sload(i) //we load the slot number i
        }
        return r;
    }
}

Si configuro una cadena de menos de 31 bytes, funciona bien como especifica la solidez:

  1. Implementar contrato
  2. establecer ("éter")
  3. obtener (0)

Salida: 0x6574686572000000000000000000000000000000000000000000000000000000a

La primera parte representa la cadena codificada : 0x6574686572 es igual a "éter".
La segunda parte es el tamaño*2 : 0xA es igual a 10 en decimal. (el éter tiene 5 letras, luego 5 veces 2 es igual a 10)
Todos los ceros intermedios se rellenan para alcanzar los 32 bytes de longitud.


¡Pero! si configuro una cadena de más de 31 bytes, no puedo encontrar la cadena.
Como dice la especificación, los datos de la cadena están contenidos en el keccak256 (ranura).

Cuando busque keccak256 (0) = 044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d
a decimal : 1937035142596246781725772320544704470

Salida: 0x0

But if I debug the contract in Remix IDE , I found that the data is stored always in key 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,
dec: 18569430475105882587588266137607568536673111973893317399460219858819262702947 and the string is stored at that position.

¿Qué estoy haciendo mal?

Gracias por tu tiempo.

Respuestas (1)

¡Encontré la solución!

ejecutando esto en javascript:

const utils = require('web3-utils'); // npm install web3
console.log(utils.soliditySha3(0x0))
>> 290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563

También con este código en solidez:

function test() public pure returns(bytes32){
    bytes memory a = new bytes(32);
    return keccak256(a);
}

¡Funciona!