错误:方法eth_sendTransaction不存在/不可用

时间:2019-03-14 03:52:06

标签: node.js blockchain ethereum solidity web3js

在调用已在ropsten-infura中部署的团结合同时显示错误。我正在使用web3(@ 0.19.1)调用合同。

有人遇到同样的问题吗?

3 个答案:

答案 0 :(得分:0)

我猜您是直接连接到Infura,它不支持eth_sendTransaction。 (为此,它需要知道您的私钥,但这是一个共享的公共节点。)

您需要自己签署交易,然后通过eth_sendRawTransaction发送,或使用可以在浏览器中保存私钥(例如MetaMask)的提供商。

答案 1 :(得分:0)

您需要在交易之前签名,这就是我使用web3 1.0.0进行交易的方式。

我使用了MetaMask的web3-provider-engine:https://github.com/MetaMask/web3-provider-engine/blob/master/subproviders/hooked-wallet-ethtx.js

getWalletEthTxSubprovider() {
    return new HookedWalletEthTxSubprovider({
        getAccounts: callback => {
            callback(null, [this.web3.eth.defaultAccount]);
        },
        getPrivateKey: (address, callback) => {
            if (address.toLowerCase() === this.web3.eth.defaultAccount.toLowerCase()) {
                return callback(
                    null,
                    Buffer.from(
                        this.web3.eth.accounts.wallet[address].privateKey.replace('0x', ''),
                        'hex'
                    )
                );
            }
            return callback(new Error('not private key supplied for that account'));
        }
    });
}

您可以在https://github.com/SelfKeyFoundation/Identity-Wallet/blob/60733b208275119b31abf2cb3ab1f49f0b6801a3/src/main/blockchain/web3-service.js#L42-L76

上查看完整的代码

答案 2 :(得分:0)

这是智能合约功能执行的示例: 我们知道不可能在不收费的情况下在以太坊网络中进行交易,因此您可以通过联系帐户委派费用

                                        const rawTx =
                                    {
                                        nonce: _hex_nonce,
                                        from: MainAccountAddress,
                                        to: contractAddress,
                                        gasPrice: _hex_gasPrice,
                                        gasLimit: _hex_gasLimit,
                                        gas: _hex_Gas,
                                        value: '0x0',
                                        data: contract.methods.transfer(toAddress, _hex_value).encodeABI()
                                    };

                                    const tx = new Tx(rawTx, { 'chain': 'ropsten' });
                                    tx.sign(privateKey);

                                    var serializedTx = '0x' + tx.serialize().toString('hex');
                                    web3.eth.sendSignedTransaction(serializedTx.toString('hex'), function (err, hash) {
                                        if (err) {
                                            reject(err);
                                        }
                                        else {
                                            resolve(hash);
                                        }
                                    })

这里是通过合同主要权限委派委派执行智能合同的完整资源:

async function TransferERC20Token(toAddress, value) {
return new Promise(function (resolve, reject) {
    try {
        web3.eth.getBlock("latest", false, (error, result) => {
            var _gasLimit = result.gasLimit;
            let contract = new web3.eth.Contract(contractABI, contractAddress);

            contract.methods.decimals().call().then(function (result) {
                try {
                    var decimals = result;
                    let amount = parseFloat(value) * Math.pow(10, decimals);
                    web3.eth.getGasPrice(function (error, result) {
                        var _gasPrice = result;
                        try {
                            const Tx = require('ethereumjs-tx').Transaction;
                            const privateKey = Buffer.from(MainAccountPrivateKey, 'hex')

                            var _hex_gasLimit = web3.utils.toHex((_gasLimit + 1000000).toString());
                            var _hex_gasPrice = web3.utils.toHex(_gasPrice.toString());
                            var _hex_value = web3.utils.toHex(amount.toString());
                            var _hex_Gas = web3.utils.toHex('60000');

                            web3.eth.getTransactionCount(MainAccountAddress).then(
                                nonce => {
                                    var _hex_nonce = web3.utils.toHex(nonce); 

                                    const rawTx =
                                    {
                                        nonce: _hex_nonce,
                                        from: MainAccountAddress,
                                        to: contractAddress,
                                        gasPrice: _hex_gasPrice,
                                        gasLimit: _hex_gasLimit,
                                        gas: _hex_Gas,
                                        value: '0x0',
                                        data: contract.methods.transfer(toAddress, _hex_value).encodeABI()
                                    };

                                    const tx = new Tx(rawTx, { 'chain': 'ropsten' });
                                    tx.sign(privateKey);

                                    var serializedTx = '0x' + tx.serialize().toString('hex');
                                    web3.eth.sendSignedTransaction(serializedTx.toString('hex'), function (err, hash) {
                                        if (err) {
                                            reject(err);
                                        }
                                        else {
                                            resolve(hash);
                                        }
                                    })
                                });                                
                        } catch (error) {
                            reject(error);
                        }
                    });
                } catch (error) {
                    reject(error);
                }
            });
        });
    } catch (error) {
        reject(error);
    }
})

}