Web3js et keccak différentes valeurs

bunjee

Web3js et keccak différentes valeurs


Dans la solidité il y a la fonction keccak256 qui hache ses arguments. J’utilise le keccak256 pour calculer et utiliser le résultat pour vérifier si certaines entrées existent dans mon tableau.

Je veux calculer la même valeur en javascript et vérifier si l’entrée existe sur la blockchain, bien que le web3.sha donne une valeur différente de celle du keccak256.

Comment puis-je calculer la même valeur pour les mêmes arguments?

Dans la console, je lance ceci:

 web3 . sha3 ( "test1" ); 

et mon contrat:

 function  hashVal ( bytes32 val )   public  returns ( bytes32 )   { 
      return  keccak256 ( val ); 
  } 

smarx

Personne ne pourra déboguer votre code sans le voir.

Réponses


 smarx

Essaye ça:

 web3 . sha3 ( web3 . padRight ( web3 . fromAscii ( "test1" ),   66 ),   {  encoding :   'hex'   }); 

Explication:

Une représentation en bytes32 de « test1 » est longue de 32 octets, tandis que « test1 » ne fait que 5 octets.

web3.fromAscii("test1") convertit la chaîne en sa représentation hexadécimale avec un « 0x »: 0x7465737431 .

web3.padRight la valeur avec des zéros sur le côté droit, comme le fait la conversion en bytes32 . 32 octets, c’est 64 caractères hexadécimaux, mais pour prendre en compte le « 0x », je remplis 66 caractères. Cela produit 0x7465737431000000000000000000000000000000000000000000000000000000 , qui est une représentation en bytes32 de la chaîne.

Enfin, nous transmettons cette valeur à web3.sha3 et web3.sha3 { encoding: 'hex' } pour que sha3 interprète la valeur transmise en hexadécimal plutôt qu’en ASCII.

bunjee

Merci. Qu’en est-il des valeurs multiples? keccak256 prend en charge plusieurs arguments, comment puis-je faire de même avec web3.sha3?

smarx

Concaténer, en utilisant ABI bien emballé. Voir solidity.readthedocs.io/en/v0.4.20/… .

smarx

Si vous faites beaucoup de cela, pensez à utiliser soliditySha3 dans web3.js ou soliditySHA3 sur ethereumjs-abi .

bunjee

Je pensais que soliditySha3 est le même mais dans une version web3 différente, non?

smarx

Utilisation de web3 1.0.0-beta: web3.utils.soliditySha3({ type: 'bytes32', value: web3.utils.fromAscii('test1') });


 Ismael

Si votre fonction est déclarée comme vue ou pure, vous pouvez l’appeler à partir de javascript sans payer de gaz, et elle devrait retourner exactement le même résultat que lorsqu’elle est appelée depuis l’intérieur du contrat

 function  hashVal ( string  val )   public  pure returns ( bytes32 )   { 
     return  keccak256 ( val ); 
 } 

Et depuis javascript

   var  result =   await  contract . methods . hashVal ( "hello" ). call (); 

Rob Hitchens B9lab

Cela a l’avantage supplémentaire de garantir que tous les clients peuvent facilement le calculer comme le contrat le fait, maintenant et à l’avenir .

 

#et, différentes, Keccak», valeurs, web3js

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *