Entonces, he estado tratando de implementar un contrato inteligente usando nodejs, pero cuando llamo a la función para implementar, no obtengo una dirección de contrato en mi consola. Es como si la función send() nunca completara su ejecución. Y es por eso que la siguiente instrucción nunca comienza a ejecutarse, aunque sé que el contrato aún se está implementando en mi red blockchain local (lo sé porque puedo ver en el indicador de cmd dónde se está ejecutando mi ganache-cli. Estoy tratando de obtener la dirección del contrato implementado, dígame cómo hacer lo mismo.
Comportamiento esperado La llamada await contract.deploy({..}).send({..}) debería devolver una respuesta, y después de eso, la dirección del contrato debería imprimirse en la consola.
Comportamiento real En cambio, no se imprime ningún resultado en la consola después de esto: 'Función de implementación llamada, a punto de implementar'.
la salida del símbolo del sistema se detiene después de:
D:/Usuario/proyecto>nodo src/implementar
¿Sin web3? ¡Deberías considerar probar MetaMask!
[AsyncFunction: deployment] ingresado, a punto de implementarse
Aunque sé que el contrato se ha implementado porque mi ganache-cli muestra este resultado:
Transacción: 0x12345
Contrato creado: 0x12345
Consumo de gasolina: 1605526
Número de bloque: 6
Block Time: se muestra la fecha y la hora de la implementación
Aquí está el código que estoy tratando de ejecutar: (deploy.js)
var Web3 = require('web3');
// abibytecode[0] has abi, abibytecode[1] has bytecode
const abibytecode = require('../src/compile');
var web3;
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
console.log('No web3? You should consider trying MetaMask!');
web3 = new Web3('ws://localhost:8545');
}
let account = 'my account address is here';
const contract = new web3.eth.Contract(abibytecode[0]);
const deploy = async () => {
console.log('Deploy function called, about to deploy');
const response = await contract.deploy({data: abibytecode[1]}).send({
from: account,
gas: '3000000'
});
console.log('Contract deployed to:', response.address);
console.log('Contract deployed to:', response.options.address);
return response;
};
console.log(deploy);
deploy((res)=>{console.log(res)});
Versiones:
web3.js: 1.0.0-beta.55
nodejs: v10.16.0
navegador: Ninguno, ejecutando el script desde el comando
nodo ethereum: ganache-cli
Además, esta es mi primera publicación en stackexchange, así que si me perdí alguna información, házmelo saber y llenaré los vacíos.
Para implementar un contrato se requiere un firmante. El uso de web3 requiere que la clave privada de la dirección esté presente en el nodo. Asegúrese de que la clave privada de la cuenta esté presente en el nodo de prueba local. Una forma es comenzar constantemente ganache-cli
con un conjunto de claves privadas.
Hay un problema en la forma en que se invoca la función de implementación asíncrona, debería ser
deploy().then(function(response){ console.log(response)})
También puede cambiar a ethers.js, es más amigable para los desarrolladores
const { ContractFactory, Wallet, providers } = require('ethers')
const provider = new providers.JsonRpcProvider('http://localhost:8545')
const wallet = new Wallet(privateKey, provider)
async function deployContracts() {
let token = new ContractFactory(tokenabi, tokenbytecode, wallet)
// this deploys the contract
token = await token.deploy()
// we must wait until it is mined
token = await token.deployed()
return token
}
buena vibración
abibytecode[0]
es un objeto y no una cadena? ¿ Estás seguro de queabibytecode[1]
es una cadena que comienza con0x
?buena vibración
Aditya Sahu
Aditya Sahu
buena vibración
data: '0x' + abibytecode[1]
en su lugar. Además, si el constructor de su contrato toma argumentos de entrada, debe agregarlosarguments: [your argument values]
cuando llame acontract.deploy
.Aditya Sahu
Aditya Sahu
Aditya Sahu
Aditya Sahu
buena vibración