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

95
Views
Solidez y web3 sha3

Trato de codificar un tokenId con una semilla en mi contrato inteligente. Por simplicidad y para evitar otros errores, dejo la semilla por ahora. Básicamente, solo quiero codificar un número en mi contrato y codificar el mismo número en mi código javascript y recibir el mismo resultado. El código se parece a esto en Solidity:

 function _tokenURI(uint256 tokenId) internal view returns (string memory) { string memory currentBaseURI = _baseURI(); bytes32 hashedToken = keccak256(abi.encodePacked(tokenId)); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, hashedToken, baseExtension)) : ""; }

lo que también conduce a un error en el invalid codepoint at offset . Para abordar esto, traté de convertir bit32 en una cadena usando estas funciones

 function _bytes32ToString(bytes32 _bytes32) private pure returns (string memory) { uint8 i = 0; bytes memory bytesArray = new bytes(64); for (i = 0; i < bytesArray.length; i++) { uint8 _f = uint8(_bytes32[i / 2] & 0x0f); uint8 _l = uint8(_bytes32[i / 2] >> 4); bytesArray[i] = _toByte(_f); i = i + 1; bytesArray[i] = _toByte(_l); } return string(bytesArray); } function _toByte(uint8 _uint8) private pure returns (bytes1) { if (_uint8 < 10) { return bytes1(_uint8 + 48); } else { return bytes1(_uint8 + 87); } }

aunque no estoy seguro si esto es equivalente. El código en la interfaz se ve así:

 const hashed = web3.utils.soliditySha3( { type: "uint256", value: tokenId} );

¿Qué debo cambiar para recibir exactamente el mismo resultado? ¿Y qué significa un punto de código no invalid codepoint at offset ?

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

0

Obtiene el error de punto de invalid codepoint porque mezcla datos de cadena y byte cuando llama a abi.encodePacked(currentBaseURI, hashedToken, baseExtension)) .

Cuando Javascript obtiene el valor de retorno del contrato, espera una cadena UTF8, pero dentro de su hashToken tiene valores de byte que no son válidos para una cadena codificada en UTF8.

Este tipo de error puede ser "intermitente". Puede suceder en algunos casos. Tienes suerte de verlo durante el desarrollo y no en producción.

¿Como arreglarlo?

Está en el camino correcto al convertir el resultado hash en una cadena. Hay una forma alternativa de hacerlo en esta respuesta que usa menos gas usando solo operaciones bit a bit.

Para convertir el valor hexadecimal en Javascript, puede usar web3.utils.hexToNumberString() .

about 4 years ago · Juan Pablo Isaza Report

0

¿Quizás el problema es que tokenId no es uint256 o Web3, versión de Solidity? Hice algunas pruebas con Remix IDE y recibí los mismos resultados.
Código de solidez:

 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Hash { function getHashValue_1() public view returns(bytes32){ return keccak256(abi.encodePacked(uint256(234))); } // bytes32: 0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2 function getHashValue_3() public view returns(bytes32){ return keccak256(abi.encodePacked(uint256(10),string('StringSecretValue'))); } // bytes32: 0x5938b4caf29ac4903ee34628c3dc1eb5c670a6bd392a006d0cb91f1fc5db3819 }

Código JS:

 (async () => { try { console.log('Web3 version is '+ Web3.version); // Web3 version is 1.3.0 let theValueYouNeed = web3.utils.soliditySha3("234"); theValueYouNeed = web3.utils.soliditySha3({type: 'uint256', value: '234'}); theValueYouNeed = web3.utils.soliditySha3({t: 'uint256', v: '234'}); // above hashed value is 0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2 console.log('Hashed value 1 is '+theValueYouNeed); theValueYouNeed = web3.utils.soliditySha3({t: 'uint256', v: '10'},{t: 'string', v: 'StringSecretValue'}); console.log('Hashed value 2 is '+theValueYouNeed); // above hashed value is 0x5938b4caf29ac4903ee34628c3dc1eb5c670a6bd392a006d0cb91f1fc5db3819 } catch (e) { console.log(e.message) } })()

No estoy seguro, pero el punto de código no válido en el desplazamiento debería significar que un valor designado no se encuentra dentro del rango o conjunto de valores permitidos ... Entonces, ¿tal vez haya algún problema con tokenId y podría hacer algunas pruebas con valores codificados?

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!