0

我在这里有一份合同:

pragma 可靠性 ^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-betawith

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)  

});

但是,当我将它部署在正在挖掘的私有区块链上时,我发现接收者的余额没有任何变化。

=================== 编辑=============================

我按照下面的答案将供应参数传递到合同中,但它仍然没有执行。这可能是由于时间问题,所以我将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('=====================================================')



    })

});
4

1 回答 1

0

您需要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)
})

请参阅此处的部署文档以了解如何将参数传递给合约构造函数。

此外,请确保您Charity的函数名称大写以匹配合同的名称(否则它不是构造函数)。

于 2018-01-28T23:46:22.620 回答