Este texto describe la abstracción de un sistema de confianza, que le permite integrar servicios de custodia en cualquier área de las relaciones económicas.
Depositar fondos es una parte fundamental de cualquier transacción. Si las contrapartes no conocen información confiable entre sí, entonces aumenta el riesgo de fraude. Este enfoque le permite programar en una red descentralizada un modelo de resolución de disputas, un modelo para realizar transacciones automáticas, transacciones seguras, etc. Además, dicho modelo de un sistema de confianza está abierto. Todas las transacciones realizadas con la participación de la jerarquía de billetera de suscripción múltiple nos permiten verificar la calificación de la contraparte y también protegernos de esquemas fraudulentos de nuevos participantes en las relaciones económicas.
Contenido
1
Introducción2
Descripción de una billetera con firma múltiple3
formas de construir una jerarquía de billetera4
Interfaz de jerarquía de billetera de varios días5
flujos de interacción5.1
Flujo de interacción estándar5.2
Flujo de interacción segura5.3
Flujo controvertido de interacción6
Protocolo ESCB97
Integración de un sistema de confianza y contratos inteligentes que implementan el protocolo ESCB98
Ejemplos de contratos que implementan ESCB98.1
Contrato inteligente para el mercado de alquiler privado, siguiendo el ejemplo de AirBnb8.2 Un
contrato inteligente para el intercambio de cualquier criptomoneda por dinero fiduciario y de vuelta en un modo descentralizado9
nodos de arbitraje10
Diccionario1. Introducción
El principal problema para los servicios de custodia es la creación de relaciones de confianza entre todos los participantes. Además, los propios participantes no deben ser necesariamente conocidos por cada sujeto de las relaciones. Para resumir todos los casos, tendremos en cuenta que todos son anónimos. Para un sistema de relaciones tan confiable, es importante regular las relaciones de los nuevos participantes con los antiguos. Los antiguos participantes ya tienen una cierta calificación en el sistema de relaciones y, por lo tanto, causan más confianza. Como nadie conoce a nadie en el sistema de confianza, esto causa problemas con la verificación de la calificación anterior. Este documento describe el sistema de confianza basado en billeteras criptográficas de suscripción múltiple. Tal sistema se puede programar en un contrato inteligente. En vista de la amplia distribución de la plataforma Ethereum, elegiremos esta plataforma como la plataforma para describir todos los contratos inteligentes en este documento.
2. Descripción de una billetera con firma múltiple
Una abstracción que le permite confirmar o cancelar transacciones solo si se llega a un consenso entre los participantes autorizados para tomar tal decisión se llama billetera con firma múltiple. Una transacción en este contexto es una operación atómica programada para ejecutar un método en otro o el mismo contrato inteligente.
La interfaz para el contrato inteligente de tal abstracción se puede representar como:
- el constructor acepta las direcciones de los miembros fundadores y el número de confirmaciones mínimas requeridas para las transacciones
constructor(address[]:members, uint256:requiredConfirmationCount)
- Interfaz de participante autorizado
- obtener una lista de participantes
static getMembers() -> address[]:address
- ver la dirección del miembro
static getMember(uint256:indexNumber) -> address:address
- verificación de dirección para membresía
static isMember(address:address) -> bool:value
- obtener el número máximo de participantes para la billetera
static getMaxMemberCount() -> uint256:value
- Confirmación de consenso mínimo
static getRequiredConfirmationCount() -> uint256:value
- evento de agregar un nuevo miembro
event MemberAddition() -> address:member
- evento de eliminación de miembros
event MemberRemoval() -> address:member
- el evento de cambio requirió el número de confirmaciones para ejecutar
event RequiredConfirmationCountChange() -> uint256:count
- agregar miembro
execute addMember(address:member) -> void:value
- eliminación de miembros
execute removeMember(address:member) -> void:value
- reemplazo de miembros
execute replaceMember(address:currentMember, address:newMember) -> void:value
- cambio en el número de confirmaciones obligatorias para ejecución
execute changeRequiredConfirmationCount(uint256:count) -> void:value
- Interfaz de transacción
- verificación de la confirmación de la transacción en la dirección del participante
static getConfirmationByAddress(uint256:indexNumber, address:addressMember) -> bool:value
- obtener información de una transacción
static getTransactionInfo(uint256:indexNumber) -> [address:destination, uint256:value, bytes:data, bool:executed]
- obtener el número total de transacciones en esta billetera
static getTransactionCount() -> uint256:value
- recibir el estado de confirmación de la transacción
static isConfirmed(uint256:transactionId) -> bool:value
- recibir el número de confirmaciones
static getConfirmationCount(uint256:transactionId) -> uint256:count
- obteniendo el número de transacciones por tipo
static getTransactionCount(bool:pending, bool:executed) -> uint256:count
- obtener la lista de participantes que confirmaron la transacción
static getConfirmations(uint256:transactionId) -> address[]:confirmations
- obtener una lista de ID de transacción por tipo en un cierto período de tiempo
static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds
- evento de confirmación de transacción del partido
event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- evento de retiro de confirmación del participante antes de la transacción
event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- evento de agregar transacción de cola
event Submission() -> [uint256:transactionId]
- evento de ejecución de transacción
event Execution() -> [uint256:transactionId]
- evento de error de transacción
event ExecutionFailure -> [uint256:transactionId]
- evento de reposición de billetera
event Deposit -> [address:sender, uint256:amount]
- miembro agregando transacción
execute submitTransaction(address:destination, uint256:value, bytes:data) -> uint256:transactionId
- confirmación de la transacción por parte del participante
execute confirmTransaction(uint256:transactionId) -> void:value
- retiro de la confirmación por parte del participante
execute revokeConfirmation(uint256:transactionId) -> void:value
- transacción manual
execute executeTransaction(uint256:transactionId) -> void:value
3 formas de construir una jerarquía de billetera
Hay dos formas principales de construir un sistema de confianza. Vertical y horizontal. La forma horizontal de construir implica la creación de una lista de billeteras secundarias por parte de un padre principal. La forma vertical de construir implica una cadena que consiste en billeteras infantiles con referencia a los padres. En este caso, la billetera principal puede ser hija de otra billetera principal.
Como vemos, la ruta de construcción horizontal puede ser una subespecie de la ruta de construcción vertical. Por lo tanto, además dejamos este enfoque desatendido.
4 Interfaz de jerarquía de billetera de varios días
Para construir un sistema de confianza, es necesario expandir la interfaz simple de la billetera de múltiples firmas descrita anteriormente, agregando mecanismos para regular la jerarquía y la ejecución automática de confirmaciones, así como la posibilidad de una ejecución retrasada.
- El constructor acepta la dirección de la billetera principal, las direcciones de los miembros fundadores, el número de confirmaciones mínimas requeridas para las transacciones, el tiempo estándar para las confirmaciones automáticas en segundos
constructor(address:parent, address[]:members, uint256:requiredConfirmationCount, uint256:standardTimeAutoConfirmation)
- Interfaz de miembro
- obtener una lista de participantes
static getMembers() -> address[]:address
- función para ver la dirección del participante
static getMember(uint256:indexNumber) -> address:address
- verificación de dirección para membresía
static isMember(address:address) -> bool:value
- obtener el número máximo de participantes de la billetera
static getMaxMemberCount() -> uint256:value
- Confirmación de consenso mínimo
static getRequiredConfirmationCount() -> uint256:value
- evento de agregar un nuevo miembro
event memberAddition() -> address:member
- evento de eliminación de miembros
event memberRemoval() -> address:member
- el evento de cambio requirió el número de confirmaciones para ejecutar
event requiredConfirmationCountChange() -> uint256:count
- agregar miembro
execute addMember(address:member) -> void:value
- eliminación de miembros
execute removeMember(address:member) -> void:value
- reemplazo de miembros
execute replaceMember(address:currentMember, address:newMember) -> void:value
- cambio en el número de confirmaciones obligatorias para ejecución
execute changeRequiredConfirmationCount(uint256:count) -> void:value
- Interfaz de jerarquía
- obtener una lista de billeteras para niños
static getChildren() -> address[]:wallets
- verificar si la dirección de la billetera es hija de la actual
static isChild() -> bool:value
- La verificación de si la dirección de la billetera es parental a la actual se realiza a través de isChild al contrastarla.
- evento adjunto de billetera afiliada
event childAttachment() -> [address:address,uint256:timeStamp]
- evento de eliminación de billetera infantil
event childRemoval() -> [address:address,uint256:timeStamp]
- colocar una billetera infantil
execute attachChild(addres:child) -> void:value
- eliminar billetera infantil
execute removeChild(address:address) -> void:value
- cambiar una billetera infantil a otra
execute replaceChild(address:newAddress) -> void:value
- Interfaz de transacción
- verificar el estado de la transacción
static getTransactionStatus(uint256:transactionId) -> enum:{submitted,completed,frozen,disputed,reverted}
- verificar el estado de la transacción para el cumplimiento
static isTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> bool:value
- verificación de la confirmación de la transacción en la dirección del participante
static getConfirmationByAddress(uint256:transactionId, address:addressMember) -> bool:value
- obtener información de una transacción
static getTransactionInfo(uint256:transactionId) -> [address:destination, uint256:value, bytes:data, bool:executed]
- obtener el número total de transacciones en la billetera
static getTransactionCount() -> uint256:value
- recibir el estado de confirmación de la transacción
static isConfirmed(uint256:transactionId) -> bool:value
- recibir el número de confirmaciones
static getConfirmationCount(uint256:transactionId) -> uint256:count
- obteniendo el número de transacciones por tipo
static getTransactionCount(bool:pending, bool:executed) -> uint256:count
- obtener la lista de participantes que confirmaron la transacción
static getConfirmations(uint256:transactionId) -> address[]:confirmations
- obtener tiempo para la confirmación automática
static getTimeAutoConfirmation(uint256:transactionId) -> uint256:timestamp
- obtener una lista de ID de transacción por tipo en un cierto período de tiempo
static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds
- evento de confirmación de transacción del partido
event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- evento de confirmación de transacción automática
event AutoConfirmation() -> [uint256:transactionId, uint256:timeStamp]
- evento de retiro de confirmación del participante antes de la transacción
event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp]
- evento de agregar transacción de cola
event Submission() -> [uint256:transactionId]
- evento de ejecución de transacción
event Execution() -> [uint256:transactionId]
- evento de error de transacción
event ExecutionFailure -> [uint256:transactionId]
- cambio de estado de transacción a evento congelado
event TransactionFrozen -> [uint256:transactionId]
- cambio de estado de transacción a evento controvertido
event TransactionDisputed -> [uint256:transactionId]
- cambio del estado de la transacción al evento devuelto
event TransactionReverted -> [uint256:transactionId]
- evento de reposición de billetera
event Deposit -> [address:sender, uint256:amount]
- agregar transacción para ejecutar
execute submitTransaction(address:destination, uint256:value, uint256:TimeAutoConfirmation, bytes:data) -> uint256:transactionId
- confirmación de la transacción
execute confirmTransaction(uint256:transactionId) -> void:value
- confirmación de revocación
execute revokeConfirmation(uint256:transactionId) -> void:value
- cambiar el estado de la transacción a congelado
execute setTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> void:value
- transacción manual
execute executeTransaction(uint256:transactionId) -> void:value
- Gestión de calificaciones
- obtener una calificación en
static getRatingByAddress(address:agent) -> [uint256:negativeRating, uint256:positiveRating, uint256:countRatingRecords]
- Obtener el historial de calificación por dirección y número de serie
static getRatingRecordForAddress(address:agent, uint256:indexNumber) -> void:value
- evento de agregar un registro a la calificación en
event RatingRecordAdded -> [address:author, address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment, uint256:indexNumber]
- agregar registro a la calificación para la dirección
execute addRatingRecord(address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment) -> void:value
- Integración con el protocolo ESCB9
- verificar en la dirección si el contrato inteligente adjunto a esta billetera es un contrato inteligente con implementación de ESCB9
static isAttachedESCB9SmartContract(address:smartContract) -> bool:result
- verificar el estado del depósito para un contrato inteligente con ESCB9 adjunto a esta billetera
static getDepositStatusForESCB9SmartContract(address:smartContract) -> enum:{awaiting,founded,returned}
- evento de adjuntar un contrato inteligente con la implementación de la billetera ESCB9
event AttachingESCB9SmartContract -> [address:smartContract]
- evento de depósito para contrato inteligente con implementación adjunta de billetera ESCB9
event ConfirmationForDepositESCB9SmartContract -> [address:smartContract, uint256:sum, bytes:notice]
- adjuntar un contrato inteligente con la implementación de ESCB9 a la billetera
execute attachESCB9SmartContract(address:smartContract) -> void:value
- confirmación de depósito para contrato inteligente con implementación de ESCB9. Si el depósito está en el sistema externo, el aviso tendrá una etiqueta. Si el depósito está en ETH, el monto del depósito se envía cuando se ejecuta el método.
execute fundDepositForESCB9SmartContract(address:smartContract, uint256:sum, bytes:notice) -> void:value
5 flujos de interacción
Cualquier contrato inteligente puede integrarse en la jerarquía de billeteras con múltiples firmas. Dicha integración tendrá flujos de interacciones. En términos generales, distinguimos varios tipos de flujos:
- Estándar . De esta forma, la transacción se realiza automáticamente. Sin la participación de miembros autorizados de la jerarquía de billetera.
- Protegido De esta forma, el tiempo de transacción se puede aumentar del estándar para la confirmación automática del tiempo al necesario. En este caso, es necesaria la participación de miembros autorizados de la jerarquía de billetera.
- Controvertido De esta forma, el participante de la transacción puede congelar la transacción. En este caso, la participación de los miembros autorizados de la jerarquía de billetera es necesaria para generar consenso.
Cada billetera en el sistema de confianza tiene un número de participantes plenipotenciarios, que emiten un veredicto. Para un razonamiento simple, combinaremos a todos los participantes autorizados en la billetera en un solo concepto: el
árbitro .
5.1 Flujo de interacción estándar
Para simplificar la presentación, traemos los conceptos de bienes y servicios al concepto del objeto de transferencia (objeto), y el concepto de dinero fiduciario, criptomonedas al concepto de medios de transferencia (medios).
La contraparte, el propietario del objeto, hace un trato con la contraparte, el propietario de los fondos, con el propósito de intercambiar. En este caso, el propietario del objeto crea un contrato de custodia inteligente mediante el envío de una transacción estandarizada a una de las billeteras autorizadas en la jerarquía de billeteras con múltiples firmas. En este caso, la transacción es registrada por un tercero como un sistema de confianza. Para cada transacción, se determina el tiempo estándar para su ejecución. La contraparte, el propietario de los fondos, realiza un depósito en la transacción transfiriendo fondos al sistema de fideicomiso. Después de eso, el propietario del objeto transfiere el objeto al propietario de los fondos. El propietario de los fondos verifica la calidad del objeto. Si antes del final del tiempo para la transacción, no confirmó la calidad, los fondos se transfieren al propietario del objeto como parte de la transacción. Ambas contrapartes se otorgan calificaciones de comodidad. Por lo tanto, el propietario de los fondos puede cambiar el flujo de interacción hasta que se complete la transacción. Después de la transferencia de fondos al propietario del objeto, el propietario de los fondos puede solicitar una cartera superior en el nivel de la jerarquía para resolver disputas dentro del tiempo especificado por la regulación. Después de este tiempo, las calificaciones de la transacción se aplican a ambas partes y la transacción se vuelve irrevocable.
5.2 Flujo de interacción segura
Si, por alguna razón fuera del control de las contrapartes, la fecha límite para la transacción debe extenderse, entonces, por acuerdo de las partes, la billetera jerárquica de múltiples firmas (árbitro) puede cambiar el tiempo asignado para la transacción. Después de cambiar el tiempo, el flujo de interacción asignado a la transacción vuelve al nivel lógico del flujo estándar.
5.3 Flujo controvertido de interacción
Si la calidad del objeto durante la transacción no es adecuada para la contraparte, el propietario de los fondos que aporta al sistema de fideicomiso de la jerarquía de billeteras con firma múltiple, la transacción puede congelarse. En este caso, el depósito no se transfiere a la contraparte, el propietario del objeto, hasta que se emita un veredicto sobre la transacción. El titular de los fondos debe proporcionar evidencia sustancial al árbitro de la transacción. Después de eso, el árbitro emite un veredicto a favor de una de las contrapartes. Si alguna de las partes en la transacción no está satisfecha con el veredicto, se convierte en una billetera más alta en el orden en la jerarquía de las billeteras con múltiples firmas. Una vez aprobadas todas las instancias de jerarquía, cualquiera de las partes puede solicitar un voto público. Esta medida excepcional solo puede ser asignada por un monedero absoluto.
6 Protocolo ESCB9
Un ejemplo del protocolo ESCB9 en Solidity como un contrato inteligente abstracto (el protocolo está en desarrollo y está sujeto a cambios)
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 Integración de un sistema de confianza y contratos inteligentes que implementan el protocolo ESCB9
Para usar el sistema de confianza de la jerarquía de billeteras con múltiples firmas en su propio proyecto, debe crear un contrato inteligente que implemente el estándar ESCB9 y adjuntar dicho contrato inteligente a uno de los árbitros que no tiene billeteras subsidiarias. Tales billeteras en una jerarquía de suscripción múltiple se denominan "nodos de entrada". Todos los monederos de firma múltiple en sentido ascendente se denominan "nodos de arbitraje".
8 Ejemplos de contratos que implementan ESCB9
8.1 Contrato inteligente para el mercado de alquiler privado, siguiendo el ejemplo de AirBnb
8.2 Un contrato inteligente para el intercambio de cualquier criptomoneda por dinero fiduciario y de vuelta en un modo descentralizado
El ejemplo de un contrato inteligente que se describe a continuación le permite intercambiar BTC por dinero fiduciario directamente, sin la participación de intercambiadores y servicios de terceros. El vendedor de BTC transfiere el monto del contrato inteligente al depósito en la cadena de bloques de BTC. El comprador, después de confirmar el depósito por el árbitro, transfiere automáticamente el monto estipulado en el contrato a la cuenta o al número de tarjeta de plástico incluido en el contrato. El árbitro puede intervenir en el proceso de transacción después de la apelación de uno de los participantes. Inicialmente, el depósito se congelará y si las partes no acuerdan por consenso, dicho contrato se disputará con una resolución adicional sobre el flujo de interacción disputada.
9 nodos de arbitraje
Para mantener el trabajo del sistema de confianza, se introduce una jerarquía de billeteras con múltiples firmas. Los nodos de arbitraje, es decir, tales billeteras en la jerarquía que tienen billeteras subsidiarias debajo de ellas, actúan como garantes de la resolución de disputas. Los plenipotenciarios para tales nodos solo pueden ser designados por una jerarquía superior. Cada participante autorizado recibe una recompensa al distribuir dividendos y bonos por trabajar con flujos de interacción en disputa. El tamaño del bono se determina por consenso.
Para obtener el estado de un participante autorizado en un nodo de arbitraje, es necesario tener una cantidad de tokens definida por consenso en la dirección de un participante autorizado.
Por lo tanto, se garantiza la recepción estable de dividendos por todos los participantes de los nodos de arbitraje. Cuanto más alta sea la jerarquía de una billetera con múltiples firmas, los tokens más necesarios deben estar presentes en la dirección de un participante autorizado.10 Diccionario
Ethereum es una tecnología de código abierto que le permite crear una cadena de transacciones descentralizada e inmutable. Cada transacción se puede realizar con ciertas condiciones registradas en un contrato inteligente.Contrato inteligente : escrito en Solidity, la lógica ejecutada en la máquina virtual Ethereum, que le permite expandir la lógica de transacción.Una billetera con firma múltiple (árbitro) es un contrato inteligente especial controlado por un grupo de participantes autorizados que pueden confirmar o cancelar transacciones. Usando el mecanismo de billeteras de múltiples suscripciones, puede crear una cadena de puertas de enlace para transacciones y monitorear oportunamente la ejecución o el reembolso.Propietario de un objeto: es un propietario, proveedor, desarrollador de un producto de software, etc. Es decir, una persona que vende un objeto y finalmente recibe un depósito como recompensa.Propietario de fondos : es un inquilino, comprador, cliente de un producto de software, etc. Es decir, una persona que deposita en un objeto para comprar un producto o servicio.