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.
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.
¿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 sendTransaction
llamada como se documenta en Contratos y Transacciones . El siguiente comando se ejecuta directamente en geth
o 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 Height
campo está marcado (Pendiente). Tenga en cuenta que las direcciones From:
y To:
se especifican en la transacción:
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:
¿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 geth
para 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 geth
uso 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 geth
código para crear cuentas
El geth
có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 geth
cliente 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.blockNumber
en la geth
consola y confirmo que el último bloque es 1303921:
> eth.blockNumber
1303921
Escribo admin.peers
y geth
me dice que estoy conectado a otro nodo Ethereum. Este número aumentará a medida que mi geth
instancia 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 geth
instancia 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:
Y así es como se ven las dos transacciones en EtherScan:
Obtener los datos del geth
cliente del nodo Ethereum es cómo EtherScan obtiene datos sobre las nuevas direcciones.
asmiller
, He actualizado mi respuesta con más información que espero responda a su pregunta adicional.
privacidadisahumanright.eth
ethereum_alex