• web3js learning


    使用console.log(web3.version.api);来查看了web3的版本是0.20.1

    参考文档在:
    https://github.com/ethereum/wiki/wiki/JavaScript-API
    在学习的过程中你会看见很多实例是不一样的,就单单是合约的部署的地方的运行语句就十分地不同,这就是web3 0.2版本跟1.0版本的不同
    之后打算使用1.0版本的了

    1.首先,需要去声明一个web3实例,,然后去设置provider

    if (typeof web3 !== 'undefined') {
      web3 = new Web3(web3.currentProvider);
    //当你之前如果使用过mist钱包等时,你的provider可能已经设置好了,web3.currentProvider就是你目前的provider
    } else {
      // set the provider you want from Web3.providers
      web3 = new Web3(new Web3.providers.HttpProvider(“http://localhost:8545”));
    }
    //Note: HttpProvider takes 4 arguments (host, timeout, user, password)

    或者:
    if(!web3.currentProvider)//返回provider set or null
        web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));

    2.在节点中的函数都是默认可以使用回调函数的,举例:
    web3.eth.getBlock(48, function(error, result){
        if(!error)
            console.log(JSON.stringify(result));
        else
            console.error(error);
    })

    3.Batch requests(批处理请求):当你想要请求按一定的顺序一次性调用时
    var batch = web3.createBatch();
    batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
    batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
    batch.execute();


    4.web3中的的数字是基于BigNumber Library 的
    调用方法:
    var BigNumber = require('bignumber.js');
    var balance = new BigNumber(‘131242344353464564564574574567456’);

    //这样输出为:
    BigNumber { s: 1, e: 32, c: [ 13124, 23443534645645, 64574574567456 ] }


    console.log(balance.toString(10));//10进制
    //这样输出为:131242344353464564564574574567456

    balance.plus(21).toString(10); // toString(10) converts it to a number string
    // “131242344353464564564574574567477"

    a = new BigNumber(1011, 2)          // “11" 二进制
    b = new BigNumber('zz.9', 36)       // “1295.25" 36进制



    之后从web3的API参考手册开始看起:
    1.web3.version.api
    使用console.log(web3.version.api);
    //来查看了web3的版本是0.20.1


    2.web3.version.node
    (1)console.log(web3.version.node);
    (2)
    web3.version.getNode(function(error,result){
        if(!error){
            console.log(result);
        }else{
            console.log(error);
        }
    });
    //结果都是:Geth/v1.8.3-stable/darwin-amd64/go1.10.1


    3.web3.version.network
    (1)console.log(web3.version.network);
    (2)web3.version.getNetwork(function(error,result){
        if(!error){
            console.log(result);
        }else{
            console.log(error);
        }
    });
    //得到的结果是geth是设置的networkID 314590 (--networkid 314590)

    4.web3.version.ethereum查看以太坊协议的版本
    (1)console.log(web3.version.ethereum);
    (2)web3.version.getEthereum(function(error,result){
        if(!error){
            console.log(result);
        }else{
            console.log(error);
        }
    });
    //结果是0x3f(63)

    5.web3.version.whisper
    whisper实际上就是以太坊p2p网络上的一个应用,所以如果你以后要设计一个聊天室的话,就要使用这个协议了,要感受whisper可以通过启动wnode来感受
    可以构建一个完整的p2p聊天室,并且消息加密,无法被追踪;并且不需要服务器,永不停机。基于以太坊的whisper,它本来是为以太坊上的DAPPS通信构建的,有点复杂,以后再学
    http://www.cnblogs.com/baizx/p/7505096.html
    https://www.cnblogs.com/baizx/p/7898692.html

    (1)console.log(web3.version.whisper);
    (2)web3.version.getWhisper(function(error,result){
        if(!error){
            console.log(result);
        }else{
            console.log(error);
        }
    });

    //结果是:Error: The method shh_version does not exist/is not available

    6.console.log(web3.isConnected());//true
    是否链接了节点

    7.web3.setProvider(provider)
    var web3 = new Web3();
    web3.setProvider(new Web3.providers.HttpProvider(“http://localhost:8201"));//使用local3私有链

    8.web3.sha3(string [, options])
    var hash = web3.sha3("Some string to be hashed");
    console.log(hash); // "0xed973b234cf2238052c9ac87072c71bcf33abc1bbd721018e0cca448ef79b379"
    //使用使用keccak-256哈希算法计算字符串的hash值

    var hashOfHash = web3.sha3(hash, {encoding: 'hex'});
    console.log(hashOfHash); // “0x85dd39c91a64167ba20732b228251e67caed1462d4bcf036af88dc6856d0fdcc"
    //当string处的值hash是十六进制时(if the string to hash is encoded in hex),就设置{encoding: ‘hex'}

    9.web3.toHex(mixed);
    var str = web3.toHex({test: 'test'});
    console.log(str); // ‘0x7b2274657374223a2274657374227d'

    10.web3.toAscii(hexString);
    Converts a HEX string into a ASCII string.

    var str = web3.toAscii("0x657468657265756d000000000000000000000000000000000000000000000000");
    console.log(str); // “ethereum"

    11.web3.fromAscii(string [, padding]);
    Converts any ASCII string to a HEX string.
    var str = web3.fromAscii('ethereum');
    console.log(str); // "0x657468657265756d"

    var str2 = web3.fromAscii('ethereum', 32);//32bytes
    console.log(str2); // “0x657468657265756d000000000000000000000000000000000000000000000000"
    //16进制的1位就是1bytes

    12.web3.toDecimal(hexString)//把16进制的字符串转为10进制
    13.web3.fromDecimal(number|String);//反过来

    14.web3.fromWei(number|String|BigNumber, unit(String))
    var value = web3.fromWei('21000000000000', 'finney');
    console.log(value); // “0.021"
    21000000000000wei->0.021finney

    15.web3.toWei(number, unit)
    var value = web3.toWei('1', 'ether');
    console.log(value); // “1000000000000000000"
    //1ether->1000000000000000000wei

    16.web3.toBigNumber(numberOrHexString);
    17.web3.isAddress(HexString);

    18.web3.eth.defaultBlock//默认是最晚生成的那一个latest,或
    web3.eth.defaultBlock(blockNumber)
    web3.eth.defaultBlock(“earliest")//the genesis block
    web3.eth.defaultBlock(“pending”)the currently mined block (including pending transactions)

    19.
    (1)web3.eth.syncing查询同步的信息
    (2)web3.eth.getSyncing(callback(error, result){ ... })
    是否正在同步区块,是就返回同步的对象信息:
    {
    startingBlock:Number - 同步开始区块号
    currentBlock: Number - 节点当前正在同步的区块号
    highestBlock: Number - 预估要同步到的区块
    }
    否则返回false

    20.web3.eth.isSyncing 检查是否与网络同步
    同步有三种状态,true(刚开始)、正在进行时和已经结束false
    web3.eth.isSyncing(function(error, sync){
        if(!error) {
            // stop all app activity
            if(sync === true) {
               // we use `true`, so it stops all filters, but not the web3.eth.syncing polling
               web3.reset(true);
            
            // show sync info
            } else if(sync) {
               console.log(sync.currentBlock);
            
            // re-gain app operation
            } else {
                // run your app init function...
            }
        }
    });

    21.web3.reset
    用来重置web3的状态。重置除了manager以外的其它所有东西。卸载filter,停止状态轮询。
    参数:
    Boolean - 如果设置为true,将会卸载所有的filter,但会保留web3.eth.isSyncing()的状态轮询。

    22.web3.eth.hashrate查询每秒节点挖矿的哈希难度

    23.web3.eth.gasPrice
    返回当前的gas价格。这个值由最近几个块的gas价格的中值决定。
    返回的是BigNumber,用toString(10)转成10进制

    24.web3.eth.blockNumber目前区块数量

    25.web3.eth.getStorageAt????

    26.web3.eth.getBlockTransactionCount(hashStringOrBlockNumber |Number [, callback])得到某区块中的交易数量
    输入区块的number、hash值或string("earliest", "latest" or “pending”)

    27.web3.eth.getTransactionReceipt(transactionHash)
    pending的transaction是调用不出来值的,可以查看出更多的信息,可以看出交易是否成功
    "status": “0x1"为成功;"status": “0x0"为不成功
    若某个transactionHash是生成某个智能合约的,那么用这个函数就可以在contractAddress值处查看到合约的地址

    28.web3.eth.sendTransaction(transactionObject [, callback])
    transactionObject就是各种值{from:..,to:..,}
        •    from: String - 指定的发送者的地址。如果不指定,使用web3.eth.defaultAccount。
        •    to: String - (可选)交易消息的目标地址,如果是合约创建,则不填.
        •    value: Number|String|BigNumber - (可选)交易携带的货币量,以wei为单位。如果合约创建交易,则为初始的基金。
        •    gas: Number|String|BigNumber - (可选)默认是自动,交易可使用的gas,未使用的gas会退回。
        •    gasPrice: Number|String|BigNumber - (可选)默认是自动确定,交易的gas价格,默认是网络gas价格的平均值 。
        •    data: String - (可选)或者包含相关数据的字节字符串,如果是合约创建,则是初始化要用到的代码。
        •    nonce: Number - (可选)整数,使用此值,可以允许你覆盖你自己的相同nonce的,正在pending中的交易11。


    29.web3.eth.sendRawTransaction(signedTransactionData [, callback])发送一个已经签名的交易
    signedTransactionData:16进制的签名的交易数据
    这就是一个签名的步骤:
    var Tx = require('ethereumjs-tx');
    var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex')

    var rawTx = {
      nonce: '0x00',
      gasPrice: '0x09184e72a000',
      gasLimit: '0x2710',
      to: '0x0000000000000000000000000000000000000000',
      value: '0x00',
      data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'
    }

    var tx = new Tx(rawTx);
    tx.sign(privateKey);

    var serializedTx = tx.serialize();//序列化???

    //console.log(serializedTx.toString('hex'));
    //f889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f

    web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
      if (!err)
        console.log(hash); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385"
    });


    30.web3.eth.sign(address, dataToSign, [, callback])
    使用指定账户address对要发送的数据dataToSign进行签名,所以该账户是要解锁的,dataToSign可以使用进行哈希web3.sha3(“xyz")后的值

    然后会返回使用ECDSA(椭圆曲线数字签名算法)签名后得到的字符串,表示为:
    r = signature[0:64]
    s = signature[64:128]
    v = signature[128:130]
    就是在eth.getTransaction看到的那几个值


    31.web3.eth.filter
    输入的值即为输入的过滤条件,对所有的日志信息进行过滤来获得自己想要知道的信息
    (1)// filterString can be 'latest' or 'pending'
    var filter = web3.eth.filter(filterString);

    (2)var filter = web3.eth.filter(options);
        •    fromBlock: Number|string - 起始区块号(如果使用字符串latest,意思是最新的,正在打包的区块),默认值是latest。
        •    toBlock: Number|string - 终止区块号(如果使用字符串latest,意思是最新的,正在打包的区块),默认值是latest。
        •    address: String - 单个或多个地址。获取指定帐户的日志。
        •    topics: String[] - 在日志对象中必须出现的字符串数组。顺序非常重要,如果你想忽略主题,使用null。如,[null,'0x00...'],你还可以为每个主题传递一个单独的可选项数组,如[null,['option1','option1']]。

    然后上面的过滤怎么获得信息:
    (1)filter.get(callback): 返回满足过滤条件的日志。
    (2)filter.watch(callback): 监听满足条件的状态变化,满足条件时调用回调7。
    watch监听回调返回值:
        《1》String - 当使用latest参数时。返回最新的一个区块哈希值。
      《2》String - 当使用pending参数时。返回最新的pending中的交易哈希值。
      《3》Object - 当使用手工过滤选项options时,将返回下述的日志对象。
        ◦    logIndex: Number - 日志在区块中的序号。如果是pending的日志,则为null。
        ◦    transactionIndex: Number - 产生日志的交易在区块中的序号。如果是pending的日志,则为null。
        ◦    transactionHash: String,32字节 - 产生日志的交易哈希值。
        ◦    blockHash: String,32字节 - 日志所在块的哈希。如果是pending的日志,则为null。
        ◦    blockNumber: Number - 日志所在块的块号。如果是pending的日志,则为null。
        ◦    address: String,32字节 - 日志产生的合约地址。
        ◦    data: string - 包含日志一个或多个32字节的非索引的参数。
        ◦    topics: String[] - 一到四个32字节的索引的日志参数数组。(在Solidity中,第一个主题是整个事件的签名(如,Deposit(address,bytes32,uint256)),但如果使用匿名的方式定义事件的情况除外)


        filter.stopWatching(): 停止监听,清除节点中的过滤。你应该总是在监听完成后,执行这个操作。

    与其有相同的功能的就是合约中的事件event了
    当一个合同中有设置event时,如果想要查看event。举例:
    得到的是符合条件a == 5的事件myEvent的值
    // create filter
    var event = myContractInstance.myEvent({a: 5}, function (error, result) {
      if (!error)
        console.log(result);
        /*
        {
            address: '0x8718986382264244252fc4abd0339eb8d5708727',
            topics: "0x12345678901234567890123456789012", "0x0000000000000000000000000000000000000000000000000000000000000005",
            data: "0x0000000000000000000000000000000000000000000000000000000000000001",
            ...
        }
        */
    });
    或者不回调,使用监听watch或get:
    var event = myContractInstance.myEvent({a: 5});
    event.watch(function(error, result){
      if (!error)
        console.log(result);
    });
    event.stopWatching();

    条件还可以写成:
    var myEvent = myContractInstance.MyEvent({some: 'args'}, {fromBlock: 0, toBlock: 'latest'});


    还有监听所有事件的:
    var events = myContractInstance.allEvents(条件,回调);



    32.如何用语句去配置合约,以前都是说将sol代码导入到remix-ide中去,然后再在它上面进行编译compile-部署deploy,但是现在要学会怎么使用代码去将这些步骤完成了



    // Deploy the contract asynchronous(异步) from Solidity file:
    
    const fs = require("fs");
    const solc = require('solc')
    
    let source = fs.readFileSync('nameContract.sol', ‘utf8’);
    
    // Setting 1 as second paramater activates the optimiser(最优)
    let compiledContract = solc.compile(source, 1);//编译
    
    let abi = compiledContract.contracts[‘nameContract’].interface;
    
    //bytecode就是之前在remix-compile-details-web3deploy中的那串很长的数字
    let bytecode = compiledContract.contracts[‘nameContract'].bytecode;
    
    //原来这个是这么算的
    let gasEstimate = web3.eth.estimateGas({data: bytecode});
    let MyContract = web3.eth.contract(JSON.parse(abi));
    
    //若构造函数没有变量,那么这里的param1, param2是可以去掉的
    var myContractReturned = MyContract.new(param1, param2, {
       from:mySenderAddress,//一般就是eth.accounts[0]
       data:bytecode,
       gas:gasEstimate}, function(err, myContract){//这个回调回执行两次
        if(!err) {
           // NOTE: The callback will fire twice!
           // Once the contract has the transactionHash property set and once its deployed on an address.      
    //一次是合约的交易哈希属性完成
    //另一次是在某个地址上完成部署
    
           // e.g. check tx hash on the first call (transaction send)
           if(!myContract.address) {//第一次
               console.log(myContract.transactionHash) // The hash of the transaction, which deploys the contract
           
           // check address on the second call (contract deployed)
           } else {//第二次
               console.log(myContract.address) // the contract address
           }
    
           // Note that the returned "myContractReturned" === "myContract",
           // so the returned "myContractReturned" object will also get the address set.
        }
      });


    //这个是一个比较特别的input,可以一下子编译两个sol文件,而且还进行调用

    var solc = require('solc')
    var input = {
        'lib.sol': 'library L { function f() returns (uint) { return 7; } }',
        'cont.sol': 'import "lib.sol"; contract x { function g() { L.f(); } }'
    }
    var output = solc.compile({ sources: input }, 1)
    for (var contractName in output.contracts)
        console.log(contractName + ': ' + output.contracts[contractName].bytecode)

    33.返回可用的编译器
    var number = web3.eth.getCompilers();
    console.log(number); // ["lll", "solidity", “serpent"]三种编译器

    34.web3.eth.compile.solidity(sol代码)
    编译sol文件

    web3数据库部分
    35.web3.db.putString(db, key, value)想存储string到本地数据库上的时候使用
    Parameters
        1    String - The database to store to.
        2    String - The name of the store.就是相当于索引值的感觉,通过key来找到value
        3    String - The string value to store.
    Returns
    Boolean - true if successfull, otherwise false.

    36.web3.db.getString(db, key)取出

    37.web3.db.putHex(db, key, value)想存储16进制时
    38.web3.db.getHex(db, key)取出

    shh部分——whisper
    (这部分我还是不是很明白,之后用得到再看吧)

    iban部分,也不知道这个是什么


  • 相关阅读:
    Lookup Method
    ReLocated Record in Grid
    Call Form By FormString
    Send Mail
    十大已亡或正在灭亡的电脑技术
    一个程序员的内心自白摘录
    数据库中null和''具体的区别
    gridview 横向显示
    Exchange2007获取OWA邮箱容量的代码
    owa实现清空邮箱的代码
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/9507168.html
Copyright © 2020-2023  润新知