【4】私有链发币

实现源码:

/*************************************
 * web3.js version :  1.0.0-beta.35  *
 *  */

// require filestream to read solidity file
const fs=require("fs")
const Web3=require("web3")
const solc=require("solc")
const web3Admin=require("web3admin")
init Web3  rpc-http Connection through  private port :8545
let web3=new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"))

read contract file
const solcfile=fs.readFileSync("TokenERC20.sol");
compile solc file to json ABI
const output= solc.compile(solcfile.toString(),1)

var tokenContract=output.contracts[':TokenERC20']
get token contract abi
const tokenContractABI=tokenContract.interface
get token contract bytecode recognized by js code
const bytecode=tokenContract.bytecode

asynchronized unlock default account for depolying token20Contract
web3.eth.getAccounts().then(data=>{

    web3.eth.personal.unlockAccount(data[0],'liujp')
    console.log("unlock account:"+data[0])

    /********************* deploy contract **********************
     *   new web3.eth.Contract(param1,param2,param3)            *
     *     param1: JSON.parse(tokenContractABI),                *
     *     param2: address:null,                                *
     *     param3: options{                                     *
     *                data:"0x"+bytecode,                       *
     *                from: account address,                    *
     *                gas:1000000                               *
     *     }                                                    */

    console.log("deploying the contract")
    const tokenContract20=new web3.eth.Contract(JSON.parse(tokenContractABI))
    tokenContract20.deploy({
        data:'0x'+bytecode,    //以0x开头
        //传递构造函数的参数(发行量:10000000000000,token名称:'XXXX',符号:"XXX")
        arguments:[10000000000000,'XXXX','XXX']
    }).send({
        from:"0x04a78a0ef3d868fdb9d7532c8b1ef7f49167f5a4",
        gas:1000000,
        gasPrice:'30000000'
    },function(error,transactionHash){
        console.log("send回调");
        console.log("error:"+error);
        console.log("send transactionHash:"+transactionHash);
    }).on('error', function(error){ console.error(error) })
        .then(function(newContractInstance){
            var newContractAddress=newContractInstance.options.address
            console.log("新合约地址:"+newContractAddress);
        });


    web3.eth.getBalance(data[0])
        .then(function(balance){
            console.log(balance)
        });
    // sendTransaction
    // web3.eth.sendTransaction({
    //     from:data[0],
    //     to: data[1],
    //     value:web3.utils.toWei("1")
    // });
    miner start mining
    // web3Admin.extend(web3)
    // console.log("turning on mining",web3.miner.start())
    // console.log("isMining?",web3.eth.mining)

    //执行结果:
    //send transactionHash:0x9bfb166a8abb3211b4c5303ae905e40c655e0480d8a5246bc3a8a260eb68333e
    ///新合约地址:0xFa5d8686fA1f899E88CD6d45B7Deab57d3F32caC
});
ERC20代币源码:
pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract TokenERC20 {
    string public name="LJP";
    string public symbol="LJP";
    uint8 public decimals = 18;  // 18 是建议的默认值
    uint256 public totalSupply=1000000000000;

    mapping (address => uint256) public balanceOf;  // 
    mapping (address => mapping (address => uint256)) public allowance;

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Burn(address indexed from, uint256 value);


    function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);
        balanceOf[msg.sender] = totalSupply;
        name = tokenName;
        symbol = tokenSymbol;
    }


    function _transfer(address _from, address _to, uint _value) internal {
        require(_to != 0x0);
        require(balanceOf[_from] >= _value);
        require(balanceOf[_to] + _value > balanceOf[_to]);
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);
        balanceOf[msg.sender] -= _value;
        totalSupply -= _value;
        Burn(msg.sender, _value);
        return true;
    }

    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);
        require(_value <= allowance[_from][msg.sender]);
        balanceOf[_from] -= _value;
        allowance[_from][msg.sender] -= _value;
        totalSupply -= _value;
        Burn(_from, _value);
        return true;
    }
}
 
  1. 安装webstorm 平台 ,web3 0.0-beta35最新版、solc、等js库
  2. 准备erc20代币token合约
  3. 具体实现过程见源码
  4. 成功之后注意在控制台(geth console)处调用miner.start(),启动挖矿(当前web3Admin 调用miner仍存在问题,暂通过控制台执行)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值