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.
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
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
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