zoukankan      html  css  js  c++  java
  • web3.js_1.x.x--API(二)/合约部署与事件调用

    web3.js_1.x.x的使用和网上查到的官方文档有些不同,我对经常使用到的API进行一些整理,希望能帮到大家
    转载博客:http://www.cnblogs.com/baizx/p/7474774.html
    pragma solidity ^0.5.0;//指定和solcjs中的solidity编译版本一致
    
    contract MyToken {
    
        /*
        10000,"eilinge",4,"lin"
        msg.sender:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
        0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db,20
        0x583031d1113ad414f02576bd6afabfb302140225,40
        0xdd870fa1b7c4700f2bd7f44238821c26f7392148,60
    
        "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db","0xdd870fa1b7c4700f2bd7f44238821c26f7392148",10
        */
        /* Public variables of the token */
        string public name;
        string public symbol;
        uint8 public decimals;
    
        /* This creates an array with all balances */
        mapping (address => uint256) public balanceOf;
        mapping (address => mapping (address => uint)) public allowance;
        mapping (address => mapping (address => uint)) public spentAllowance;
    
        /* This generates a public event on the blockchain that will notify clients */
        event Transfer(address indexed from, address indexed to, uint256 value);
        event ReceiveApproval(address _from, uint256 _value, address _token, bytes _extraData);
    
        /* Initializes contract with initial supply tokens to the creator of the contract */
        constructor(uint256 initialSupply, string memory tokenName, uint8 decimalUnits, string memory tokenSymbol) public{
            balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
            name = tokenName;                                   // Set the name for display purposes
            symbol = tokenSymbol;                               // Set the symbol for display purposes
            decimals = decimalUnits;                            // Amount of decimals for display purposes
        }
    
        /* Send coins */
        function transfer(address _to, uint256 _value) payable public{
            if (balanceOf[msg.sender] < _value) revert();           // Check if the sender has enough
            if (balanceOf[_to] + _value < balanceOf[_to]) revert(); // Check for overflows
            balanceOf[msg.sender] -= _value;                     // Subtract from the sender
            balanceOf[_to] += _value;                            // Add the same to the recipient
            emit Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
        }
    
        /* Allow another contract to spend some tokens in your behalf */
    
        function approveAndCall(address _spender, uint256 _value, bytes memory _extraData)  public returns (bool) {
            allowance[msg.sender][_spender] = _value;
            //emit ReceiveApproval(msg.sender, _value, this, _extraData); //this 在该编译器中无法使用,暂时没有找到正确调用本合约地址
        }
    
        /* A contract attempts to get the coins */
    
        function transferFrom(address _from, address _to, uint256 _value) public payable returns(bool) {
            if (balanceOf[_from] < _value) revert();                 // Check if the sender has enough
            if (balanceOf[_to] + _value < balanceOf[_to]) revert();  // Check for overflows
            if (spentAllowance[_from][msg.sender] + _value > allowance[_from][msg.sender]) revert();   // Check allowance
            balanceOf[_from] -= _value;                          // Subtract from the sender
            balanceOf[_to] += _value;                            // Add the same to the recipient
            spentAllowance[_from][msg.sender] += _value;
            emit Transfer(msg.sender, _to, _value);
        }
    
        /* This unnamed function is called whenever someone tries to send ether to it */
        function () payable external{
            revert();     // Prevents accidental sending of ether
        }
    }
    solcjs --abi --bin token.sol  -->[eve_sol_MyToken.abi/eve_sol_MyToken.bin]
    start truffle:truffle develop //port:9545
    var Web3 = require('web3');
    var fs = require('fs');
    //var web3 = new Web3(new Web3.providers.IpcProvider("\\.\pipe\geth.ipc",net));
    var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:9545"));
    var eth=web3.eth;
    
    /*
    (0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
    (1) 0xf17f52151ebef6c7334fad080c5704d77216b732
    (2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
    (3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
    (4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
    (5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
    (6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
    (7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
    (8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
    (9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
    */
    var abi = JSON.parse(fs.readFileSync("eve_sol_MyToken.abi"));
    var bytecode = fs.readFileSync('eve_sol_MyToken.bin');
    
    var tokenContract = new web3.eth.Contract(abi, null, {
        from: '0xf17f52151ebef6c7334fad080c5704d77216b732' // 目前web3没有api来解锁账户,只能自己事先解锁
    });
    
    /*
    truffle(develop)> tokenContract.options
        { address: [Getter/Setter], jsonInterface: [Getter/Setter] }
    truffle(develop)> tokenContract.options.jsonInterface[1]
        { constant: false,
          inputs:
           [ { name: '_from', type: 'address' },
             { name: '_to', type: 'address' },
             { name: '_value', type: 'uint256' } ],
          name: 'transferFrom',
          outputs: [ { name: '', type: 'bool' } ],
          payable: false,
          stateMutability: 'nonpayable',
          type: 'function',
          signature: '0x23b872dd' }
    */
    tokenContract.deploy({
        data: bytecode,//bin
        arguments: [32222, 'token on web3',0,'web3']
    }).send({
        from: '0xf17f52151ebef6c7334fad080c5704d77216b732',
        gas: 1500000,
        gasPrice: '30000000000000'
    }, function(error, transactionHash){
        console.log("deploy tx hash:"+transactionHash)//0xfe4941511eb5155e94843900ff5b489c3b9beca5ac624e31e364637d2bb90bcd
    })
    .on('error', function(error){
        console.error(error) })
    .on('transactionHash', function(transactionHash){
        console.log("hash:",transactionHash)})// 0xfe4941511eb5155e94843900ff5b489c3b9beca5ac624e31e364637d2bb90bcd
    .on('receipt', function(receipt){
        console.log(receipt.contractAddress) // contains the new contract address
    })
    .on('confirmation', function(confirmationNumber, receipt){
        console.log("receipt,",receipt)})
        /*
        receipt, { transactionHash: '0xfe4941511eb5155e94843900ff5b489c3b9beca5ac624e31e364637d2bb90bcd',
          transactionIndex: 0,
          blockHash: '0x97efd68ca1245db9ef6899589e6a3b1b1e404bd08f5f7467896e9d2b4f03a4c0',
          blockNumber: 16,
          gasUsed: 1041001,
          cumulativeGasUsed: 1041001,
          contractAddress: '0x4D2D24899c0B115a1fce8637FCa610Fe02f1909e',
          status: true,
          logsBloom: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', events: {} }
    */ .then(function(newContractInstance){ console.log(newContractInstance.options.address) // '0x30753E4A8aad7F8597332E813735Def5dD395028' });
    var Web3 = require('web3');
    var fs = require('fs');
    //var web3 = new Web3(new Web3.providers.IpcProvider("\\.\pipe\geth.ipc",net));
    var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:9545"));
    var eth=web3.eth;
    
    
    var MyTokenABI = JSON.parse(fs.readFileSync("eve_sol_MyToken.abi"));
    var addr = '0x2C2B9C9a4a25e24B174f26114e8926a9f2128FE4';
    
    var tokenContract = new web3.eth.Contract(MyTokenABI, addr);
    
    //合约部署成功以后,有了地址就可以根据地址来查询合约的状态
    tokenContract.methods.name().call(null,function(error,result){
            console.log("contract name "+result);//'token on web3'
        })
    
        //查询合约状态并不需要发起事务,也不需要花费gas
    tokenContract.methods.balanceOf("0xf17f52151ebef6c7334fad080c5704d77216b732").call(null,function(error,result){
            console.log("balanceOf "+result);//387
        })
    //调用合约函数:合约的函数除了指明返回值是constant的以外,都需要发起事务,这时候就需要指定调用者,因为要花费该账户的gas.
    //查询合约状态并不需要发起事务,也不需要花费gas
    tokenContract.methods.transfer("0xf17f52151ebef6c7334fad080c5704d77216b732",387).send({from: '0x627306090abab3a6e1400e9345bc60c78a8bef57'})
    .on('transactionHash', function(hash){})
    .on('confirmation', function(confirmationNumber, receipt){})
    .on('receipt', function(receipt){
        // receipt example
        console.log(receipt); //查询这里可以得到结果
    })
    .on('error', console.error); // If a out of gas error, the second parameter is the receipt.
    
    
    //刚刚调用transfer的时候还会触发合约的事件Transfer,如果程序关注谁给谁进行了转账,那么就可以通过监听该事件.
    /*tokenContract.events.Transfer({
        fromBlock: 0,
        toBlock:'latest'
    },function(error, event){
    })
    .on('data', function(event){ //Object: 接收到新的事件时触发,参数为事件对象
        console.log(event); // same results as the optional callback above
    })
    .on('changed', function(event){//Object: 当事件从区块链上移除时触发,该事件对象将被添加额外的属性"removed: true"
        // remove event from local database
    })
    .on('error', console.error);//Object: 当发生错误时触发
    */
    /*
    { transactionHash: '0xb2aff2ac2e95c5f47ca8dc3d97104f0f65346a2c80f5b2dfaa40241276d4110a',
      transactionIndex: 0,
      blockHash: '0x405ce50ab7d02620ae2a61579976ebe5a1a466a13cc03ef857324ac66983ab91',
      blockNumber: 13,
      gasUsed: 36680,
      cumulativeGasUsed: 36680,
      contractAddress: null,
      status: true,
      logsBloom: '0x00000000000000000000000000000000000000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000008000000010000008000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000010000000001000000000010000000000000000000000000000000000000000010000000002000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
      events:
       { Transfer:
          { logIndex: 0,//Number: 事件在块中的索引位置
            transactionIndex: 0,//Number: 事件在交易中的索引位置
            transactionHash: '0xb2aff2ac2e95c5f47ca8dc3d97104f0f65346a2c80f5b2dfaa40241276d4110a',//32 Bytes - String: 事件所在交易的哈希值
            blockHash: '0x405ce50ab7d02620ae2a61579976ebe5a1a466a13cc03ef857324ac66983ab91',//32 Bytes - String: 事件所在块的哈希值,pending的块该值为 null
            blockNumber: 13,//Number: 事件所在块的编号,pending的块该值为null
            address: '0x2C2B9C9a4a25e24B174f26114e8926a9f2128FE4',//String: 事件源地址
            type: 'mined',
            id: 'log_3f0fc629',
            returnValues: [Object],//Object: 事件返回值,例如 {myVar: 1, myVar2: '0x234...'}.
            event: 'Transfer',//String: 事件名称
            signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',//String|Null: 事件签名,如果是匿名事件,则为null
            raw: [Object] } } }
    */
    
    tokenContract.methods.transferFrom('0x627306090abab3a6e1400e9345bc60c78a8bef57',"0xf17f52151ebef6c7334fad080c5704d77216b732",20).send({from: '0x627306090abab3a6e1400e9345bc60c78a8bef57'})
    .on('transactionHash', function(hash){})
    .on('confirmation', function(confirmationNumber, receipt){})
    .on('receipt', function(receipt){
        // receipt example
        console.log(receipt); //查询这里可以得到结果
    })
    .on('error', console.error);
    
    tokenContract.events.Transfer({
        //fromBlock: 0,
        toBlock:'latest'
    },function(error, event){
    })
    .on('data', function(event){
        console.log(event); // same results as the optional callback above
    })
    .on('changed', function(event){
        // remove event from local database
    })
    .on('error', console.error);
    
    /*
    Error: Returned error: VM Exception while processing transaction: revert
        at Object.ErrorResponse (C:Userswuchan4x
    ode_modulesweb3-core-helperssrcerrors.js:29:16)
        at C:Userswuchan4x
    ode_modulesweb3-core-requestmanagersrcindex.js:140:36
        at XMLHttpRequest.request.onreadystatechange (C:Userswuchan4x
    ode_modulesweb3-providers-httpsrcindex.js:91:13)
        at XMLHttpRequestEventTarget.dispatchEvent (C:Userswuchan4x
    ode_modulesxhr2-cookiesdistxml-http-request-event-target.js:34:22)
        at XMLHttpRequest._setReadyState (C:Userswuchan4x
    ode_modulesxhr2-cookiesdistxml-http-request.js:208:14)
        at XMLHttpRequest._onHttpResponseEnd (C:Userswuchan4x
    ode_modulesxhr2-cookiesdistxml-http-request.js:318:14)
        at IncomingMessage.<anonymous> (C:Userswuchan4x
    ode_modulesxhr2-cookiesdistxml-http-request.js:289:61)
        at emitNone (events.js:111:20)
        at IncomingMessage.emit (events.js:208:7)
        at endReadableNT (_stream_readable.js:1064:12)
        at _combinedTickCallback (internal/process/next_tick.js:139:11)
        at process._tickCallback (internal/process/next_tick.js:181:9)
    { transactionHash: '0xe0e37531928e2b0e5592f954dfe6ae8293f28e322d41256b2b64dd80082c93f7',
      transactionIndex: 0,
      blockHash: '0x11b3511ed5269a601af864c74e4946edb56b7ef1f9331868cedf85b7c84cb59e',
      blockNumber: 14,
      gasUsed: 36680,
      cumulativeGasUsed: 36680,
      contractAddress: null,
      status: true,
      logsBloom: '0x00000000000000000000000000000000000000000004000000000000000000000000000,
    events: { Transfer: { logIndex: 0, transactionIndex: 0, transactionHash: '0xe0e37531928e2b0e5592f954dfe6ae8293f28e322d41256b2b64dd80082c93f7', blockHash: '0x11b3511ed5269a601af864c74e4946edb56b7ef1f9331868cedf85b7c84cb59e', blockNumber: 14, address: '0x2C2B9C9a4a25e24B174f26114e8926a9f2128FE4', type: 'mined', id: 'log_0f1d28ae', returnValues: [Object], event: 'Transfer', signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', raw: [Object] } } }
    */
  • 相关阅读:
    信息安全系统设计基础实验三报告
    信息安全系统设计基础第十二周学习总结
    信息安全系统设计基础实验二报告
    信息安全系统设计基础第十一周学习总结
    家庭作业汇总
    信息安全系统设计基础实验一报告
    信息安全系统设计基础第十周学习总结
    第十章家庭作业
    20182319彭淼迪第一周学习总结
    java预备作业
  • 原文地址:https://www.cnblogs.com/eilinge/p/10032488.html
Copyright © 2011-2022 走看看