这里有一个nodejs文件,内容是部署编译好的sol文件到testrpc上
下面是该文件的内容:
Web3 = require('web3');
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.personal.newAccount('abc');//create a new account,used to store transfer fee
//testrpc has 3 acccounts,this is the 4th.
fs = require('fs');
json_file = fs.readFileSync('dapp.json');
dapp_info = JSON.parse(json_file);
abiInfo = dapp_info.contractABI;
byteCode = dapp_info.contractBYTE;
coinContract = web3.eth.contract(abiInfo);
deployed = coinContract.new(300000000,1,web3.eth.accounts[3],{data:byteCode,from:web3.eth.accounts[0],gas:3000000});
console.log(deployed.address);//prompt undefined
在终端中node执行该js文件
$node deploy_contract.js
结果是undefined
同样,将上面的代码在node命令行中单行下输入就能获得deployed.address的值(非undefined)
$node
>Web3 = require('web3');
>web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
>web3.personal.newAccount('abc');//create a new account,used to store transfer fee
...
这里的问题困扰了我两个晚上,后来发现是nodejs异步函数问题。
nodejs异步函数,最好做一个回调处理。
deployed = coinContract.new(300000000,1,web3.eth.accounts[3],{data:byteCode,from:web3.eth.accounts[0],gas:3000000});console.log(deployed.address);
这里就是异步函数,因为没加回调处理,导致deployed.address是undefined,若进行其他操作,如:transfer,也会出错。
但是,在node命令行下,单行输入都隐含了异步函数执行直到完成这个过程,一旦换成直接执行js文件,异步函数执行问题就出现了。
下面是这确使用方法:
deployed = coinContract.new(300000000,1,web3.eth.accounts[3],{from:web3.eth.accounts[0],data:byteCode,gas: 3000000}, function(err, coinContract){
if(!err){
if(!coinContract.address)
{
console.log("Cannot get the deploy address");
}
else
{
console.log("Get the deploy address");
//do something
}
}
else
{
console.log(err);
}});