¿Cómo listar transacciones desde la dirección de la cuenta?

Tengo un pequeño servicio donde la gente puede intercambiar criptomonedas. Cada usuario tiene su propia dirección de Bitcoin, Litecoin, etc. para el depósito del saldo. Ahora quiero agregar Ethereum. Así que pensé en crear una cuenta para cada usuario y luego verificar las transacciones entrantes. Pero como entendí, no puedo obtener una lista de transacciones de la dirección de la cuenta. esto es raro Incluso en la billetera Mist no veo de dónde viene el éter. La única forma de obtener transacciones es verificar algún explorador de blockchain de terceros.

Además, como entendí, la forma correcta será crear un contrato inteligente, porque tiene la API necesaria. Pero no puedo crear contacto para cada usuario.

Tal vez necesito crear solo 1 contrato que "redireccionará" ether a mi cuenta principal, pero esto no es muy fácil de usar, porque se le pedirá al usuario que agregue algunos datos adicionales a la transacción para que pueda entender quién es quién.

Cualquier consejo será útil.

Mi consejo es votar a favor # 1897 en github.
@NikhilM, hecho.
ethereum.stackexchange.com/questions/3417/… también es útil para entender.
Este hilo también puede ser útil: ethereum.stackexchange.com/questions/2531/…
Lo siento, no puedo comentar, así que preguntaré aquí. @dmxhZGp1c2hh encontraste una solución? En caso afirmativo, publíquelo aquí.
el número 1897 no tiene actividad durante aproximadamente un año
@PavelNiedoba No tiene actividad porque hicieron privado el tema. No se sabe si alguna vez se implementará (y por el aspecto de ese hilo, no parece probable).
Estoy seguro de que esto es necesario para muchos. Estoy dispuesto a pagar parte de esto. ¿Hay trabajo para la comunidad ether en alguna parte?

Respuestas (3)

Si entiendo su pregunta correctamente, desea poder ver quién ha depositado Eth en la dirección de su contrato. Para eso están los registros de eventos.

(1) Cree un contrato donde haya un evento cada vez que haya una transacción. por ejemplo, algo como:

contract someContract {   

    address public owner;

    // Set the owner of the contract to be the creator of the contract i.e. you
    function someContract() {
        owner = msg.sender;
    } 

    // This is an event 
    event DepositMade(address _from, uint value);
    event WithdrawalMade(address _to, uint value);

    //Catch all function 
    function() {
        // generate an event when someone sends you Eth
        if (msg.value > 0)
            DepositMade(msg.sender, msg.value);
    }

    // Only the owner of the site can withdraw Eth
    modifier admin { if (msg.sender == owner) _ }

    function withdraw(uint amount, address recipient) admin {
        if(recipient.send(amount))
            WithdrawalMade(msg.sender, msg.value);
        else throw;
    }
}

Los bits importantes son definir un tipo de evento event DepositMade(address _from, uint value)y generar un evento cuando algo sucede DepositMade(msg.sender, msg.value);, estos eventos se almacenan en el registro de eventos asociado con la dirección de la instancia de contrato implementada.

(2) Recupera los eventos de este contrato usando rpc eth_newFiltero , web3.eth.filterpor ejemplo, algo como:

var filter = web3.eth.filter({fromBlock:0, toBlock: 'latest', address: contractAddress, 'topics':['0x' + web3.sha3('DepositMade(hexstring,uint256)')]});
filter.watch(function(error, result) {
   if(!error) console.log(result);
})
Gracias, pero estoy preguntando sobre una cuenta regular, no sobre un contrato.
el usuario no necesita saber la diferencia. No se requieren datos, simplemente envían Eth a una dirección y se activa la función catch all()
Entonces, si tengo 1000 usuarios, ¿necesito crear 1000 contratos?
No. Usted implementa el contrato anterior. Envían Eth a la dirección de esa instancia de contrato y se registran las cantidades enviadas y las direcciones de todos los remitentes.
ESTÁ BIEN. Obtengo la dirección del remitente y ¿cómo la vinculo con mis usuarios? Todos mis usuarios enviarán ether a 1 dirección y ¿cómo sé quién es quién?
Eso depende de ti. Tal vez podrían decirle la dirección de su cuenta cuando se registren.
O puedo solicitar agregar datos adicionales en la transacción. Ambas formas no son elegantes desde el punto de vista de UX.
Esta es una buena pieza de código, pero ¿por qué desperdiciar información de registro ético ya registrada en la cadena de bloques?
@JackWinters Realmente no es trivial emparejar direcciones con usuarios y podría ser un riesgo potencial para la seguridad.
@AlexCoventry ¿Algún consejo sobre cómo hacer exactamente eso? Los ejemplos de código/casos de uso parecen ser escasos.
Esto no es bueno para la solución empresarial. Hablamos de dinero real, por lo que debe ser infalible. Los clientes que realizan depósitos de intercambios no tienen idea desde qué dirección se envían las transacciones, varios clientes pueden usar la misma dirección. Las billeteras no tienen opciones para incluir datos arbitrarios. Se debe generar una dirección por cliente y luego se deben reenviar los fondos a una cuenta común. Por lo tanto, necesitamos una lista de transacciones entrantes (y salientes, que tenemos).
hay un error en el código, debería ser WithdrawalMade(recipient, amount);así, ¿no?
¿Esto cuesta gasolina?

Puede intentar usar la API GetAccountTransactions de etherchain.org que está documentada en https://etherchain.org/documentation/api/ .

Por ejemplo: https://etherchain.org/api/account/0xbeef281b81d383336aca8b2b067a526227638087/tx/0 le dará las transacciones como se muestra en https://etherchain.org/account/0xbeef281b81d383336aca8b2b067a526227638087#txsent

Etherscan también tiene algunas API documentadas: https://etherscan.io/apis . Aquí está la llamada a la API equivalente para los mismos datos de transacción para la cuenta que la anterior. http://api.etherscan.io/api?module=account&action=txlist&address=0xbeef281b81d383336aca8b2b067a526227638087&sort=asc

Creo que dmxhZGp1c2hh no quiere usar un servicio de terceros
Etherchain.org a menudo está en "modo de funciones limitadas" y no es confiable. Etherscan.io tiene un límite de API de 5 por segundo, sin forma de aumentar. Eso es abismal y casi inútil. No se debe confiar en terceros para obtener esta información, sin importar cuán confiables parezcan. Además, ninguno de estos muestra transferencias de tokens, lo que parece ser una bestia completamente diferente.
@EvilJordan Estoy de acuerdo, incluso si funciona bien ahora, no quiero que mi negocio dependa de eso. Cometí ese error con btc blockchain.info, que tenía muchos problemas antes, cuando btc se estaba volviendo popular.

Ethplorer proporciona una buena API para muchos casos.

Obtener información de la dirección

Obtener historial de direcciones

y muchos otros.ingrese la descripción de la imagen aquí