Ce texte décrit l'abstraction d'un système de confiance, qui vous permet d'intégrer les services d'entiercement dans n'importe quel domaine des relations économiques.
Le dépôt de fonds est un élément fondamental de toute transaction. Si les contreparties ne connaissent pas d'informations fiables les unes sur les autres, le risque de fraude augmente. Cette approche vous permet de programmer dans un réseau décentralisé un modèle de résolution des litiges, un modèle pour effectuer des transactions automatiques, des transactions sécurisées, etc. De plus, un tel modèle de système de confiance est ouvert. Toutes les transactions effectuées avec la participation de la hiérarchie des portefeuilles multi-abonnements nous permettent de vérifier la notation de la contrepartie et nous protègent également des stratagèmes frauduleux des nouveaux participants aux relations économiques.
Table des matières
1
Introduction2
Description d'un portefeuille multi-signatures3
façons de créer une hiérarchie de portefeuille4
Interface de hiérarchie du portefeuille sur plusieurs jours5
flux d'interaction5.1
Flux d'interaction standard5.2
Flux d'interaction sécurisé5.3
Flux d'interaction controversé6
Protocole ESCB97
Intégration d'un système de confiance et de contrats intelligents mettant en œuvre le protocole ESCB98
Exemples de contrats mettant en œuvre le SEBC98.1
Contrat intelligent pour le marché locatif privé, à l'instar d'AirBnb8.2 Un
contrat intelligent pour échanger n'importe quelle crypto-monnaie contre de la monnaie fiduciaire en retour en mode décentralisé9
nœuds d'arbitrage10
Dictionnaire1. Introduction
Le principal problème des services d'entiercement est la création de relations de confiance entre tous les participants. De plus, les participants eux-mêmes ne doivent pas nécessairement être connus de chaque sujet de relations. Pour résumer tous les cas, nous tiendrons compte du fait qu'ils sont tous anonymes. Pour un tel système de relations de confiance, il est important de réguler les relations des nouveaux participants avec les anciens. Les anciens participants ont déjà une certaine note dans le système de relations et provoquent ainsi plus de confiance. Étant donné que personne ne connaît personne dans le système de confiance, cela entraîne des problèmes de vérification de la note précédente. Ce document décrit le système de confiance basé sur des crypto-portefeuilles multi-abonnement. Un tel système peut être programmé dans un contrat intelligent. Compte tenu de la large diffusion de la plate-forme Ethereum, nous choisirons cette plate-forme comme plate-forme pour décrire tous les contrats intelligents dans ce document.
2. Description d'un portefeuille multi-signatures
Une abstraction qui vous permet de confirmer ou d'annuler des transactions uniquement si un consensus est atteint entre les participants autorisés à prendre une telle décision s'appelle un portefeuille multi-signatures. Une transaction dans ce contexte est une opération atomique programmée pour exécuter une méthode dans un autre ou le même contrat intelligent.
L'interface pour le contrat Smart d'une telle abstraction peut être représentée comme:
- le constructeur accepte les adresses des membres fondateurs et le nombre de confirmations minimales requises pour les transactions
constructor(address[]:members, uint256:requiredConfirmationCount)
- Interface de participant autorisé
- obtenir une liste des participants
static getMembers() -> address[]:address
- afficher l'adresse du membre
static getMember(uint256:indexNumber) -> address:address
- vérification de l'adresse d'adhésion
static isMember(address:address) -> bool:value
- obtenir le nombre maximum de participants pour le portefeuille
static getMaxMemberCount() -> uint256:value
- Confirmation du consensus minimum
static getRequiredConfirmationCount() -> uint256:value
- en cas d'ajout d'un nouveau membre
event MemberAddition() -> address:member
- événement de suppression de membre
event MemberRemoval() -> address:member
- changement d'événement nombre de confirmations à exécuter
event RequiredConfirmationCountChange() -> uint256:count
- ajouter un membre
execute addMember(address:member) -> void:value
- suppression de membre
execute removeMember(address:member) -> void:value
- remplacement de membre
execute replaceMember(address:currentMember, address:newMember) -> void:value
- modification du nombre de confirmations obligatoires d'exécution
execute changeRequiredConfirmationCount(uint256:count) -> void:value
- Interface de transaction
- vérification de la confirmation de transaction à l'adresse du participant
static getConfirmationByAddress(uint256:indexNumber, address:addressMember) -> bool:value
- obtenir des informations d'une transaction
static getTransactionInfo(uint256:indexNumber) -> [address:destination, uint256:value, bytes:data, bool:executed]
- obtenir le nombre total de transactions dans ce portefeuille
static getTransactionCount() -> uint256:value
- recevoir le statut de confirmation de transaction
static isConfirmed(uint256:transactionId) -> bool:value
- recevoir le nombre de confirmations
static getConfirmationCount(uint256:transactionId) -> uint256:count
- obtenir le nombre de transactions par type
static getTransactionCount(bool:pending, bool:executed) -> uint256:count
- obtenir la liste des participants qui ont confirmé la transaction
static getConfirmations(uint256:transactionId) -> address[]:confirmations
- obtenir une liste d'ID de transaction par type dans un certain laps de temps
static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds
- événement de confirmation de transaction de partie
event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- événement de retrait de confirmation du participant avant la transaction
event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- transaction d'ajout de file d'attente événement
event Submission() -> [uint256:transactionId]
- événement d'exécution de transaction
event Execution() -> [uint256:transactionId]
- événement d'erreur de transaction
event ExecutionFailure -> [uint256:transactionId]
- événement de réapprovisionnement de portefeuille
event Deposit -> [address:sender, uint256:amount]
- membre ajoutant une transaction
execute submitTransaction(address:destination, uint256:value, bytes:data) -> uint256:transactionId
- confirmation de transaction par le participant
execute confirmTransaction(uint256:transactionId) -> void:value
- retrait de la confirmation par le participant
execute revokeConfirmation(uint256:transactionId) -> void:value
- transaction manuelle
execute executeTransaction(uint256:transactionId) -> void:value
3 façons de créer une hiérarchie de portefeuille
Il existe deux façons principales de créer un système de confiance. Vertical et horizontal. La construction horizontale implique la création d'une liste de portefeuilles enfants par un parent principal. La construction verticale implique une chaîne composée de portefeuilles enfants en référence au parent. Dans ce cas, le portefeuille parent peut être un enfant d'un autre portefeuille parent.
Comme nous le voyons, le chemin de construction horizontal peut être une sous-espèce du chemin de construction vertical. Par conséquent, nous laissons cette approche sans surveillance.
4 Interface de hiérarchie du portefeuille sur plusieurs jours
Pour construire un système de confiance, il est nécessaire d'étendre l'interface simple du portefeuille multi-abonnement décrit ci-dessus, en ajoutant des mécanismes de régulation de la hiérarchie et de l'exécution automatique des confirmations, ainsi que la possibilité d'une exécution différée.
- Le constructeur accepte l'adresse du portefeuille parent, les adresses des membres fondateurs, le nombre de confirmations minimales requises pour les transactions, le délai standard pour les confirmations automatiques en secondes
constructor(address:parent, address[]:members, uint256:requiredConfirmationCount, uint256:standardTimeAutoConfirmation)
- Interface membre
- obtenir une liste des participants
static getMembers() -> address[]:address
- fonction pour afficher l'adresse du participant
static getMember(uint256:indexNumber) -> address:address
- vérification de l'adresse d'adhésion
static isMember(address:address) -> bool:value
- obtenir le nombre maximum de participants au portefeuille
static getMaxMemberCount() -> uint256:value
- Confirmation du consensus minimum
static getRequiredConfirmationCount() -> uint256:value
- en cas d'ajout d'un nouveau membre
event memberAddition() -> address:member
- événement de suppression de membre
event memberRemoval() -> address:member
- changement d'événement nombre de confirmations à exécuter
event requiredConfirmationCountChange() -> uint256:count
- ajouter un membre
execute addMember(address:member) -> void:value
- suppression de membre
execute removeMember(address:member) -> void:value
- remplacement de membre
execute replaceMember(address:currentMember, address:newMember) -> void:value
- modification du nombre de confirmations obligatoires d'exécution
execute changeRequiredConfirmationCount(uint256:count) -> void:value
- Interface de hiérarchie
- obtenir une liste de portefeuilles pour enfants
static getChildren() -> address[]:wallets
- vérifier si l'adresse du portefeuille est un enfant de l'actuelle
static isChild() -> bool:value
- Vérifier si l'adresse du portefeuille est parentale à l'adresse actuelle se fait via isChild en la contrastant.
- événement de fixation de portefeuille d'affiliation
event childAttachment() -> [address:address,uint256:timeStamp]
- événement de suppression de portefeuille enfant
event childRemoval() -> [address:address,uint256:timeStamp]
- apposer un portefeuille enfant
execute attachChild(addres:child) -> void:value
- supprimer le portefeuille enfant
execute removeChild(address:address) -> void:value
- changer un portefeuille enfant à un autre
execute replaceChild(address:newAddress) -> void:value
- Interface de transaction
- vérifier l'état de la transaction
static getTransactionStatus(uint256:transactionId) -> enum:{submitted,completed,frozen,disputed,reverted}
- vérification de la conformité de l'état des transactions
static isTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> bool:value
- vérification de la confirmation de transaction à l'adresse du participant
static getConfirmationByAddress(uint256:transactionId, address:addressMember) -> bool:value
- obtenir des informations d'une transaction
static getTransactionInfo(uint256:transactionId) -> [address:destination, uint256:value, bytes:data, bool:executed]
- obtenir le nombre total de transactions dans le portefeuille
static getTransactionCount() -> uint256:value
- recevoir le statut de confirmation de transaction
static isConfirmed(uint256:transactionId) -> bool:value
- recevoir le nombre de confirmations
static getConfirmationCount(uint256:transactionId) -> uint256:count
- obtenir le nombre de transactions par type
static getTransactionCount(bool:pending, bool:executed) -> uint256:count
- obtenir la liste des participants qui ont confirmé la transaction
static getConfirmations(uint256:transactionId) -> address[]:confirmations
- obtenir du temps pour la confirmation automatique
static getTimeAutoConfirmation(uint256:transactionId) -> uint256:timestamp
- obtenir une liste d'ID de transaction par type dans un certain laps de temps
static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds
- événement de confirmation de transaction de partie
event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- événement de confirmation automatique de transaction
event AutoConfirmation() -> [uint256:transactionId, uint256:timeStamp]
- événement de retrait de confirmation du participant avant la transaction
event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- transaction d'ajout de file d'attente événement
event Submission() -> [uint256:transactionId]
- événement d'exécution de transaction
event Execution() -> [uint256:transactionId]
- événement d'erreur de transaction
event ExecutionFailure -> [uint256:transactionId]
- changement d'état de transaction en événement gelé
event TransactionFrozen -> [uint256:transactionId]
- changement de statut de transaction en événement controversé
event TransactionDisputed -> [uint256:transactionId]
- changement de statut de transaction en événement retourné
event TransactionReverted -> [uint256:transactionId]
- événement de réapprovisionnement de portefeuille
event Deposit -> [address:sender, uint256:amount]
- ajouter une transaction à exécuter
execute submitTransaction(address:destination, uint256:value, uint256:TimeAutoConfirmation, bytes:data) -> uint256:transactionId
- confirmation de transaction
execute confirmTransaction(uint256:transactionId) -> void:value
- confirmation de révocation
execute revokeConfirmation(uint256:transactionId) -> void:value
- changer le statut de la transaction en gelé
execute setTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> void:value
- transaction manuelle
execute executeTransaction(uint256:transactionId) -> void:value
- Gestion des notations
- obtenir une note à
static getRatingByAddress(address:agent) -> [uint256:negativeRating, uint256:positiveRating, uint256:countRatingRecords]
- obtenir l'historique des évaluations par adresse et numéro de série
static getRatingRecordForAddress(address:agent, uint256:indexNumber) -> void:value
- en cas d’ajout d’un enregistrement au classement
event RatingRecordAdded -> [address:author, address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment, uint256:indexNumber]
- ajouter un enregistrement à l'évaluation de l'adresse
execute addRatingRecord(address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment) -> void:value
- Intégration avec le protocole ESCB9
- vérifier à l'adresse si le contrat intelligent attaché à ce portefeuille est un contrat intelligent avec implémentation ESCB9
static isAttachedESCB9SmartContract(address:smartContract) -> bool:result
- vérifier l'état du dépôt pour un contrat intelligent avec ESCB9 attaché à ce portefeuille
static getDepositStatusForESCB9SmartContract(address:smartContract) -> enum:{awaiting,founded,returned}
- en cas d'attachement d'un contrat intelligent avec la mise en œuvre du portefeuille ESCB9
event AttachingESCB9SmartContract -> [address:smartContract]
- événement de dépôt pour un contrat intelligent avec mise en œuvre du portefeuille ESCB9 attaché
event ConfirmationForDepositESCB9SmartContract -> [address:smartContract, uint256:sum, bytes:notice]
- attacher un contrat intelligent avec la mise en œuvre de ESCB9 au portefeuille
execute attachESCB9SmartContract(address:smartContract) -> void:value
- confirmation de dépôt pour contrat intelligent avec mise en œuvre ESCB9. Si le dépôt est dans le système externe, l'avis aura une étiquette. Si le dépôt est en ETH, le montant du dépôt est envoyé lorsque la méthode est exécutée.
execute fundDepositForESCB9SmartContract(address:smartContract, uint256:sum, bytes:notice) -> void:value
5 flux d'interaction
Tout contrat intelligent peut être intégré dans la hiérarchie des portefeuilles multi-signatures. Une telle intégration aura des flux d'interactions. De manière générale, on distingue plusieurs types de flux:
- Standard . Sous cette forme, la transaction a lieu automatiquement. Sans la participation des membres autorisés de la hiérarchie des portefeuilles.
- Protégé . Sous cette forme, le temps de transaction peut être augmenté de la norme de confirmation automatique de l'heure au nécessaire. Dans ce cas, la participation des membres autorisés de la hiérarchie du portefeuille est nécessaire.
- Controverse . Dans ce formulaire, le participant à la transaction peut geler la transaction. Dans ce cas, la participation des membres autorisés de la hiérarchie du portefeuille est nécessaire pour parvenir à un consensus.
Chaque portefeuille du système de fiducie compte un certain nombre de participants plénipotentiaires, qui rendent un verdict. Pour un raisonnement simple, nous allons combiner tous les participants autorisés dans le portefeuille en un seul concept - l'
arbitre .
5.1 Flux d'interaction standard
Pour simplifier la présentation, nous apportons les concepts de biens et services au concept d'objet de transfert (objet), et le concept de monnaie fiduciaire, les crypto-monnaies au concept de moyen de transfert (moyen).
La contrepartie, le propriétaire de l'objet conclut un accord avec la contrepartie, le propriétaire des fonds, à des fins d'échange. Dans ce cas, le propriétaire de l'objet crée un contrat d'entiercement intelligent en envoyant une transaction standardisée à l'un des portefeuilles autorisés dans la hiérarchie des portefeuilles multi-signatures. Dans ce cas, la transaction est enregistrée par un tiers en tant que système de confiance. Pour chaque transaction, l'heure standard de son exécution est déterminée. La contrepartie, le propriétaire des fonds, effectue un dépôt sur la transaction en transférant des fonds dans le système de fiducie. Après cela, le propriétaire de l'objet transfère l'objet au propriétaire des fonds. Le propriétaire des fonds vérifie la qualité de l'objet. Si avant la fin du temps de la transaction, il n'a pas confirmé la qualité, les fonds sont transférés au propriétaire de l'objet dans le cadre de la transaction. Les deux contreparties se donnent mutuellement des notes de confort. Ainsi, le propriétaire des fonds peut modifier le flux d'interaction jusqu'à ce que la transaction soit terminée. Après le transfert de fonds au propriétaire de l'objet, le propriétaire des fonds peut demander un porte-monnaie supérieur au niveau de la hiérarchie pour résoudre les litiges dans le délai spécifié par le règlement. Passé ce délai, les notations de la transaction sont appliquées aux deux parties et la transaction devient irrévocable.
5.2 Flux d'interaction sécurisé
Si, pour des raisons indépendantes de la volonté des contreparties, le délai de transaction doit être prolongé, alors, d'un commun accord des parties, le portefeuille de hiérarchie multi-signatures (arbitre) peut modifier le délai imparti pour la transaction. Après avoir modifié l'heure, le flux d'interaction alloué à la transaction revient au niveau logique du flux standard.
5.3 Flux d'interaction controversé
Si la qualité de l'objet lors de la transaction ne convient pas à la contrepartie, propriétaire des fonds qu'il contribue au système de confiance de la hiérarchie des portefeuilles multi-signatures, la transaction peut être gelée. Dans ce cas, le dépôt n'est pas transféré à la contrepartie, propriétaire de l'objet jusqu'à ce qu'un verdict sur la transaction soit émis. Le détenteur des fonds doit fournir des preuves substantielles à l'arbitre de la transaction. Après cela, l'arbitre rend un verdict en faveur de l'une des contreparties. Si une partie à la transaction n'est pas satisfaite du verdict, elle se tourne vers un portefeuille supérieur dans l'ordre de la hiérarchie des portefeuilles multi-signatures. Après avoir passé toutes les instances de la hiérarchie, chaque partie peut demander un vote public. Cette mesure exceptionnelle ne peut être attribuée que par un sac à main absolu.
6 Protocole ESCB9
Un exemple du protocole ESCB9 dans Solidity en tant que contrat intelligent abstrait (le protocole est en cours de développement et est susceptible de changer)
contract ESCB9 { modifier onlyArbitrage() { require(msg.sender == arbitrage()); _; } modifier isDeposited { uint i; bytes memory _funcName = bytes4(keccak256("getDepositStatusForESCB9SmartContract(address)")); bytes memory _concat = new bytes(_funcName.length + 32); for(i=0; i < address(this).length; i++) { _concat[i] = address(this)[i]; } require(arbitrage().call.value(0)(_concat) == 1);
7 Intégration d'un système de confiance et de contrats intelligents mettant en œuvre le protocole ESCB9
Pour utiliser le système de confiance de la hiérarchie des portefeuilles multi-signatures dans votre propre projet, vous devez créer un contrat intelligent qui implémente la norme ESCB9 et attacher un tel contrat intelligent à l'un des arbitres qui n'a pas de portefeuilles subsidiaires. Ces portefeuilles dans une hiérarchie à abonnements multiples sont appelés «nœuds d'entrée». Tous les portefeuilles multi-signatures en amont sont appelés «nœuds d'arbitrage».
8 Exemples de contrats mettant en œuvre le SEBC9
8.1 Contrat intelligent pour le marché locatif privé, à l'instar d'AirBnb
8.2 Un contrat intelligent pour échanger n'importe quelle crypto-monnaie contre de la monnaie fiduciaire en retour en mode décentralisé
L'exemple de contrat Smart décrit ci-dessous vous permet d'échanger BTC contre de l'argent fiduciaire directement, sans la participation d'échangeurs et de services tiers. Le vendeur BTC transfère le montant du contrat intelligent au dépôt dans la blockchain BTC. L'acheteur, après confirmation de l'acompte par l'arbitre, transfère automatiquement le montant prévu au contrat sur le compte ou le numéro de carte plastique inclus dans le contrat. L'arbitre peut intervenir dans le processus de transaction après l'appel de l'un des participants. Initialement, le dépôt sera gelé et si les parties ne s'entendent pas par consensus, alors un tel contrat deviendra contesté avec une résolution supplémentaire sur le flux d'interaction contestée.
9 nœuds d'arbitrage
Pour maintenir le travail du système de confiance, une hiérarchie de portefeuilles multi-signatures est introduite. Les nœuds d'arbitrage, c'est-à-dire les portefeuilles de la hiérarchie qui ont des portefeuilles subsidiaires sous eux, agissent comme garants du règlement des différends. Les plénipotentiaires de ces nœuds ne peuvent être nommés que par une hiérarchie supérieure. Chaque participant autorisé reçoit une récompense en distribuant des dividendes et des bonus pour travailler avec des flux d'interaction contestés. La taille du bonus est déterminée par consensus.
Pour obtenir le statut de participant autorisé dans un nœud d'arbitrage, il est nécessaire d'avoir une quantité de jetons définie par consensus à l'adresse d'un participant autorisé.
Ainsi, la réception stable des dividendes par tous les participants des nœuds d'arbitrage est garantie. Plus la hiérarchie d'un portefeuille multi-signatures est élevée, plus les jetons nécessaires doivent être présents à l'adresse d'un participant autorisé.10 Dictionnaire
Ethereum est une technologie open source qui vous permet de créer une chaîne de transactions décentralisée et immuable. Chaque transaction peut être effectuée avec certaines conditions enregistrées dans un contrat intelligent.Contrat intelligent - écrit en Solidity, la logique exécutée dans la machine virtuelle Ethereum, qui vous permet d'étendre la logique de transaction.Un portefeuille multi-signatures (arbitre) est un contrat intelligent spécial contrôlé par un groupe de participants autorisés qui peuvent confirmer ou annuler des transactions. En utilisant le mécanisme des portefeuilles à abonnements multiples, vous pouvez créer une chaîne de passerelles pour les transactions et surveiller en temps opportun l'exécution ou le remboursement.Le propriétaire d'un objet - est un propriétaire, un fournisseur, un développeur d'un logiciel, etc. C'est-à-dire une personne qui met en œuvre l'objet et reçoit finalement un dépôt en récompense.Le propriétaire des fonds - est un locataire, un acheteur, un client d'un produit logiciel, etc. C'est-à-dire une personne qui dépose un dépôt sur un objet pour acheter un produit ou un service.