Blockchain Democracy – The Startup
Un guide pratique pour les développeurs de contrats intelligents
Lorsque vous votez pour quelque chose, comment savez-vous que quelque chose sera réellement fait? Comment savez-vous que les promesses seront tenues?
Dans cet article, je vais vous donner un aperçu de la façon dont la blockchain peut changer la démocratie. Avec un processus démocratique blockchain, les promesses deviennent des actions.
Je ne vais pas dire que nous pouvons ou devons supprimer les politiciens et installer une technocratie, mais je vais montrer comment gérer un système de vote où les propositions seront automatiquement adoptées si le vote réussit.
On pourrait appeler cela une démocratie imparable.
Design conceptuel
Pour commencer, permettez-moi de préparer le terrain avec deux qualités de contrat intelligent:
- Un contrat intelligent est un programme immuable. Les règles codées dans un contrat intelligent ne peuvent pas être modifiées. Une fois déployé, il ne peut pas non plus être arrêté.
- Un contrat intelligent peut également déclencher des actions sur d’autres contrats intelligents. Par exemple, un contrat intelligent peut en déclencher un autre pour débloquer des fonds sur un certain compte ou pour donner à quelqu’un la permission d’exécuter certaines transactions.
En appliquant ces concepts, nous pouvons coder un contrat intelligent qui exécute un processus de vote équitable, selon des règles claires que tout le monde peut voir. Dans ce contrat intelligent, nous pouvons inclure une proposition, qui est un appel à une fonction dans un autre contrat intelligent.
Le vote aura lieu, quoi qu’il arrive. Si le vote réussit, la proposition sera adoptée, quoi qu’il arrive.
Ethereum et démocratie
Le vote est l’un des piliers de la démocratie, et c’est également l’un des principaux éléments constitutifs d’Ethereum.
On pense que Vitalik Buterin a rompu avec Bitcoin et a proposé à Ethereum de créer une plate-forme qui permettrait la mise en œuvre d’organisations démocratiques, en utilisant les principes que nous avons décrits ci-dessus.
Ces organisations démocratiques basées sur la blockchain sont connues sous le nom de Organisations autonomes décentraliséesou DAO pour faire court. Les DAO sont dirigés par leurs parties prenantes, avec des règles encodées dans un contrat intelligent blockchain et sans contrôle central.
Lorsque vous votez pour quelque chose, comment savez-vous que quelque chose sera réellement fait? Comment savez-vous que les promesses seront tenues?
Lire le article wikipedia pour les DAO est très intéressant. Il révèle à quel point l’idée d’un DAO a été conçue et à quel point elle était puissante. Daniel Larimer (de renommée BitShares, Steem et EOS.IO) a proposé le concept et l’a implémenté dans BitShares dès 2013. Ensuite, vous avez également Le DAO (Đ) qui, avant d’être piraté, a réussi à attirer 14% de l’éther en circulation dans son organisation axée sur l’investissement.
Cependant, la disparition de « The DAO » ne signifiait pas la disparition de « the DAO ». Organisations autonomes décentralisées sont bien vivants, maintenant que la vulnérabilité qui a tué The DAO est bien connue et facilement évitée.
Vlad Farcas et j’ai commencé un projet DAO jouet, car nous voulions apprendre à appliquer le motif. En codant un DAO, j’ai compris les possibilités de processus démocratiques dans la blockchain, et cela m’a époustouflé. C’est pourquoi j’écris ceci.
Présentation terminée, examinons le code. Comment peut-on le faire?
Adopter des propositions de contrats intelligents
Considérez le contrat ci-dessous:
contract Proposal {
address public targetContract;
bytes public targetCall; /// @param targetContract_ The address of the target contract for
/// a proposal to be enacted.
/// @param targetCall_ The abi encoding of a function call in the
/// target contract, with arguments
constructor(
address targetContract_,
bytes memory targetCall_,
) public {
targetContract = targetContract_;
proposalData = targetCall_;
} /// @dev Function to enact one proposal of this voting.
function enact() external virtual {
(bool success, ) = targetContract.call(targetCall);
require(success, “Failed to enact proposal.”);
}
}
Ce contrat fait de la magie de bas niveau, mais il n’est pas trop difficile à expliquer. Au déploiement, il faut l’adresse d’un autre contrat et un appel de fonction. En appelant enact()
il exécute l’appel de fonction sur le contrat cible.
L’encodage de la proposition peut être fait avec web3j. En javascript, l’exemple ci-dessous a Proposal
est déployé qui frappera un ERC20
jeton lorsqu’il est adopté.
token = await ERC20Mintable.new(‘Token’, ‘TKN’, 18);
proposalData = web3.eth.abi.encodeFunctionCall(
{
type: ‘function’,
name: ‘mint’,
payable: false,
inputs: [
{name: ‘account’, type: ‘address’},
{name: ‘amount’, type: ‘uint256’},
],
},
[owner, ‘1’]
);
proposal = await Proposal.new(token.address, proposalData);
web3.eth.abi.encodeFunctionCall
est un peu bavard, mais la seule chose qu’il fait est de compresser une signature de fonction et des arguments dans 32 octets de données.
Son premier paramètre désigne la signature en tant que fonction, appelée mint
, non payable, avec un address
paramètre appelé account
et un autre uint256
paramètre appelé amount
. Le deuxième paramètre attribue des valeurs aux paramètres comme owner
compte défini ailleurs, et le amount
de jetons à frapper comme 1.
Il existe des moyens beaucoup plus faciles pour qu’un contrat appelle une fonction sur un autre contrat. Jusqu’à présent, il est difficile de voir pourquoi nous ferions les choses de cette manière trop compliquée.
Continuez à lire, nous allons maintenant démocratiser cette proposition. Voyons un contrat qui promulgue des propositions, mais seulement après un vote réussi.
Un jeton, un vote
Vous pouvez trouver ceci contrat dans le référentiel HQ20, n’hésitez pas à jouer avec, mais ne l’utilisez pas tel quel dans un but réel. Pour faciliter la compréhension, nous n’avons pas corrigé un certain nombre de vulnérabilités, par exemple contre les attaques de prêt flash.
Dans ce OneTokenOneVote.sol:
- Les votes sont des jetons d’un contrat ERC20, choisis au moment du déploiement.
- Voter signifie transférer des jetons vers
OneTokenOneVote
en utilisantvote()
- Une proposition est adoptée si à tout moment
OneTokenOneVote
détient une proportion supérieure à lathreshold
de tous les jetons en circulation. - Une fois la proposition acceptée, elle reste dans le
passed
état pour toujours. - Les électeurs peuvent
cancel
leurs votes et récupérer leurs jetons à tout moment, mais s’ils veulent que la proposition soit adoptée, ils doivent le faire après son adoption. - Tout le monde peut déclencher le dépouillement du vote en appelant
validate()
. Cela fera passer le vote si lethreshold
est rencontré.
Il y a plusieurs façons de mettre en œuvre un vote. Il existe des moyens plus sûrs de voter, notamment en exigeant le quorum. OneTokenOneVote.sol
était l’exemple le plus simple auquel nous pouvions penser, mais il suffit de montrer les principes de la démocratie blockchain.
Lorsque le vote est déployé, il accepte comme proposition un targetContract
et targetFunction
avec ses paramètres encodés. Si le vote réussit, le enact()
La fonction peut être appelée par n’importe qui pour exécuter la proposition.
Cela signifie que le contrat de vote comprend les mesures à prendre en cas de réussite du vote. Il n’est pas possible d’ignorer le résultat du vote. C’est le peu qui était impossible avant la blockchain, pensez-y.
Démocratie Smart Contract
Il y a une autre tournure que nous pouvons donner à ce concept de démocratie blockchain. Jusqu’à présent, nous savons comment déployer un contrat qui exécutera un processus de vote et ensuite adopter le résultat.
Nous pourrions coder un contrat où toutes les fonctions pourraient seulement être exécutées si elles ont été votées ainsi. C’est l’esprit d’un DAO, et c’est plus facile qu’il n’y paraît.
Dans le référentiel, nous avons inclus un troisième contrat, Democratic.sol, que je trouve vraiment passionnant à utiliser. Il permet à tout contrat de voter sur l’opportunité d’exécuter l’une de ses fonctions.
-
Democratic.sol
est conçu pour être hérité par d’autres contrats, permettant de marquer toutes les fonctions en eux comme exécutables uniquement s’ils ont voté. Vous feriez cela en utilisant leonlyProposal
modificateur. -
Democratic.sol
permet à quiconque de soumettre une proposition au vote. lepropose()
la fonction peut être utilisée par n’importe qui, avec la fonction cible encodée avecweb3.eth.abi.encodeFunctionCall
. - Les jetons de vote seront les mêmes pour toutes les propositions, créant une communauté comme avec les jetons MKR dans MakerDAO.
Democratic.sol
implémente tous les votes sur la base de jetons, mais cela pourrait facilement être changé en compte. - Les propositions sont toutes stockées dans un
proposals
et seules les propositions créées par le même contrat peuvent exécuter des fonctions marquées commeonlyProposal
.
Si vous y pensez, vous pouvez utiliser Democratic.sol
et OneTokenOneVote.sol
comme le base d’un système démocratique complet. Si vous ne trouvez pas ça excitant, je ne sais pas quoi vous dire d’autre.
Conclusion
La blockchain a le potentiel de changer les processus démocratiques à un degré jamais vu auparavant de notre vivant.
En utilisant la blockchain, il est possible de mettre en œuvre des votes imparables, que personne ne peut éviter d’être adopté s’ils passent. Alors que de plus en plus de notre monde est accessible à partir de la blockchain, le pouvoir de la démocratie augmentera.
Dans cet article, nous avons montré comment mettre en œuvre des procédures de vote qui peuvent déclencher des exécutions de contrats intelligents, et l’avons affiné pour produire des contrats intelligents dont les fonctions peuvent seulement être exécuté par des processus démocratiques.
Rien de tout cela n’est nouveau dans l’écosystème de la blockchain, ces concepts ont été étudiés et mis en œuvre depuis la conception d’Ethereum. Cependant, dans ces contrats, nous pensons que nous fournissons des éléments de base faciles à utiliser pour faire avancer la démocratie un peu plus loin.