Los contratos de token de muestra no funcionan: "El contrato no permitirá que se ejecute esta transacción"

El contrato de muestra "Advanced Token" aquí: https://www.ethereum.org/token

No funciona cuando se implementa en la red de prueba. Intentar enviar ether al contrato para comprar tokens da como resultado el mensaje de error:

El contrato no permitirá que se ejecute esta transacción.

Nada en el tutorial explica por qué sucedería esto.

Sí, OP dice que lo arregló pero no proporciona la solución porque "no puede encontrar cuál fue precisamente el error".
Comprendido. ¿Has intentado ejecutar el código en Remix para ver si arroja el mismo error?
Gracias por el consejo. Lo había ejecutado en Remix, pero no me di cuenta del poder del depurador de Remix, lo que me llevó a lo que describí en la respuesta.
Argh - Me retracto. Incluso con la solución, el contrato no se ejecutará. Remix dice que lo hará y que requerirá 30k de gasolina, pero el cliente de Ethereum aún informa que fallará. Así que todavía no hay solución.

Respuestas (2)

Editar Entonces, descubrí el problema. Mi función "pagadera" se llama comprar(). Supuse que el contrato seleccionaría automáticamente la función pagadera al enviar ether, pero parece que necesita la función pagadera general, en lugar de una con nombre, para recibir pagos arbitrarios de ether. Una vez que eliminé el nombre de la función, todo funcionó.

Editar: Aunque la siguiente información fue parte del problema, la solución específica está arriba.

Entonces, lo mejor que puedo decir aquí es el problema ...

  • Al crear, el código del contrato le da a la cuenta del propietario el suministro inicial de tokens
  • Entonces, implícitamente, la cuenta del contrato tiene cero tokens
  • Se espera que las operaciones de compra () se extraigan de la cuenta del contrato

Entonces, para que buy() funcione, hay un par de opciones (en orden de complejidad creciente)

  • Agregue el suministro inicial a la cuenta del contrato en lugar de la cuenta del propietario. (requiere cambio de código de contrato)
  • Transfiera algunos tokens a la cuenta del contrato del propietario, publique la creación. (Requiere 1 transacción adicional, sin código)
  • Envíe algo de éter a la cuenta del contrato y venda los tokens del propietario al contrato (requiere 1 transacción adicional y gasto de éter)

Tiene mucho sentido mirar el código en detalle, simplemente no captó el aspecto de la dirección del propietario, a la que se hace referencia como "msg.sender" en lugar de la dirección del contrato, a la que se hace referencia como "este".

Entonces, descubrí el problema. La función "a pagar" se llama comprar(). Supuse que el contrato seleccionaría automáticamente la función pagadera al enviar ether, pero parece que necesita la función pagadera general, en lugar de una con nombre, para recibir pagos arbitrarios de ether. Una vez que eliminé el nombre de la función, ¡todo funcionó!

Después de la creación del contrato, la asignación inicial de monedas pertenece al propietario del contrato. Debe transferir algunas de las monedas nuevas al contrato en sí.

Con un saldo cero, el contrato no permitirá que se realice la transacción.

Sí, esto era parte del problema. Entonces, el contrato de ejemplo en realidad no crea una configuración funcional, sin la participación manual para mover los tokens.