Un ingeniero de intercambio de Coinbase dijo:
"El depósito de contratos inteligentes es difícil. Las salidas de contratos inteligentes no son como las transacciones ETH normales y no es trivial para nosotros recibir notificaciones cuando recibimos monedas de contratos inteligentes".
Del mismo modo, el intercambio de Bitfinex dice:
"En este momento, Bitfinex no admite transacciones de Ethereum generadas a partir de contratos inteligentes. Para evitar depósitos perdidos o retrasos en los depósitos, ETH solo debe enviarse en transacciones tradicionales. Si no está seguro de que su depósito no se envíe como parte de la ejecución de un contrato de Ethereum, infórmese con certeza antes de enviar su depósito".
¿Cuál es la diferencia técnica entre las transacciones generadas por contratos inteligentes y las transacciones generadas por humanos? ¿Por qué es más difícil recibir una notificación cuando se recibe una moneda de un contrato inteligente (cómo se notificaría a un intercambio cuando recibe monedas de un humano, y cómo se le notificaría cuando recibe monedas de un contrato inteligente, y por qué es esto diferente)? ¿Cuál fue la motivación para esta elección de diseño por parte de los diseñadores de Ethereum? ¿Dónde puedo ir para leer más detalles?
Revisé https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions pero no vi la respuesta allí.
Aquí hay una intuición. La transacción más simple en Ethereum cuesta 21000 gas y se ve así :
{from: '0x from', to: '0x to', value: web3.toWei(1, "ether")}
Cuando deposita to
el intercambio, el intercambio puede observar las transacciones que se envían a to
esta dirección de depósito. Por ejemplo, para el bloque 99 podrían usar web3.eth.getBlock(99, true, ...)
, y para cada objeto de transacción verificar si to
es igual a la dirección de depósito y la value
(cantidad de Ether en wei) que se envió. Relativamente sencillo para el intercambio ver lo que ha depositado.
Pero si está utilizando un contrato para hacer un depósito, to
ya no es la dirección de depósito que le proporcionó el intercambio. El to
es la dirección de su contrato, y en la transacción habrá un data
campo adicional. Esto data
proporciona instrucciones al contrato, para ejecutar el código, que luego puede transferir el Ether a la dirección de depósito. El intercambio también debe ejecutar el código, si quiere estar seguro de que recibió fondos de dicha ejecución. (Un intercambio podría usar web3.eth.getBalance para monitorear los saldos de las direcciones de depósito, pero si quiere saber exactamente de dónde provienen los fondos, debe ejecutar el código de todas las transacciones).
Esa es una descripción general y, para leer más, Ethereum Wiki tiene enlaces a otros materiales, como el Libro amarillo y el Libro blanco. Leer este StackExchange para preguntas y respuestas altamente votadas, con etiquetas como transacciones y gas , también es útil.
Técnicamente, las transacciones solo las inician los seres humanos: un contrato que invoca a otro contrato es message call
(como se define en el Libro Amarillo) no una transacción. Solo la transacción se registra en la cadena de bloques porque toda ejecución posterior puede derivarse de la transacción.
Por qué retirar dinero de un intercambio a una billetera/cuenta de contrato no es sencillo, es porque se necesita más gasolina que la gasolina básica 21000. Los diferentes contratos pueden consumir diferentes cantidades de gas, y la bolsa debe proporcionar suficiente gas; de lo contrario, la transacción no tendrá efecto: los fondos restantes permanecerán en la bolsa.
ETHEREUM TIENE DOS MÉTODOS DE ENVÍO DE FONDOS:
Transacción Normal: Un dato, firmado por un Actor Externo. Representa un Mensaje o un nuevo Objeto Autónomo. Las transacciones se registran en cada bloque de la cadena de bloques.
Esto significa que una transacción representa un Mensaje o un nuevo contrato.
Transacción interna (mensaje): Datos (como un conjunto de bytes) y Valor (especificado como Ether) que se transfiere entre dos Cuentas, ya sea mediante la operación determinista de un Objeto Autónomo o la firma criptográficamente segura de la Transacción
Esto significa que una transacción interna son los datos y la cantidad de Ether que se transfiere entre dos cuentas. Una transacción interna se crea mediante contratos que interactúan entre sí, o mediante una transacción.
Un contrato solo es capaz de enviar una transacción interna.
Algunas carteras de Exchange solo pueden recibir transacciones normales. NO ENVÍE fondos de un contrato inteligente a esos. El software de intercambio que interactúa con la dirección de la billetera no registrará transacciones internas.
Nicolás Massart