¿Cómo podemos asignar una identificación de hash única a la identificación que se creó dentro de nuestro contrato inteligente en ethereum?

Estoy usando trufa, ganache y web3. Estoy inicializando la identificación de usuario en el contrato inteligente mientras implemento el contrato inteligente. A partir de ahora, todo se hace por cuenta[0] de Ganache.

Ahora, quiero una funcionalidad como, si ## Encabezado ## Estoy creando una identificación de usuario en un contrato inteligente, entonces debe asignarse con un hash único proporcionado por blockchain.

Para eso, no tengo idea de cómo podemos integrar un usuario recién creado a la cuenta de ganache.

¿Hay alguna otra forma de hacerlo o alguien tiene algún enlace de referencia para eso?

Respuestas (1)

Solo necesita un método addUser(name)que agregue un usuario recién creado.

Luego, el hash se puede calcular para keccak256()generar un bytes32hash. Ahora depende del caso de uso cómo le gustaría almacenarlo. Tal vez una estructura de detalles de usuario o mapeo con uintid => stringhash.

A partir de ahora, todo se hace por cuenta[0] de Ganache.

Sí, eso es predeterminado. Si menciona esto, supongo que solo desea account[0]que el implementador del contrato pueda agregar usuarios. En ese caso, solo necesita tener un require(msg.sender==admin)administrador donde el tipo asignado durante la implementación del contrato.

Editar

Leí tu pregunta de nuevo. Si está pensando que cada usuario con contrato tendrá directamente una cuenta mapeada... ¡No! Necesitas explicar más lo que quieres lograr.

Actualizar

Después de su comentario, parece que necesita asignar una dirección al usuario. TestRPC/Ganachefunciona de manera diferente.

Estas son las cuentas creadas por defecto bajo SU control. Puede revelar fácilmente la dirección pública de las cuentas, pero eso no soluciona ningún propósito. ¿Por qué? Porque el usuario debe tener su propia clave privada para realizar algún tipo de transacciones.

Para esto, depende totalmente ahora. Los usuarios deben y deben crear sus propias cuentas y darle la dirección pública. Esta dirección ahora debe permanecer con el contrato.

Pero si aún desea hacerlo de esa manera y servir como administrador para el usuario, simplemente elija una cuenta, digamos account[5]. Colóquelo en una base de datos local (opcionalmente) que account[5]esté asignada al nombre de usuario 123user. Cree una asignación en el contrato, llame a la función para asignar la dirección. cuando llame a la función, simplemente pase la dirección account[5]y el nombre de usuario. Descansa todo sigue.

Una mejor manera será generar bip39/ bip44wallets.

Tengo muchos usuarios en mi sistema, a partir de ahora es para fines de demostración, así que digamos que tengo 10 usuarios en mi sistema en el que actualmente los estoy creando desde el constructor y sí, todo se hará por cuenta [0]. Y Ganache también tiene 10 cuentas. Entonces, cuando agrego cualquier usuario a blockchain, la dirección debe asignarse al primer usuario, luego la segunda dirección al segundo usuario. Entonces, en el futuro podemos obtener los detalles de la transacción de cualquier usuario en particular desde esa dirección, no por la identificación del usuario que estoy haciendo actualmente. Entonces, ¿cómo podemos lograrlo?
actualicé mi respuesta
Ok, si no quiero usar el enfoque de base de datos local, y a partir de ahora solo quiero hacer las cosas como si agrego el Usuario1, entonces tiene que asignarse a la cuenta [0], luego al Usuario2 con la cuenta [1] y luego podemos obtener la transacción por dirección de cuenta, entonces, ¿cómo lograr eso usando el tipo de datos de dirección en Solidity?
Luego, como dije, solo obtenga la dirección de la cuenta usando web3, llame al método de contrato que actualiza un mapeo uint userId => address account. Eso es. Descansa hay mucho que explicar.
Pero, ¿cómo podemos obtener la dirección de la cuenta? Digamos que estoy implementando el contrato de esta manera "deployer.deploy(AssetContract,[2001014800086] , {from:web3.eth.accounts[1],gas: 6700000})". Significa que se implementará desde la cuenta [1], por lo que en mi contrato puedo asignar la identificación de usuario "2001014800086" con msg.sender, que es la cuenta [1]. Ahora, si estoy pasando otra identificación de usuario en el fragmento de código anterior, ¿cómo asignar esa identificación con la cuenta [2]?
Esto se debe a que solo está implementando el contrato y configurando la identificación en la llamada del constructor. Para actualizarlo sin crear una función que acepte la dirección y la identificación. pasar la dirección de la cuenta: web3.eth.accounts[2]e Id. Entonces este método hará los cambios en la solidez.
Sugiero que tome un tutorial básico de solidez como cryptozombies.io :)
Sí, me he referido a ese ejemplo. Lo que estoy haciendo ahora. Paso todas las cuentas a mi contrato inteligente y asigno una por una dirección de cuenta a los 3 ID de usuario en bucle que paso mientras migro de esta manera: deployment.deploy(AssetContract,[2001014800086,2001014800087,2001014800088],web3.eth .cuentas, {gas: 6700000})
genial :) puedes aceptar la respuesta si resolvió tu problema.