Parity, Web3, Nodejs - Error: la transacción no se extrajo en 750 segundos, asegúrese de que su transacción se haya enviado correctamente

Estoy usando Parity (red de prueba "ropsten"), Nodejs y web3js para implementar un contrato inteligente desde mi sistema. La paridad se sincroniza en el modo de prueba, pero cuando ejecuto el código debajo usando Nodejs, me dio una identificación de transacción " https://ropsten.etherscan.io/tx/0xa229e52224e7200337aa7893fea71c83e79cd5b2b37234a1559d9e6a7512385d ", pero cuando verifiqué esta transacción en etherscan ropsten testnet, entonces Encontré esa transacción no extraída por etherscan. No estoy seguro de por qué la transacción no se movió de mi nodo local de "Paridad" a etherscan.

Cualquier ayuda sería apreciada.

var Web3 = require('web3');
let fs = require("fs");
var solc = require('solc');

if( typeof Web3.currentProvider !== 'undefined'){
    web3 = new Web3( Web3.currentProvider );
}else{
    web3 = new Web3( new Web3.providers.HttpProvider("http://localhost:8545"));
}

async function deployContract(){

    var address = await web3.eth.getAccounts()
    var contractAdminAddrs = address[2]
    console.log("Contract deployed from: "+contractAdminAddrs);

    var input = {
        //'IERC20.sol': fs.readFileSync('IERC20.sol', 'utf8'),
        //'SafeMath.sol': fs.readFileSync('SafeMath.sol', 'utf8'),
        'Distribution.sol': fs.readFileSync('Distribution.sol', 'utf8')
    };
    let compiledContract = await solc.compile({sources: input}, 1);

    //console.log(compiledContract);
    //return false;

    let abi = compiledContract.contracts['Distribution.sol:Distribution'].interface;
    let bytecode = '0x'+compiledContract.contracts['Distribution.sol:Distribution'].bytecode;

    console.log("Contract Deployment Gas Estimate=")
    var gasEstimate = web3.eth.estimateGas({
        to: contractAdminAddrs,
        data: bytecode
    }).then(console.log)

    let Token = new web3.eth.Contract(JSON.parse(abi)); 

    console.log("ABI");
    console.log(abi);
    //return false;

    //var gasEstimate = 4500000; //Default gas
    var gas_Estimate = 4500000    //Calculated from above function,used static
    var gasPrice = 30000000000;

    var lms = Token.deploy(
        {data:bytecode,arguments:[contractAdminAddrs]})
        .send({
            from: contractAdminAddrs,
            gas: gas_Estimate,
            gasPrice: gasPrice
        }, 
        function(error, transactionHash){ 
            console.log("send function error=")
            console.log(error)

            console.log("transactionHash=")
            console.log(transactionHash)
        })
        .on('error', function(error){ 
            console.log("contract deploy error=")
            console.log(error)
        })
        .on('transactionHash', function(transactionHash){ 
            console.log("transactionHash 2nd function=")
            console.log(transactionHash)
        })
        .on('receipt', function(receipt){
            console.log("Receipt=")
            console.log(receipt.contractAddress) // contains the new contract address
        })
        .on('confirmation', function(confirmationNumber, receipt){ 
            console.log("Confirmation Number=")
            console.log(confirmationNumber)
        })
        .then(function(newContractInstance){
            console.log("New Contract address=")
            console.log(newContractInstance.options.address) // instance with the new contract address
        });


}

//Call function to deploy contract
deployContract()

Respuestas (1)

Puede usar el script de NodeJS a continuación para probar si su nodo de paridad está sincronizado y listo para recibir solicitudes.

Ejecútelo como un proceso al lado de su proceso de Paridad (es decir, en la misma máquina).

Este proceso es esencialmente un servidor HTTP, que se comunica con el proceso de paridad en un puerto y con su cliente HTTP (por ejemplo, navegador) en otro puerto.

Ejecución: ejecutar node check.js SERVER_PORT NODE_ADDRESS ETHERSCAN_KEY SYNC_THRESHOLD.

Puede generar su ETHERSCAN_KEYde la siguiente manera:

Por cierto, esta clave es buena tanto para Ropsten (red de prueba) como para Homestead (red principal).

Para SYNC_THRESHOLD, puede usar 10 por ahora y averiguar más tarde cuál es el mejor valor para usar. Este parámetro indica la diferencia permitida entre el bloque actual del nodo Parity y el bloque más alto de la cadena (que obtenemos de etherscan.io). Si la diferencia entre estos dos valores es SYNC_THRESHOLDo menos, entonces el nodo de paridad está listo para recibir solicitudes y el servidor devolverá 200. De lo contrario, el nodo de paridad no está listo para recibir solicitudes y el servidor devolverá 500.

let Web3    = require("web3");
let http    = require("http");
let request = require("request");

let SERVER_PORT    = process.argv[2];
let NODE_ADDRESS   = process.argv[3];
let ETHERSCAN_KEY  = process.argv[4];
let SYNC_THRESHOLD = process.argv[5];

let server = http.createServer(async function(externalRequest, externalResponse) {
    request.get("https://api-ropsten.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=" + ETHERSCAN_KEY, async function (error, response, body) {
        let externalResponseCode;
        let externalResponseBody;
        if (error) {
            externalResponseCode = 500;
            externalResponseBody = "error: " + error;
        }
        else if (!response) {
            externalResponseCode = 500;
            externalResponseBody = "no response";
        }
        else if (response.statusCode != 200) {
            externalResponseCode = 500;
            externalResponseBody = "bad response";
        }
        else {
            let web3 = new Web3(NODE_ADDRESS);
            let currentBlock = await web3.eth.getBlockNumber();
            let highestBlock = parseInt(JSON.parse(body).result);
            if (web3.currentProvider.constructor.name == "WebsocketProvider")
                web3.currentProvider.connection.close();
            externalResponseCode = highestBlock - currentBlock > parseInt(SYNC_THRESHOLD) ? 500 : 200;
            externalResponseBody = `currentBlock = ${currentBlock}, highestBlock = ${highestBlock}`;
        }
        console.log(externalResponseCode, externalResponseBody);
        externalResponse.statusCode = externalResponseCode;
        externalResponse.end(externalResponseBody);
    });
});

server.listen(SERVER_PORT, async function(error) {
    if (error)
        return console.log(error);
    console.log(`server is listening on port ${SERVER_PORT}`);
});
Gracias @goodvibration por su código detallado, déjeme verificar si esto me ayuda a resolver el problema del nodo de paridad.
Ejecuté su código y obtuve "currentBlock = 3788976, highBlock = 3788976", lo que significa que mi nodo de testnet de paridad ropsten está sincronizado. Su código es muy útil para validar el estado del nodo, estoy usando "Parity-ui" para verificar la sincronización de paridad. estado. Gracias por tu ayuda.