Comment appeler cette fonction de solidité avec Web3js lors de l’exécution du contrat?

user2284570

Comment appeler cette fonction de solidité avec Web3js lors de l’exécution du contrat?


Je suis nouveau avec ethereum.
Je suis définitivement aux prises avec les 4 derniers paramètres de cette fonction, donc je pose directement le problème.

 mapping ( address =>  uint256 )  nonces ; 
 /* * Proxy transfer token. When some users of the ethereum account has no ether, * he or she can authorize the agent for broadcast transactions, and agents may charge agency fees * @param _from * @param _to * @param _value * @param fee * @param _v * @param _r * @param _s */ 
 function  transferProxy ( address _from ,  address _to ,  uint256 _value ,  uint256 _fee , uint8 _v , bytes32 _r ,  bytes32 _s )   public  transferAllowed ( _from )  returns ( bool ){ 

     if ( balances [ _from ]   <  _fee +  _value )  revert (); uint256 nonce =  nonces [ _from ]; bytes32 h =  keccak256 ( _from , _to , _value , _fee , nonce ); 
     if ( _from !=  ecrecover ( h , _v , _r , _s ))  revert ();   // THE PROBLEM I'm STUCK ON SEVERAL HOURS IS HERE. 

     if ( balances [ _to ]   +  _value <  balances [ _to ] 
         ||  balances [ msg . sender ]   +  _fee <  balances [ msg . sender ])  revert (); balances [ _to ]   +=  _value ; 
     Transfer ( _from ,  _to ,  _value ); balances [ msg . sender ]   +=  _fee ; 
     Transfer ( _from ,  msg . sender ,  _fee ); balances [ _from ]   -=  _value +  _fee ; nonces [ _from ]   =  nonce +   1 ; 
     return   true ; 
 } 
  • Tout d’abord, keccak256 ne prend normalement qu’un seul argument (les données à hacher). Je n’ai aucune idée de ce que fait l’utilisation de plusieurs paramètres. Ajout des données? Si oui comment? Hacher les hashs? tout à la fois ou ressasser après chaque résultat?
  • Deuxièmement, je pense que pour obtenir _v je dois utiliser web3.eth.sign avec web3.eth.sign("0x395BE1C1Eb316f82781462C4C028893e51d8b2a5",keccak256("data")) . Mais si ce n’est pas le cas, je ne sais pas ce que je dois utiliser
  • Troisièmement, aucune idée de _r n’est sur le point.
  • Quatrièmement, je pense que comprendre _s concerne un rappel HTtp (en lisant la documentation). Mais il semble que je ne puisse pas le laisser à 0 car je ne sais pas quoi rappeler.
  • ET LA chose la plus difficile. Comment déterminer exactement les paramètres nonce dans keccak256 ? (même si je n’ai aucune idée de comment l’appeler), parce que j’ai du mal à comprendre quel mapping(address => uint256) nonces; et uint256 nonce = nonces[_from]; vraiment. Et évidemment, j’ai besoin de connaître la valeur pour définir _v _r _s

Réponses


 biplavo

Vous avez donc

mappage (adresse => uint256) des nonces ce qui signifie qu’une valeur uint256 est associée à une adresse. Laisse moi te donner un exemple

Supposons que vous ayez une adresse 0xa1bc et que vous souhaitiez mapper une valeur avec cette adresse, que la valeur soit 1234. Voici comment cela se fait

nonces [« 0xa1bc »] = 1234;

et pour obtenir la valeur associée à l’adresse

uint256 temp = nonces [« 0xa1bc »]

Ici, j’ai attribué la valeur à temp, donc temp sera 1234. Si le mappage n’est pas présent, la valeur sera 0 (zéro).

Vous pouvez voir exactement ces comportements dans la fonction transferProxy ,

uint256 nonce = nonces [_from];

nonces [_from] = nonce + 1;

Ainsi, dans la fonction, il lit d’abord le nonce associé à une adresse _from, fait un peu de travail et enfin augmente le nonce d’un et l’enregistre à la même adresse _from.

Maintenant, pour en venir à votre prochain problème concernant _v, _r et _s,

Vous avez raison sur le signe web3.eth.sign . Vous pouvez signer un morceau de message par web3.eth.sign (data, privatekey) et sa variante. Cela vous donnera un objet de signature. Cette signature peut être décomposée en v, r et s. Alors, comment pouvez-vous obtenir ces valeurs? Faites attention.

var sign = web3.eth.sign (données, clé privée);

var v = sign.v;

var r = sign.r;

var s = sign.s;

Ces v, r et s sont les valeurs que vous devez envoyer à la fonction transferproxy dans le contrat.

Alors, pourquoi avez-vous besoin de ces valeurs? Vous pouvez y voir une fonction ecrecover qui prend ces valeurs comme paramètres. Il s’agit d’une fonction intégrée fournie par Solidity. Il donne l’adresse de l’utilisateur qui a signé les données. Voici h le hachage des données que vous souhaitez signer.

Mais ici, nous pouvons voir que vous n’avez pas envoyé le hachage h pour contracter. Pourquoi? Parce que vous pouvez construire le message d’origine avec les données présentes dans le contrat lui-même. Et ce message d’origine est _from, _to, _value, _fee, nonce . Cela signifie que du côté client, vous avez enregistré ou connu ces valeurs à l’avance.

var sign = web3.eth.sign (_from + _to + _value + _fee + nonce, privatekeyOf_from);

Ainsi, l’appel de fonction de contrat dans la face avant ressemblera à

contractInstance.transferProxy.sendTransaction (from, to, value, fee, nonce, v, r, s, {from: …..});

if (_from! = ecrecover (h, _v, _r, _s)) revert (); s’assure que l’utilisateur avec l’adresse _from a effectivement signé les données ou non. Sinon, annulez (annulez les modifications) la transaction.

Pour en venir à votre première question, plusieurs paramètres seront concaténés puis hachés.

user2284570

Alors, quelle serait la valeur de nonce la première fois que j’appelle pour envoyer et recevoir avec la même adresse 0x395BE1C1Eb316f82781462C4C028893e51d8b2a5 ?

biplavo

la valeur sera 0 dans ce cas. les valeurs par défaut sont 0, false pour les types int, booléens respectivement.

user2284570

Encore une chose. Comment convertir les paramètres dans le type de solidité attendu?

biplavo

Envoyez simplement ces valeurs telles quelles. l’adresse et les octets seront des hexadécimaux. Si vous envoyez des valeurs codées en dur (non affectées à certaines variables), entourez l’adresse et les octets avec des guillemets.

user2284570

Actuellement, tout est en chaîne. Je suppose que je ne peux pas simplement concaténer des valeurs de chaîne pour keccak256.


 Jaime

Tout d’abord, keccak256 ne prend normalement qu’un seul argument (les données à hacher). Je n’ai aucune idée de ce que fait l’utilisation de plusieurs paramètres. Ajout des données? Si oui comment? Hacher les hashs? tout à la fois ou ressasser après chaque résultat?

Des docs en solidité:

keccak256 (…) renvoie (octets32): calcule le hachage Ethereum-SHA-3 (Keccak-256) des arguments (serrés)

Par conséquent, les données à hacher sont les paramètres très (_from,_to,_value,_fee,nonce) donc keccak256(_from,_to,_value,_fee,nonce) calcule le hachage du mot binaire qui est dérivé de la réunion de ces cinq éléments paramètres.

Deuxièmement, je pense que pour obtenir _v, je dois utiliser web3.eth.sign avec web3.eth.sign (« 0x395BE1C1Eb316f82781462C4C028893e51d8b2a5 », keccak256 (« données »)). Mais si ce n’est pas le cas, je ne sais pas ce que je dois utiliser Third, aucune idée de _r n’est sur le point. Quatrièmement, je pense que comprendre _s concerne un rappel HTtp (en lisant la documentation). Mais il semble que je ne puisse pas le laisser à 0 car je ne sais pas quoi rappeler.

Ces paramètres sont obtenus à partir de la signature. Dans la signature web3, une transaction fournit la signature et les paramètres r, s et v. Ces paramètres peuvent également être dérivés de la signature elle-même, voir la documentation web3 sur la façon d’obtenir r, s et v et aussi cette réponse

ET LA chose la plus difficile. Comment déterminer exactement les paramètres nonce dans keccak256? (même si je n’ai aucune idée de comment l’appeler), parce que j’ai du mal à comprendre quel mappage (adresse => uint256) nonces; et uint256 nonce = nonces [_from]; vraiment. Et évidemment, j’ai besoin de connaître la valeur pour définir _v _r _s

le mappage prend en entrée une adresse et renvoie un nombre, ce nombre est le nonce. Par conséquent, nonce[_from] demande le nonce pour l’adresse _from . Cette valeur nonce est fondamentalement un compteur qui s’incrémente chaque fois qu’une transaction est exécutée à partir de l’adresse _from .

J’espère que cela t’aides.

user2284570

En regroupant les paramètres de keccak256 vous voulez dire concaténer? Si oui en octet ou en chaîne?

user2284570

the mapping takes as input an address and returns a number, that number is the nonce. Therefore, nonce[_from] is requesting the nonce for the address _from. This nonce value is basically a counter that increments every time a transaction is executed from the address _from. Cela ne dit pas comment j’obtiens le nonce pour le hachage.

Jaime

Oui, signifie qu’ils sont concaténés étroitement, ce qui signifie que la valeur hexadécimale de chaque variable selon le type est concaténée.

user2284570

La variable nonce est calculée du côté mineur. Comment le calculer avec Javascript? Ou dois-je vraiment prendre la peine de l’obtenir pour les paramètres de récupération électronique?

user2284570

web3.eth.personal.ecRecover si pour calculer le hachage. Est- ce que web3.eth.sign est requis pour faire l’inverse?

 

#de, appeler, avec, cette, comment, contrat, du, fonction, l’exécution, lors, Solidité, web3js

 

yahoo

Laisser un commentaire

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