Comment savoir si une adresse de l'Ethereum est un contrat?
Une adresse dans la Solidité peut être un compte ou d'un contrat (ou d'autres choses, comme une transaction). Quand j'ai une variable x, la tenue d'une adresse, comment puis-je tester si c'est un contrat ou pas?
(Oui, j'ai lu le le chapitre sur les types dans la doc)
OriginalL'auteur bortzmeyer | 2016-06-05
Vous devez vous connecter pour publier un commentaire.
Edit: Solidité a changé depuis cette réponse a d'abord été écrit, @manuel-aráoz a la réponse correcte.
Il n'existe aucun moyen dans la solidité de vérifier si une adresse est un contrat. L'un des objectifs de l'Ethereum est pour les humains et les smart contrats à la fois d'être traités de manière égale. Ceci mène à un avenir où les smart contrats d'interagir de façon transparente avec les humains et les autres contrats. Il pourrait changer dans l'avenir , mais pour l'instant arbitraire adresse est ambigu.
OriginalL'auteur nchinda2
Oui, vous pouvez, à l'aide de quelques GEV assemblée le code pour obtenir l'adresse de la taille du code:
OriginalL'auteur Manuel Aráoz
Ce n'est pas quelque chose que vous pouvez faire une requête à partir de l'intérieur d'un contrat à l'aide de la Solidité, mais si vous étiez juste envie de savoir si une adresse est titulaire code de contrat ou pas, vous pouvez vérifier à l'aide de votre geth console ou similaire avec par exemple:
avec la chaîne hexadécimale (ici
0xbfb2e296d9cf3e593e79981235aed29ab9984c0f
) que l'adresse que vous souhaitez interroger. Ce sera le retour de la pseudo-code binaire stockée à cette adresse.Vous pouvez également utiliser une blockchain scanner pour trouver le code source du contrat à cette même adresse, par exemple le ecsol bibliothèque comme indiqué sur etherscan.io.
OriginalL'auteur bekah
Ce que vous pouvez faire, vous avez accordé l'information à portée de main.
Si les opérations de l'adresse de l'expéditeur a été nulle ou inoccupés, alors vous pouvez dire si l'adresse est un contrat de compte ou d'une EOA (externe appartenant compte).
c'est à dire lors de l'envoi d'une création d'un contrat de transaction sur le réseau, puis les recevoir adresse dans la transaction est nulle et non utilisé.
De référence à partir de github:
https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions
Espère que cette aide.
OriginalL'auteur Malone
Réponse courte:
tx.l'origine est une référence de l'adresse d'origine qui lance cette série de l'appel de fonction, alors que le msg.l'expéditeur est l'adresse qui appelle directement la fonction cible. Ce qui signifie, tx.l'origine doit être un homme, msg.l'expéditeur peut être un contrat ou d'un humain. Donc, si quelqu'un vous appelle à partir d'un contrat, alors le msg.l'expéditeur est un contrat d'une adresse différente de tx.origine.
Je sais que la plupart des contrats peuvent utiliser @Manuel Aráoz du code, qui fonctionne dans la plupart des cas. Mais si vous appelez une fonction dans le constructeur d'un contrat, extcodesize sera de retour 0 qui échoue à l'isContract vérifier.
REMARQUE: N'utilisez PAS de tx.origine dans d'autres circonstances, si vous n'êtes pas clair sur ce qu'il représente, car .
OriginalL'auteur user7839155