use web3js e infura contrato de implementación

const Web3 = require('web3');
const fs = require('fs');
const solc = require('solc');
let web3;
if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/my key'));
}
const source = fs.readFileSync('./contract/coin.sol', 'utf8');
const compile = solc.compile(source, 1);
const contractCompile = Object.values(compile.contracts)[0];
const deployAddr = '0x.....';
const contractByteCode = '0x' + contractCompile.bytecode;
const contractAbi = JSON.parse(contractCompile.interface);
const gasEstimate = web3.eth.estimateGas({data: contractByteCode});
const gasPrice = '20000000000';
const myContract = new web3.eth.Contract(contractAbi, {
    from: deployAddr,
    gas: '15000000',
    gasPrice: gasPrice,
});
const initialSupply = 10000000000;
const tokenName = 'LLT';
const tokenSymbol = 'LLT';

myContract.deploy({
    data: contractByteCode,
    arguments: [initialSupply, tokenName, tokenSymbol]
}).send({
    from: deployAddr,
    gas: '15000000',
    gasPrice: gasPrice
}, function (error) {
    console.log(error);
})
.on('transactionHash', function (transactionHash) {console.log(transactionHash)})
.on('receipt', function (receipt) {
    console.log(receipt.contractAddress) // contains the new contract address
}).on('confirmation', function (confirmationNumber, receipt) {
}).then(function (newContractInstance) {
    console.log(newContractInstance.options.address) // instance with the new contract address
}).catch(err => {
    console.log("Error: failed to deploy, detail:", err)
});

Obtengo Error: Invalid JSON RPC response: ""cuando uso el nodo para ejecutar este código.

¿Cómo puedo resolver este problema? Gracias

Lo que noté fue: new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/my key'))debería ser: new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/'))aunque no sé si esto resolverá el problema.

Respuestas (4)

Intenta usar .sendRawTransaction()en lugar de .send(), entonces:

myContract.deploy({
    data: contractByteCode,
    arguments: [initialSupply, tokenName, tokenSymbol]
}).sendRawTransaction({
    from: deployAddr,
    gas: '15000000',
    gasPrice: gasPrice
}, function (error) {
    console.log(error);
})
.on('transactionHash', function (transactionHash) {console.log(transactionHash)})
.on('receipt', function (receipt) {
    console.log(receipt.contractAddress) // contains the new contract address
}).on('confirmation', function (confirmationNumber, receipt) {
}).then(function (newContractInstance) {
    console.log(newContractInstance.options.address) // instance with the new contract address
}).catch(err => {
    console.log("Error: failed to deploy, detail:", err)
});

No estoy seguro de que funcione, probablemente tengas que preparar y firmar la transacción antes de enviarla usando Infura.

Error: TypeError: myContract.deploy(...).sendRawTransaction no es una función
Consulte la documentación oficial de la API de su versión web3js. Puede haber muchos cambios importantes, ya que todavía está en versión beta.

Supongo que está usando Metamask y en realidad usa su proveedor, por lo tanto, entrando en la verdad de esta condición:

if (typeof web3 !== 'indefinido') {
web3 = new Web3(web3.currentProvider);
}
else {
web3 = new Web3(new Web3.providers.HttpProvider(' https://ropsten.infura.io/my key'));
}

entonces esto podría suceder debido a un problema de sincronización con metamask (lo obtuve varias veces al usar un nodo RPC personalizado)
mi sugerencia es intentar ir a la configuración de MM y restablecer la cuenta (solo eliminará transacciones) y si eso no es así funciona, intente desinstalar y reinstalar metamask

Además del comentario, que indica correctamente la clave infura faltante, esto no puede funcionar, ya que no tiene un componente de código que realmente firme la transacción. La API web3 a la que se hace referencia aquí se basa en clientes de nodo con claves privadas para hacerlo, lo que, por supuesto, no es factible con infura. Pruebe esta solución en su lugar, considere también el último comentario de esa esencia.

Supongo que es porque está intentando implementar un contrato desde una dirección (deployAddr) pero no está enviando ninguna clave privada para verificar la propiedad de esa dirección (deployAddr).

Por lo tanto, debe agregar una clave privada de esa dirección (deployAddr) antes de implementar el contrato, así:

const add = await web3.eth.accounts.wallet.add(privateKeyOfDeployAddr);

Espero eso ayude.

¡Salud!