区块链

web3.js学习(二)

  1. 获取abi文件(使用solcjs编译合约代码)
    • solcjs安装

      npm install -g solc

    • solc进行编译(以下指令会生成abi文件以及bin文件,abi文件内容为合约的接口描述,bin文件内容为EVM虚拟机可识别的合约的bytecode)

      solcjs --abi --bin *.sol

    • ABI文件内容详解

      ABI文件中各参数

      • name:函数名称
      • type:方法类型,包括function,constructor,event等,默认为function
      • constant:布尔值,如果为true,指明方法不会修改合约字段的状态变量
      • payable:布尔值,标明方法是否可以接收ether
      • stateMutability:状态类型,包括pure (不读取区块链状态),view (只能查看,不会修改合约字段),nonpayable(和payable含义一样),payable(和payable含义一样)。其实保留payable和constant是为了向后兼容
      • inputs:数组,描述参数的名称和类型
        • name:参数名称
        • type:参数类型
        • indexed:对于以后希望检索数据可进行设置为true
      • outputs:和inputs一样,如果没有返回值,缺省是一个空数组
  2. web3的初步使用
    • 启动本地节点(详细可参考以太坊学习博客)

      geth --datadir ./data --networkid 15 --http console

    • 使用node命令行连接使用
      node
      > var Web3 = require('web3')
      > Web3
      > var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
      
  3. 批处理请求(batch requests)
    • 批处理请求允许将请求排序,然后一起处理。
    • 注意:批量请求不会更快。实际上,在某些情况下,一次性发出许多请求会更快,因为请求是异步处理的
    • 批处理请求主要用于确保请求的顺序吗,并串行处理。
      var batch = web3.createBatch();
      batch.add(web3.eth.getBalance.request('0x000000000000000000000000000000000000000','latest',callback));
      batch.add(web3.eth.contract(abi).at(address).balance.request(address,callback2));
      batch.execute();
      
  4. 注意:大数处理(big numbers)
    • JavaScript中国呢磨人的数字精度较小,所以web3.js会自动添加一个依赖库BigNumber,专门用于大数处理
    • 对于数值,应习惯把它转换成BigNumber对象处理
      var BigNumber = require('bignumber.js')
      var balance = new BigNumber('1243252454253646464645');
      balance.plus(21).toString(10);
      
    • BigNumber.toString(10)对小数只保留20位浮点精度。所以推荐做法是,内部使用wei来表示余额(大整数),只有在需要显示给用户看的时候才转换为ether或其它单位

     

Leave a Reply

Your email address will not be published.