2017-04-20 2 views
0

J'essaie de changer la valeur d'une variable dans un contrat qui se trouve dans la chaîne de blocs. J'ai déduit son code et est quelque chose comme ceci:Solidité: modifiez la valeur d'une variable dans un contrat intelligent déjà publié

pragma solidity ^0.4.8; 
contract Trial { 
    address public owner; 
    address public person; 
    uint initialEther; 
    function Trial(address _person) payable { 
     owner = msg.sender; 
     person = _person; 
     initialEther = msg.value; 
    } 
    modifier only_person() { 
     if (msg.sender!=person && tx.origin!=person) throw; 
     _; 
    } 


    function() payable {} 

    bytes4 public signature = bytes4(sha3("libraryFunction()")); 
    bool variableToBeChanged = false; 
    function libraryInvocation(address libraryAddress) only_person { 
     bool doSomething = libraryAddress.delegatecall(signature); 
     if (variableToBeChanged) { 
      ..... 
     } 
    } 
} 

Supposons que j'ai la signature à droite de la fonction de bibliothèque, ce que je suis en train de faire est de changer la valeur de « variableToBeChanged » afin de exécute le code à l'intérieur du if. Il existe probablement un moyen de créer une bibliothèque avec une fonction avec un nom propre et d'insérer du code assembleur d'une manière ou d'une autre pour changer la valeur de la variable. Mais c'est comme utiliser une bombe atomique pour tuer une fourmi. Je cherche la façon la plus simple de le faire. Je sais aussi que ce contrat n'est pas sûr, j'essaie de comprendre si c'est possible et je veux comprendre à quel point cela peut être risqué pour un contrat.

Répondre

2

Sans une fonction qui change la variable, cela n'est pas possible. Une fois le code de contrat déployé, il est définitif, aucun changement n'est possible. Vous devez déployer un nouveau contrat.

Vous pouvez contrôler avec votre contrat quel portefeuille est autorisé à appeler la fonction en vérifiant l'attribut msg.sender pour une adresse de portefeuille spécifique.

address owner = 0x2FD4...; 
if(msg.sender != owner) throw; 
     //code afterwards) 
+0

Je ne pense pas. Je sais avec certitude que dans un contrat comme celui-ci, c'est possible. Par exemple, supposons créer une bibliothèque comme celle-ci: https://paste.ofcode.org/8bgCLXjdHb7cNY4ETM72bn. Cela changerait la valeur de certaines variables. – Pietro

+1

Je ne sais pas comment cela fonctionne. Mais vous ne pouvez pas modifier un contrat après le déploiement. Vous avez besoin de fonctions pour changer les variables. – Simon

+0

Cela fonctionne en raison de l'appel délégué qui est utilisé pour les contrats dynamiques. De cette manière, les contrats peuvent être mis à jour. – Pietro