部署的合约执行失败
Deployed contract failed to execute
我这里有合同:
pragma solidity ^0.4.2;
contract Charity{
mapping (address => uint) public coinBalanceOf;
event CoinTransfer(address sender, address receiver, uint amount);
function charity(uint supply){
coinBalanceOf[msg.sender] = supply;
}
function sendCoin(address receiver, uint amount) returns (bool sufficient)
{
if (coinBalanceOf[msg.sender] < amount) return false;
coinBalanceOf[msg.sender] -= amount;
coinBalanceOf[receiver] += amount;
CoinTransfer(msg.sender, receiver, amount);
return true;
}
}
当我使用 web3 1.0.0-beta
和
进行部署时
import * as fs from 'fs' ;
import * as solc from 'solc' ;
import * as Web3 from 'web3' ;
var web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
var contract_path : string = "../solidity/contracts/Charity.sol"
const input = fs.readFileSync(contract_path)
const output = solc.compile(input.toString(), 1);
var contract_name = ":" + pr.last(contract_path.split("/")).split(".")[0]
const bytecode = output.contracts[contract_name].bytecode
const abi_ = JSON.parse(output.contracts[contract_name].interface);
web3.eth.getAccounts().then(accounts => {
var coinbase = accounts[0];
var receiver = accounts[1];
// create contract
var myContract = new web3.eth.Contract(abi_, coinbase,
{
from : coinbase,
gasPrice: "2000000"
});
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("Hash: ", hash)
})
myContract.methods.sendCoin(receiver, 7000000).send({
from: coinbase,
gas: 100000,
gasPrice: '10000000'
}, (err,val) => {
if (err) { console.log(err) }
else {
console.log("sent coin: ", val)
}
})
.then(console.log)
});
然而,当我将其部署在正在挖掘的私有区块链上时,我发现接收方的余额没有变化。
===================编辑========================= ====
我按照下面的答案将 supply 参数传递到合约中,但是它仍然没有执行。可能是时间问题,所以我把sendCoin
函数移到了回调中如下,但是还是没有执行:
var myContract = new web3.eth.Contract(abi_, coinbase,
{
from : coinbase,
gasPrice: "2000000",
});
/**
maybe there should be a callback up there ----^ ???
*/
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
arguments: [2406927999999] // this is not sending
// web3.eth.getBalance(coinbase)] note the raw number gets error: number-to-bn
// is it because it's too big?
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("contract deployed with Hash: [REDACTED]")
}).then((v) => {
/**
maybe this should happen in the callback?
*/
myContract.methods.sendCoin(receiver, 70000000000).send({
from: coinbase,
gas : 100000 ,
gasPrice: '10000000'
}, (err,val) => {
if (err) { console.log(err) }
else {
console.log("---------------------------------------")
console.log("sent coin: ", val)
console.log("---------------------------------------")
}
})
console.log(".then callback with value.options: ", v.options)
console.log('=====================================================')
})
});
初始化合约时需要传入supply
的值。你可以像这样传递它:
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
arguments: [999999999]
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("Hash: ", hash)
})
查看部署文档here了解如何将参数传递到合约构造函数。
此外,请确保函数名称中的 Charity
大写以匹配合约名称(否则它不是构造函数)。
我这里有合同:
pragma solidity ^0.4.2;
contract Charity{
mapping (address => uint) public coinBalanceOf;
event CoinTransfer(address sender, address receiver, uint amount);
function charity(uint supply){
coinBalanceOf[msg.sender] = supply;
}
function sendCoin(address receiver, uint amount) returns (bool sufficient)
{
if (coinBalanceOf[msg.sender] < amount) return false;
coinBalanceOf[msg.sender] -= amount;
coinBalanceOf[receiver] += amount;
CoinTransfer(msg.sender, receiver, amount);
return true;
}
}
当我使用 web3 1.0.0-beta
和
import * as fs from 'fs' ;
import * as solc from 'solc' ;
import * as Web3 from 'web3' ;
var web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
var contract_path : string = "../solidity/contracts/Charity.sol"
const input = fs.readFileSync(contract_path)
const output = solc.compile(input.toString(), 1);
var contract_name = ":" + pr.last(contract_path.split("/")).split(".")[0]
const bytecode = output.contracts[contract_name].bytecode
const abi_ = JSON.parse(output.contracts[contract_name].interface);
web3.eth.getAccounts().then(accounts => {
var coinbase = accounts[0];
var receiver = accounts[1];
// create contract
var myContract = new web3.eth.Contract(abi_, coinbase,
{
from : coinbase,
gasPrice: "2000000"
});
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("Hash: ", hash)
})
myContract.methods.sendCoin(receiver, 7000000).send({
from: coinbase,
gas: 100000,
gasPrice: '10000000'
}, (err,val) => {
if (err) { console.log(err) }
else {
console.log("sent coin: ", val)
}
})
.then(console.log)
});
然而,当我将其部署在正在挖掘的私有区块链上时,我发现接收方的余额没有变化。
===================编辑========================= ====
我按照下面的答案将 supply 参数传递到合约中,但是它仍然没有执行。可能是时间问题,所以我把sendCoin
函数移到了回调中如下,但是还是没有执行:
var myContract = new web3.eth.Contract(abi_, coinbase,
{
from : coinbase,
gasPrice: "2000000",
});
/**
maybe there should be a callback up there ----^ ???
*/
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
arguments: [2406927999999] // this is not sending
// web3.eth.getBalance(coinbase)] note the raw number gets error: number-to-bn
// is it because it's too big?
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("contract deployed with Hash: [REDACTED]")
}).then((v) => {
/**
maybe this should happen in the callback?
*/
myContract.methods.sendCoin(receiver, 70000000000).send({
from: coinbase,
gas : 100000 ,
gasPrice: '10000000'
}, (err,val) => {
if (err) { console.log(err) }
else {
console.log("---------------------------------------")
console.log("sent coin: ", val)
console.log("---------------------------------------")
}
})
console.log(".then callback with value.options: ", v.options)
console.log('=====================================================')
})
});
初始化合约时需要传入supply
的值。你可以像这样传递它:
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
arguments: [999999999]
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("Hash: ", hash)
})
查看部署文档here了解如何将参数传递到合约构造函数。
此外,请确保函数名称中的 Charity
大写以匹配合约名称(否则它不是构造函数)。