¿Cómo puedo hacer que la cuenta de otras personas realice transacciones de ether con un contrato inteligente? [cerrado]

Estaba haciendo un contrato inteligente que involucra a las personas para comprar tokens a cambio de éter que envían. Funciona bien en testrpc ya que todas las cuentas están desbloqueadas, pero ¿cómo lo hago para las cuentas reales en la red principal usando web3 en nodejs? ¿Qué campos serían necesarios para invocar estas funcionalidades pagaderas de contrato inteligente, excepto la dirección de la billetera, por supuesto? ¿Algún fragmento de código o ejemplo? Cualquier ayuda sería apreciada. Gracias.

Respuestas (2)

Algunos puntos para ayudarlo a separar los problemas y aclarar el pensamiento.

Un contrato no puede hacer nada que un usuario normal no pueda hacer. Por ejemplo, no hay nada que pueda programar para que un contrato gaste el dinero de otra persona.

Toda acción en la cadena de bloques comienza con una "firma" y transacción de "Cuenta de propiedad externa". Los contratos pueden comunicarse entre sí, pero nunca hacen nada hasta que alguien envía una transacción firmada, por lo que esos "mensajes" están en otra categoría ("mensajes").

La firma se realiza mediante billeteras que utilizan claves secretas. Sin el secreto, la firma no es posible. Pero cualquiera que adquiera el secreto (de alguna manera) puede firmar en nombre de otra dirección.

Cuando usa TestRPC, "el" usuario tiene 10 direcciones diferentes. Son sus direcciones, no extraños. Tiene las llaves secretas. TestRPC simplemente hace que sea conveniente desbloquear las cuentas y gastar sobre la marcha. No podría inventar una dirección número 11 y gastar desde ella sin el secreto correspondiente.

En el caso de un sitio web, hay dos soluciones (generales).

  1. El sitio web puede crear las cuentas y (¡de forma segura!) guardar las claves secretas. Eso sería como abrir las cuentas "a nombre de" los usuarios. Considere cómo funcionan los intercambios.
  2. El navegador puede confiar en el Ethereum o MetaMask local de los usuarios, por lo que es (de hecho) el usuario y no el servidor web quien firma las transacciones y las envía a la cadena. Considere el contrato Mist Wallet.

Espero eso ayude.

¡Gracias, eso explica mucho! Me preguntaba si era la mejor manera de usar las pasarelas de pago de ethereum para la transferencia de ether al contrato y luego hacer que el contrato "envíe" o "transfiera" ether a la cuenta de la cuenta deseada. No se requerirá ninguna firma si el contrato inteligente transfiere ether, ¿verdad? Si es así, ¿qué pasarelas de pago sugiere? Además, si el front-end invoca la transacción de ether es meta mask, ¿la única forma de verificar la transacción u otras billeteras también podrían iniciar la instancia web3 para verificar o firmar la transacción?
corrección: ¿no se requerirá ninguna firma si el contrato transfiere ether desde dentro de sí mismo utilizando el método de transferencia?
Un patrón común es hacer una función de pago y luego registrar la dirección del usuario que envió los fondos. Es evidente quién tiene los fondos en depósito o quién pagó. En el caso de un intercambio, entonces el intercambio "firma" la transacción. Puede ver cómo algunas ICO advierten contra el uso de cuentas de intercambio para enviar fondos, porque solo el remitente podrá retirar. Tal vez la interfaz de usuario para el intercambio no es capaz... por lo que puede generar problemas.
El contrato no puede transferirse dentro de sí mismo hasta que alguien le envíe una instrucción para hacerlo. El comienzo de la cadena es siempre una transacción firmada. Una transacción firmada puede invocar una cadena de contratos que llaman contratos. Cada uno puede ver el contrato anterior (¿quién me llamó?) y usarlo como usuario autenticado.
Mi requisito es la transferencia de éter de varias cuentas a un contrato inteligente y estoy creando una API para toda la gestión de contratos inteligentes que se puede integrar con una interfaz por separado. Ahora los usuarios no darán sus claves privadas para firmar las transacciones, y si el pago se realiza desde el frente integrado web3, solo las billeteras que pueden iniciar una instancia en el navegador pueden firmarlas, estas billeteras son limitadas (corríjame si soy equivocado).
Por lo tanto, sería la mejor solución posible tener una pasarela de pago como pagos con monedas y cuando se complete la transferencia de éter al contrato inteligente, ¿podemos invocar aún más la función de contrato inteligente para almacenar quién depositó qué cantidad en el contrato inteligente? Perdone mis preguntas de novato, trabajo en Hyperledger y me han asignado este trabajo en una crisis.

Debe firmar las transacciones en el navegador. Puede hacerlo manualmente o usar un proveedor que lo haga automáticamente por usted.

https://github.com/trufflesuite/truffle-hdwallet-provider

¿Puedes explicar el proceso de firma con un poco de detalle? ¿Cómo se conectarán 'n' usuarios a mi aplicación y desbloquearán su cuenta para mis transacciones? ¿Cómo enviarán éter?
Sus usuarios deberán ingresar la clave privada (o mnemotécnica) de la billetera que desean usar en la aplicación para que pueda firmar transacciones por ellos. Alternativamente, pueden usar una extensión como MetaMask, esto inyectará una instancia web3 en la página con un proveedor que hace algo similar.