sload. assemblage avec struct - ne fonctionne pas en solidité

Oct 02 2020
struct S { 
   uint128 a; 
   uint128 b; 
}
S test1;
function assemblyStorage() public returns (uint a, uint b, uint c, uint d, uint f, uint g){
  test1 = S(5,10);
  assembly {
     a:=sload(0)
  }
}

Comme nous pouvons le voir, test1maintenant occupera le premier emplacement. et pas le second car les variables peuvent être compressées ...

Maintenant, pourquoi sload(0)renvoie quelque chose comme ça 3402823669209384634633746074317682114565et comment puis-je retourner 5 et 10?

Réponses

1 Ismael Oct 02 2020 at 21:15

Comme vous l'avez dit, la structure est emballée. Depuis sload(0)renvoie 32 octets, il renvoie la structure entière.

Pour accéder aux différentes parties de la structure, utilisez des décalages de bits et des masques.

assembly {
    let w := sload(0)
    a := and(w, 0xffffffffffffffffffffffffffffffff)
    b := shr(128, w)
}