部署的合约执行失败

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 大写以匹配合约名称(否则它不是构造函数)。