我正在尝试使用web3和nodejs部署一个solidity合同,并且在所有测试网上都收到错误消息: 如果我尝试在本地testrpc上运行,则一切正常。 您可以在代码中发现可能导致此错误的任何错误,还是测试网出现问题?
const path = require('path');
const fs = require('fs');
const solc = require('solc');
var Web3 = require('web3');
// Infura test network (kovan)
var web3 = new Web3(new Web3.providers.HttpProvider('https://kovan.infura.io/v3/3e0f68cb39c64417b15cf55e486479dd'));
var myAddress = '0x362aa2Bf4b6fB733C4EF41F4d2833E8e5aDc54ed';
var myPrivateKey = new Buffer('a288c7c873f09e96b7f0e404759288606e2ffc0edf58874aeb5a0fe4bcd9c262', 'hex')
// Compile contract from file
const contractPath = path.resolve(__dirname, 'contracts', 'HDS.sol');
const contractSourceCode = fs.readFileSync(contractPath, 'UTF-8');
const compiledContract = solc.compile(contractSourceCode, 1).contracts[':HDS']
var newContractAddress = web3.utils.toChecksumAddress(web3.utils.randomHex(20));
// Create a transaction
var rawTx = {
from: myAddress,
nonce: web3.utils.toHex('13'),
gasPrice: web3.utils.toHex(web3.utils.toWei('1', 'gwei')),
gas: web3.utils.toHex('892413'),
gasLimit: web3.utils.toHex('892413'),
data: compiledContract.bytecode
};
// // Unlock account to sign transaction
// web3.eth.personal.unlockAccount(myAddress, myPrivateKey, 600)
// .then(console.log('Account unlocked!'))
// .catch((error) => { console.log(error); });
web3.eth.getBalance(myAddress)
.then(function(balance) { console.log("My balance: ", balance); })
.catch(function(error) { console.log(error); });
web3.eth.accounts.signTransaction(rawTx, myPrivateKey)
.then(function(signResult) {
web3.eth.sendSignedTransaction(signResult.rawTransaction)
.on('error', function (error) { console.log("Error deploying contract: " + error); })
.on('transactionHash', function (transactionHash) { console.log("Transaction hash: " + transactionHash); })
.on('receipt', function (receipt) { console.log("Receipt contract address: " + receipt.contractAddress); })
.on('confirmation', function (confirmationNumber, receipt) {
console.log("Confirmation number: " + confirmationNumber);
console.log("Confirmation receipt: " + receipt);
})
.catch(function (error) { console.log(error); });
});
这是Kovan测试网上的帐户,如果有帮助的话:https://kovan.etherscan.io/address/0x362aa2bf4b6fb733c4ef41f4d2833e8e5adc54ed
答案 0 :(得分:1)
您需要先签署交易,然后再将其发送到网络。最简单的方法是使用助记符解锁一个帐户。您可以在初始化web3
并使用truffle-hdwallet-provider
时执行此操作,此后,您可以从帐户中发送交易而无需手动签名,我认为这是最简单的方法。另一种选择是在使用私钥发送每个交易之前对其进行手动签名,您可以阅读here的操作方式。两种方式在功能上没有区别,但是如果您是第一次接触,则第一次使用会容易一些。