¿Cómo sabe EtherScan que estoy enviando a una billetera Shapeshift/Poloniex?

He notado muchas transacciones en Etherscan que indican que una de las partes es un cierto tipo de billetera (por ejemplo, Poloniex o Shapeshift). Aquí hay un ejemplo.

¿Cómo identifica la fuente? ¿Estos intercambios registran públicamente sus direcciones (por ejemplo, en IPFS o con una API)?

Editar : Aclaración de mi pregunta con un ejemplo: digamos que Shapeshift realiza 10,000 transacciones hoy. Eso daría como resultado la generación de 10.000 direcciones. Espero que no haya forma de controlar el formato de estas direcciones (ya que son hashes SHA3), por lo que nos quedan 10,000 cadenas de direcciones aleatorias. ¿Cómo se registran estas 10.000 direcciones individuales con Etherscan? Me cuesta creer que sea un proceso manual (esto constituiría un trabajo de tiempo completo para varias personas) y supongo que hay algún tipo de tabla de búsqueda pública o que están llamando a una API de Etherscan, pero nunca he visto ninguna. documentación de cualquier manera.

Con respecto a su edición, ¿podría confirmar que está hablando de cadenas de direcciones en forma de "0x1234abcd... fedc" y no de un nombre como "joesaddress"?
Por "dirección" me refiero a la dirección ethereum (una cadena hash). Por "registro" me refiero al proceso de asignar una dirección ethereum a un nombre (por ejemplo, "billetera Poloniex").

Respuestas (2)

Cuando ve el nombre junto a la dirección, es un proceso manual de asociar una cadena de texto con esa dirección. Es así de simple. Tienen un campo de metadatos que pueden agregar a cualquier dirección. Este proceso no se realiza a través de una API ni en toda la red de Ethereum. Cada explorador de blockchain (etherscan, etherchain y live.ether.camp) lo hace de manera diferente y tiene diferentes cuentas etiquetadas.

Como parece que no toma mi respuesta como correcta, aquí está la respuesta de EtherScan :

Envíe enlaces a su sitio oficial en la sección de comentarios y verifique el código fuente de su contrato... y luego espere :-)

De hecho, después de responder esa pregunta, quería asegurarme de que fuera correcta, así que comenté la dirección de la cuenta de donación de MyEtherWallet . Un par de días después, Matt @ EtherScan votó a favor de mi comentario y ahora tenemos una etiqueta.

Además, no se enumeran todas las direcciones en Shapeshift. Acabo de mirar una de mis cuentas y la dirección única a la que envié el ETH no está etiquetada como Shapeshift.

Sin embargo, la dirección desde la que se envió ETH (en este caso, no indiqué la cantidad correcta de ETH, por lo que me la devolvieron) está etiquetada: http://etherscan.io/address/0x120a270bbc009644e35f0bb6ab13f95b8199c4ad

Esta parece ser su billetera caliente Ethereum (aunque es muy probable que esto cambie debido a la brecha de seguridad del 7/4) y, por lo tanto, se puede etiquetar fácilmente. Miré a mi alrededor y no pude encontrar ninguna otra dirección etiquetada como Shapeshift, por lo que creo que su suposición de que cada dirección que genera ShapeShift está etiquetada como Shapeshift es incorrecta.

De acuerdo, la entrada manual es definitivamente más razonable si ShapeShift reutiliza las direcciones y Etherscan no etiqueta todos los descartes únicos. Lamento ser un escéptico; solo quería ver algún tipo de palabra oficial sobre esto porque todo me parecía muy misterioso.

¿Cómo sabe EtherScan que estoy enviando a una billetera Shapeshift/Poloniex?

La respuesta corta es que los detalles From:de la To:billetera (también conocida como cuenta o dirección) se envían junto con la transacción a través de la red Ethereum y EtherScan tiene un toque (nodo) en la red.

La respuesta larga sigue:

  • Cualquier computadora que quiera recibir o enviar transacciones desde / hacia la red Ethereum ejecutaría un nodo Ethereum o tendría una conexión con un nodo Ethereum.

  • El principal software del nodo Ethereum es geth, la implementación oficial del lenguaje Go del protocolo Ethereum. Se puede encontrar más información en ethereum.github.io y el código fuente en github .

  • EtherScan estaría ejecutando un nodo Ethereum.

  • Se envía una transacción a la red Ethereum utilizando la sendTransactionllamada como se documenta en Contratos y Transacciones . El siguiente comando se ejecuta directamente en getho a través de una interfaz de programación de aplicaciones (API):

    eth.sendTransaction({from: '0x036a03fc47084741f83938296a1c8ef67f6e34fa', to: '0xa8ade7feab1ece71446bed25fa0cf6745c19c3d5', value: web3.toWei(1, "ether")})
    
  • Luego, el software del nodo transmite esta transacción no confirmada a los otros nodos a los que está conectado. Estos nodos luego transmiten esta misma transacción a los nodos a los que están conectados. La transacción finalmente llega a la mayoría, si no a todos, los nodos de la red Ethereum.

  • Como EtherScan está ejecutando un nodo Ethereum, recibirá una copia de la transacción no confirmada. Puede ver la lista de transacciones en el lado derecho de la página principal de EtherScan y un enlace a PendingTxns .

  • Este es un ejemplo de una transacción no confirmada del sitio web de EtherScan : el Block Heightcampo está marcado (Pendiente). Tenga en cuenta que las direcciones From:y To:se especifican en la transacción:Transacción pendiente 0xb68c6c0c1af99b0e08e05e768523256bbc2e6c2896f6cb7eb9ed5042dc2232c3

  • Algunos de los nodos de la red Ethereum son nodos de minería. Cada uno de estos nodos de minería recibe las transacciones no confirmadas que se propagan a través de la red Ethereum y las empaqueta en bloques. Luego, los nodos de minería intentan resolver un cálculo computacionalmente intensivo para resolver un problema matemático.

  • El primer nodo de minería que resuelve el problema matemático empaqueta el bloque resuelto incluyendo la transacción ahora confirmada al resto de los nodos de la red Ethereum. El minero recibirá una recompensa en bloque por "ganar" este bloque.

  • EtherScan, al ser uno de los nodos de la red, recibirá este bloque, incluida la transacción ahora confirmada. Encontrará la lista de bloques en el lado izquierdo del sitio web de EtherScan. Aquí está la misma transacción no confirmada que ahora aparece como una transacción confirmada en EtherScan:Transacción confirmada 0xb68c6c0c1af99b0e08e05e768523256bbc2e6c2896f6cb7eb9ed5042dc2232c3



¿Cómo identifica la fuente? La dirección de origen está en el From:campo de la transacción enviada.



¿Estos intercambios registran públicamente sus direcciones (por ejemplo, en IPFS o con una API)?

No. Pero para que vea el nombre Poloniex junto a la dirección de Poloniex, tuvieron que registrar su nombre con EtherScan. Consulte ¿Cómo puedo agregar mi nombre junto a la dirección en Etherscan? .



¿Pero Shapeshift generalmente no crea una nueva dirección para cada transacción?

Si está enviando bitcoins de ShapeShift para convertirlos en éteres, SS creará una dirección de bitcoin para que envíe sus bitcoins. Los éteres se enviarán a su dirección de Ethereum especificada.

Si está enviando ethers de SS para convertirlos en bitcoins, SS creará una nueva dirección de Ethereum para que envíe sus ethers. Luego, los bitcoins se enviarían a su dirección de bitcoin especificada.



¿Hay algún tipo de API que estos intercambios estén solicitando para cada nueva dirección que no aparece en los documentos de etherscan?

Cómo se crean las cuentas

Todas las cuentas se crearon en un momento determinado utilizando uno de los software de nodo de Ethereum, muy probablemente geth. El comando gethpara crear una cuenta (consulte la respuesta de Implementar el contrato de Greeter a través de geth CLI no se está registrando en mi cadena de bloques privada ) sigue:

user@Kumquat:~/ESE/Deploy$ geth account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat Passphrase: 
Address: {730b87e78b07fb2bf1b1e8b127b3353d08d72706}

Mediante programación, la creación de la cuenta se puede ejecutar dentro del gethuso del comando:

personal.newAccount("passphrase")

Este comando se puede incluir en una API como la API RPC JSON estándar de Ethereum , pero no se debe a consideraciones de seguridad.

Puede encontrar más detalles sobre la creación de cuentas en Administrar sus cuentas .


El gethcódigo para crear cuentas

El gethcódigo para crear nuevas cuentas se puede encontrar en accounts/account_manager.go :

func (am *Manager) NewAccount(auth string) (Account, error) {
    key, err := am.keyStore.GenerateNewKey(crand.Reader, auth)
    if err != nil {
            return Account{}, err
    }
    return Account{Address: key.Address}, nil
}

Que a su vez llama a crypto/key_store_passphrase.go que hace la magia de la creación de cuentas:

func (ks keyStorePassphrase) GenerateNewKey(rand io.Reader, auth string) (key *Key, err error) {
    return GenerateNewKeyDefault(ks, rand, auth)
}



¿Cómo se registran estas 10.000 direcciones individuales con Etherscan?

Editar: Aclaración de mi pregunta con un ejemplo: digamos que Shapeshift realiza 10,000 transacciones hoy. Eso daría como resultado la generación de 10.000 direcciones. Espero que no haya forma de controlar el formato de estas direcciones (ya que son hashes SHA3), por lo que nos quedan 10,000 cadenas de direcciones aleatorias. ¿Cómo se registran estas 10.000 direcciones individuales con Etherscan? Me cuesta creer que sea un proceso manual (esto constituiría un trabajo de tiempo completo para varias personas) y supongo que hay algún tipo de tabla de búsqueda pública o que están llamando a una API de Etherscan, pero nunca he visto ninguna. documentación de cualquier manera.

Demostraré el proceso de obtener los datos con el gethcliente del nodo Ethereum ejecutándose desde la línea de comandos. Hay llamadas API equivalentes para ejecutar los mismos comandos que escribo en la consola y recuperar los datos devueltos.

beefee@Kumquat:~$ geth console
I0410 00:59:38.739148   18803 database.go:71] Alloted 16MB cache to /home/beefee/.ethereum/chaindata
I0410 00:59:38.926341   18803 database.go:71] Alloted 16MB cache to /home/beefee/.ethereum/dapp
I0410 00:59:38.929816   18803 backend.go:314] Protocol Versions: [63 62 61], Network Id: 1
I0410 00:59:38.930737   18803 backend.go:362] Blockchain DB Version: 3
I0410 00:59:38.936326   18803 blockchain.go:214] Last header: #1303921 [4410d5b0…] TD=12764539073939571484
I0410 00:59:38.936411   18803 blockchain.go:215] Last block: #1303921 [4410d5b0…] TD=12764539073939571484
I0410 00:59:38.936444   18803 blockchain.go:216] Fast block: #1303921 [4410d5b0…] TD=12764539073939571484
I0410 00:59:38.948725   18803 cmd.go:115] Starting Geth/v1.3.6/linux/go1.5.1
I0410 00:59:38.948873   18803 server.go:311] Starting Server
I0410 00:59:40.853966   18803 udp.go:212] Listening, enode://d8a2002783851b7bd966a4d6cff2d91919a81bb42c2d2164c4a1a3c7a75473fba87c62d7190ad3e81bb9d83d5f5c314e9249ef2ce28fcbd9ea146b241d8c512b@[::]:30303
I0410 00:59:40.854203   18803 backend.go:526] Server started
I0410 00:59:40.856840   18803 server.go:552] Listening on [::]:30303
I0410 00:59:40.865236   18803 ipc.go:112] IPC service started (/home/beefee/.ethereum/geth.ipc)
instance: Geth/v1.3.6/linux/go1.5.1
 datadir: /home/beefee/.ethereum
coinbase: 0xbeefeebeefeebeefeebeefeebeefeebeefeebeef
at block: 1303921 (Sat, 09 Apr 2016 18:01:23 AEST)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0

La penúltima línea anterior me muestra que mis datos de blockchain se sincronizaron por última vez con el bloque 1303921. Ahora escribo eth.blockNumberen la gethconsola y confirmo que el último bloque es 1303921:

> eth.blockNumber
1303921

Escribo admin.peersy gethme dice que estoy conectado a otro nodo Ethereum. Este número aumentará a medida que mi gethinstancia descubra más pares en la red:

> admin.peers
[{
    caps: ["eth/61", "eth/62", "eth/63"],
    id: "dbc0024aa19bccca07371ae80efd0ca9fb3393a645aae532039edb43703a8a0a6ceaf00d445dbdbed6f9a6bffdc7a9526bc9f2a45ffbc88dfb65d29359ecd587",
    name: "Geth/v1.4.0-unstable/linux/go1.5.1",
    network: {
      localAddress: "192.168.1.14:54363",
      remoteAddress: "13.73.0.80:30303"
    },
    protocols: {
      eth: {
        difficulty: 12804217404531728000,
        head: "b76e33014471d9929b624a1160a539d76a1397894c9a4aba2ed79c39fe8349f2",
        version: 63
      }
    }
}]

Luego comienza la sincronización y mi gethinstancia recibe nuevos bloques de blockchain desde la última vez que sincronicé mi cadena. El primer mensaje muestra que se importaron 4 bloques con 367 transacciones, el segundo 2 bloques con 21 transacciones.

> I0410 01:02:23.660101   18824 blockchain.go:1251] imported 4 block(s) (0 queued 0 ignored) including 367 txs in 3.7787239s. #1303925 [9b90c2a9 / 9a9c4463]
I0410 01:02:23.699594   18824 blockchain.go:1251] imported 2 block(s) (0 queued 0 ignored) including 21 txs in 39.366618ms. #1303927 [51c73110 / 6ad7e8ad]
I0410 01:02:23.929353   18824 blockchain.go:1251] imported 1 block(s) (0 queued 0 ignored) including 14 txs in 57.625409ms. #1303928 [2472bfe0 / 2472bfe0]

Mis datos de blockchain están sincronizados hasta 1305673 ahora. Recupero la información del bloque y este bloque no tiene transacciones como se muestra en el transactions: []siguiente mensaje:

> eth.blockNumber
1305673
> eth.getBlock(1305673, true)
{
  difficulty: 26912099163184,
  extraData: "0xd783010306844765746887676f312e352e31856c696e7578",
  gasLimit: 4712388,
  gasUsed: 0,
  hash: "0x760c0430bb58ad52184e065ebcfc8033a56a9d733c3d95218c5bea080f4b668c",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x2a65aca4d5fc5b5c859090a6c34d164135398226",
  nonce: "0x241f99fc5fe741b5",
  number: 1305673,
  parentHash: "0x3397535d554535738d9116721661c16a40d050811971303e31b10f1c8f661998",
  receiptRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 541,
  stateRoot: "0x7d45816464427590a2f47a3f142f6b629bab6516869bf1be3e42dbb2eaba0e50",
  timestamp: 1460214123,
  totalDifficulty: 12812372432726769049,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

Ejecuto el comando eth.getBlock("latest", true)y ahora estamos en el bloque 1305695 donde puede ver dos transacciones, cada una con sus direcciones from:y :to:

> eth.getBlock("latest", true)
{
  ...
  miner: "0x61c808d82a3ac53231750dadc13c777b59310bd9",
  nonce: "0xc0e616c43374dfac",
  number: 1305695,
  parentHash: "0xa8a5dee1f42ba4d3e211006960dfa554a37a8bc35f83cb4b45f3b7a46f587d4c",
  ...
  timestamp: 1460214363,
  totalDifficulty: 12812965182286929610,
  transactions: [{
      blockHash: "0xf326691704f297404207e476bd076f2cbbefc3247afc5cecae3e47ca4adbdcc8",
      blockNumber: 1305695,
      from: "0x63a9975ba31b0b9626b34300f7f627147df1f526",
      gas: 90000,
      gasPrice: 20000000000,
      hash: "0xeed4dc863c788bc182cc6c4b83c55904487876a7e25eeca02d8510dd61449e65",
      input: "0x",
      nonce: 179074,
      to: "0x3ed74b5067bc1020bdbeb25fd8628baa29573a55",
      transactionIndex: 0,
      value: 15044289999999998
  }, {
      blockHash: "0xf326691704f297404207e476bd076f2cbbefc3247afc5cecae3e47ca4adbdcc8",
      blockNumber: 1305695,
      from: "0xb1fca483324dbeddbf5862559988d33dc0d6495e",
      gas: 53000,
      gasPrice: 20000000000,
      hash: "0x36a02cfcdc3f1c8dfa8e43e38150fc49e1d8ab7af84a559ce31882070efd0d19",
      input: "0x",
      nonce: 190,
      to: "0xb02a824df54dfb0fa36ca2cb263419b8ff840c79",
      transactionIndex: 1,
      value: 11933101527912825
  }],
  transactionsRoot: "0x7f53b96130949ded6a218c74e64982b7024d3ec68f6a9547c0ea49f5bccb03ec",
  uncles: []
}

Y así es como se ve el bloque 1305695 en EtherScan:

Bloque EtherScan 1305695

Y así es como se ven las dos transacciones en EtherScan:

Transacciones de EtherScan para el bloque 1305695

Obtener los datos del gethcliente del nodo Ethereum es cómo EtherScan obtiene datos sobre las nuevas direcciones.

¿Pero Shapeshift generalmente no crea una nueva dirección para cada transacción? ¿Hay algún tipo de API que estos intercambios estén solicitando para cada nueva dirección que no aparece en los documentos de etherscan ?
He actualizado la respuesta con más información. Si tiene más preguntas, puede considerar crear nuevas preguntas, ya que los moderadores de este sitio prefieren que las preguntas individuales se formulen por separado para que se puedan buscar.
@BokkyPooBah en mi opinión, gran parte de esta respuesta parece perder la pregunta :) La pregunta quiere saber si polo le dijo a cada uno de los exploradores que registrara su dirección. ¿O el polo se registra en alguna parte, luego los exploradores lo recogen manualmente y lo agregan a sus sitios? Si polo/shift usa una nueva dirección cada vez, ¿cómo puede etherscan saber esto y mantenerse al día?
Mejorado ahora. Por favor revise. Gracias.
Esta es una buena descripción general de cómo un tercero puede indexar la cadena de bloques, pero todavía hay una capa "mágica" de la que no veo nada. He actualizado la pregunta.
asmiller, He actualizado mi respuesta con más información que espero responda a su pregunta adicional.