La diferencia entre la dirección del contrato y la dirección de la billetera

Descargo de responsabilidad: esta es una pregunta bastante larga.

Según tengo entendido, la dirección del contrato y la dirección de la billetera son dos conceptos profundamente diferentes, con la única cosa en común siendo el hecho de que ambos se dan como la representación hexadecimal de un número de 160 bits.

La diferencia se describe a continuación:

Cuando se implementa un contrato, se asigna a una dirección única, es decir, ningún otro contrato de la cadena se puede asignar a esa dirección.

Además, suponga que el contrato contiene variables de estado (globales) con un tamaño total de X bytes (incluido el relleno agregado por el compilador de Solidity).

La próxima vez que se despliegue un contrato a la cadena, necesariamente se asignará en la dirección del contrato anterior + X, o superior.

Entonces cada contrato ocupa memoria "real".

Una dirección de billetera, por otro lado, es "plana".

No almacena ningún dato, por lo que técnicamente dos billeteras pueden tener dos direcciones consecutivas.

Entonces, mientras que las variables de estado de un contrato se asignan "justo después" de la dirección del contrato, el dinero que tiene una billetera no se asigna "justo después" de la dirección de la billetera y, de hecho, no se asigna en absoluto.

En cambio, el dinero que contiene una billetera se atribuye a la dirección de la billetera en uno o más contratos ERC20.

Por ejemplo, supongamos que tengo una billetera con 20 CoffeeCoins en la dirección 0x1234....

Entonces significa que hay algún contrato ERC20 implementado en la cadena, que almacena esta información:

contract CoffeeCoin is ERC20Basic {
    mapping(address => uint256) balances;
    ...
}

Y en ese contrato, balances[0x1234...] = 20.

Una implicación menor de la diferencia descrita anteriormente:

Alguna dirección de billetera puede ser igual a alguna dirección de contrato.

Creo que en el caso de la cadena de bloques, la palabra dirección es probablemente más adecuada para usarse junto con el contrato en lugar de la billetera (mientras que usarla para ambos crea esta confusión para empezar).

De hecho, una dirección de billetera no es más que una clave pública.

¿Tengo razón en cada una de las afirmaciones anteriores?

¿Es correcto mi entendimiento de la diferencia entre la dirección del contrato y la dirección de la billetera ?

Estaré encantado de recibir cualquier comentario constructivo.

Gracias.

Cuáles son la billetera o aplicación eth no basada en contrato que tiene billetera no basada en contrato. En blockchain eth wallet, ¿es una billetera basada en contrato o una billetera no basada en contrato?

Respuestas (2)

Una dirección de cuenta, ya sea una cuenta de propiedad externa (lo que llama una billetera) o una cuenta de contrato, no es lo mismo que una dirección de memoria. No es posible saber qué existe en "dirección de contrato + X", porque las direcciones de cuenta no son un mapeo en una memoria de piezas contiguas.

Como introducción, vea el panorama general (literalmente) aquí: https://ethereum.stackexchange.com/a/6413/52

Una dirección actúa como una clave en el estado de la cadena de bloques. Los nodos hoja de este trie son estructuras de datos de cuenta. La estructura de datos contiene:

  • una vez
  • un balance
  • una raíz de almacenamiento
  • un código hash

Según tengo entendido, la dirección del contrato y la dirección de la billetera son dos conceptos profundamente diferentes,

Las direcciones solo proporcionan una clave en el estado trie, por lo que actúan de la misma manera y deben considerarse iguales.

La principal diferencia es que la estructura de datos de la cuenta para un contrato contiene una entrada para codehash , lo que significa que hay un código ejecutable que se puede ejecutar. Para una cuenta de propiedad externa, solo hay un saldo y un nonce.

El estado de almacenamiento del contrato, es decir, sus estados variables, etc., se almacena en otra prueba, siendo la raíz de esa prueba la raíz de almacenamiento que se encuentra en la estructura de datos de la cuenta mencionada anteriormente. Este trie es un mapeo clave:valor, y es probablemente lo que estás pensando cuando mencionas "dirección del contrato + X". Sí, cuando se realizan cambios en el almacenamiento del contrato, se requiere más memoria en este intento. Es solo que nos hemos movido más abajo en la jerarquía organizativa, alejándonos del uso inicial de la dirección como medio principal para identificar una cuenta. Estos son dos espacios de direcciones diferentes.

Alguna dirección de billetera puede ser igual a alguna dirección de contrato.

Eso no puede pasar. Solo puede existir una cuenta en una dirección (cuenta) dada en la cadena. (Lo que puede suceder es que muchas claves privadas puedan asignarse a la misma dirección, pero eso es ortogonal a lo que está preguntando).

De hecho, una dirección de billetera no es más que una clave pública.

Se deriva de los últimos 20 bytes del keccak256()hash de la clave pública.

Ver: ¿Cómo se generan las direcciones ethereum?

Muchas gracias por la respuesta tan elaborada. Ahora veo que muchas de las afirmaciones que hice y la imagen que describí estaban equivocadas, porque he estado mirando los contratos de la manera "tradicional" de mirar las imágenes ejecutables, el diseño del espacio de memoria, etc. Supongo que eso en el nivel de implementación, algunos de ellos podrían ser correctos, pero como dijiste, estaba tratando de representar cosas en una capa más alta, y en esa capa, este tipo de representación es incorrecta. ¡Gracias!

En Javascript,

EOA (dirección de la billetera):'0x' + keccak256(publicKey).slice(-40)

Como arriba, la dirección de la billetera se puede lograr mediante una clave pública. 1) triturarlo con keccak256. 2) corte los 20 bytes más a la derecha (40 palabras). 3) Agregue un prefijo '0x'

Dirección del contrato:'0x' + keccak256(rlp.encode([sender, nonce])).toString('hex').slice(-40)

Al igual que arriba, la dirección del contrato se puede lograr mediante el nonce del remitente y la dirección del remitente. 1) codificar la dirección del remitente y el nonce del remitente con rlp. 2) triturarlo con keccak256. 3) corte a la derecha la mayoría de los 20 bytes (40 palabras). 4) Agregue un prefijo '0x.

Puede verificar la generación de la dirección del contrato usted mismo en este sitio, https://blockchains.tools/contractAddress?l=ETH

También puede comprobar cómo generar EOA a partir de una clave pública.

1) Obtenga una clave pública de este sitio, https://blockchains.tools/key?l=ETH 2) Péguela en la entrada keccak256. https://blockchains.tools/keccak256?l=GENERAL 3) Verifique que los 20 bytes más a la derecha (40 palabras) sean iguales con la dirección generada en el paso 1

:)

Parece que los enlaces están muertos :/ De lo contrario, gracias por publicar esto.