Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

318
Views
Cómo decodificar la respuesta de llamar a un contrato inteligente en Ethereum usando Web3js en nodejs

Mi proyecto consta de 3 partes

  1. Servidor Node.js usando Web3js para conectarse con la red Ethereum.
  2. El proyecto Truffle consiste en contratos inteligentes.
  3. Ganache para ejecutar la red Ethereum local.

Básicamente, necesito llamar a la red Ethereum desde mi servidor Node.js para obtener datos de la red Blockchain.

Este es mi contrato principal

 // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract RewardToken is ERC20 { constructor(string memory name, string memory symbol) ERC20(name, symbol) {} }

Este es mi contrato de fábrica

 // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import './RewardToken.sol'; contract RewardTokenFactory { address[] public deployedRewardTokens; mapping(address => RewardToken) ownerToTokens; function createToken(string calldata name, string calldata symbol) public { RewardToken newToken = new RewardToken(name, symbol); ownerToTokens[msg.sender] = newToken; deployedRewardTokens.push(address(newToken)); } function getOwnerToken() public view returns(RewardToken) { return ownerToTokens[msg.sender]; } }

Este es mi método Node.js

 const rewardTokenData = await rewardTokenContractInstance.getOwnerToken({ from: address, }); console.log(rewardTokenData, ' :rewardTokenData');

esto es lo que obtuve rewardTokenData después de llamar a .getOwnerToken

 0xcb22Ff93c8253224dBAF033376c762bC03024343

Entonces, ¿debería suponer que debo obtener datos reales del contrato del new RewardToken ?

Si no, ¿cómo puedo decodificar la respuesta para que sea un dato legible?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Supongo que desea extraer datos del contrato de token de un propietario. Para hacer eso, deberá escribir funciones de obtención específicas en su contrato de Factory. Aquí hay un ejemplo, para obtener el suministro total de tokens del contrato que es propiedad de msg.sender:

 contract RewardTokenFactory { address[] public deployedRewardTokens; mapping(address => RewardToken) ownerToTokens; function createToken(string calldata name, string calldata symbol) public { RewardToken newToken = new RewardToken(name, symbol); ownerToTokens[msg.sender] = newToken; deployedRewardTokens.push(address(newToken)); } function getTotalSupply() public view returns(uint256) { return ownerToTokens[msg.sender].totalSupply(); } }

En la interfaz, tendrá que convertirlo a un número de bits más pequeño con .toNumber(), para que funcione para JavaScript.

Aquí puede ver la función erc20 totalSupply() documentada: https://docs.openzeppelin.com/contracts/2.x/api/token/erc20#IERC20-totalSupply--

También puede ver las otras funciones que puede usar. No hay muchos. Las otras posibles funciones de tipo "vista" que podría crear es obtener el saldo de una dirección específica de ese token (getBalance()),

Sin embargo, siempre puede agregar funciones adicionales en su contrato de token, que luego puede usar en su contrato de fábrica para escribir funciones de obtención:

 // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract RewardToken is ERC20 { constructor(string memory name, string memory symbol) ERC20(name, symbol) {} function getTokenName() public { return _name; } }

Puede encontrar todas las variables privadas de ERC20 en su github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

Y luego puede usar getTokenName() en el contrato de fábrica, para obtener el nombre del token que es propiedad de msg.sender:

 contract RewardTokenFactory { address[] public deployedRewardTokens; mapping(address => RewardToken) ownerToTokens; function createToken(string calldata name, string calldata symbol) public { RewardToken newToken = new RewardToken(name, symbol); ownerToTokens[msg.sender] = newToken; deployedRewardTokens.push(address(newToken)); } function getTokenNameOfMsgSender() public view returns(uint256) { return ownerToTokens[msg.sender].getTokenName(); } }

Nota: no probé el código, puede haber errores de sintaxis.

La razón por la que tiene que escribir funciones get específicas es porque el contrato es demasiado grande para enviarlo a web3.js. Solidity convierte automáticamente el contrato en un hash de 256 bits, lo que lo hace inutilizable para usar en la interfaz (o tal vez ese hash que mostraste es solo la dirección del contrato del token, no lo sé exactamente, pero eso es irrelevante).

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!