¿Por qué los resultados de los contratos inteligentes son diferentes de las transacciones ordinarias?

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

Esta es una buena pregunta, para mí el problema solo se debió a las tarifas más altas que podrían hacer que se rechazara un reembolso. Pero diciendo que la salida es diferente, no puedo ver la diferencia entre un TX de una cuenta y uno de un contrato.

Respuestas (2)

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 toel intercambio, el intercambio puede observar las transacciones que se envían a toesta 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 toes 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, toya no es la dirección de depósito que le proporcionó el intercambio. El toes la dirección de su contrato, y en la transacción habrá un datacampo adicional. Esto dataproporciona 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 y , 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.

Lo siento si repito lo que escribiste, pero necesito que confirmes que lo que entendí de tu publicación es correcto. Entonces, una vez que el éter se transfiere del contrato a la cuenta, debe reproducir todo desde la transacción inicial que llamó al contrato para determinar el saldo final de la cuenta porque los contratos no tienen un estado en la red, ¿solo las transacciones tienen uno? ¿Está bien?
@NicolasMassart El comentario no está claro, pero lo intento. Los contratos tienen estado. Pero como intercambio, debe reproducir o ejecutar transacciones para averiguar qué contrato depositó los fondos. Un contrato podría registrar qué cuentas ha pagado, pero como intercambio, no sabe qué contratos hacen esto y cómo acceder al estado de dicho contrato. Hay cuenta de usuario->contrato->posiblemente muchos otros contratos->dirección de depósito de intercambio. Como intercambio, solo conoce el último elemento.
Supongo que todavía no entiendo por qué un intercambio necesitaría saber de dónde proviene un depósito. Me parece que verificar web3.eth.getBalance debería ser suficiente. ¿Quizás el costo computacional de ejecutar web3.eth.getBalance una vez para cada dirección de depósito, cada bloque, es mayor que el costo computacional de comparar cada dirección de depósito con cada transacción? Pero ¿por qué sería eso?

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.