zoukankan      html  css  js  c++  java
  • Chainsql使用相关笔记

    安装

           按照githubchainsql安装过程这里主要介绍区块网络搭建过程(4个验证节点,其中只有一个节点[10.11.6.120]配置了数据库):

      1、根据官方文档上配置文件的案例,修改chainsql.cfg这里要注意peer,rpc,wss_admin,wss_public的端口配置,如下案例中4个节点的配置,其中一个节点的配置信息如下:

    #端口配置列表
    [server]
    port_rpc_admin_local
    port_peer
    port_ws_admin_local
    
    #http端口配置
    [port_rpc_admin_local]
    port = 5005
    ip = 127.0.0.1
    admin = 127.0.0.1
    protocol = http
    
    #peer端口配置,用于p2p节点发现
    [port_peer]
    port = 51235
    ip = 0.0.0.0
    protocol = peer
    
    #websocket端口配置
    [port_ws_admin_local]
    port = 6006
    ip = 127.0.0.1
    admin = 127.0.0.1
    protocol = ws

     其余的配置信息部分如下:

    #对等连接的其他主机的ip,以及对于的peer端口设置
    [ips_fixed]  
    10.11.6.116 51236
    10.11.6.117 51237
    10.11.6.118 51238

     还有要注意的是,就是sync_db注意在centos下要修改unix_socket的配置。以及auto_sync开启设为1。

    2、执行./chainsqld --conf="./ chainsqld-example.cfg"  validation_create生成相应的validators、validation_seed(密钥)、validation_public_key(公钥),内容如下。将这些生成的内容加入chainsql.cfg中。其他四个节点也依此配置。

    {
       "id" : 1,
       "result" : {
          "status" : "success",
          "validation_key" : "OTT SOME DEE WOVE EAT SOME QUOD KUDO NIP HOW LEER HOSE",
          "validation_private_key" : "pcvYu2QigM37t2jGar6EJSsRSdsV7H63R2Ae52WTZycZqNseT8a",
          "validation_public_key" : "n9KnRfJ3wnCF8WaGmhf3EENSfMxc3KyWLzEKXmnP5pssZkci53DV",
          "validation_seed" : "xxSm9kEKBDqrrfskWJV8wXRc6izLQ"
       }
    }

     根据文档中结构网络完成后,四个节点都启动后可以查看其他节点的运行情况,成功配置后节点的运行情况如下图所示:watch ./chainsqld peers。

    对chainsql 数据库的操作

         按照chainsql的使用说明进行操作,去github上下载node-chain-sql,在package.json的dependencies中添加“chainsql":"^0.6.20”。执行 然后执行npm install命令和npm install chainsql --save,如果第二个语句执行不成功,则将执行语句换成npm install chainsql --save --force。要注意的是使用说明中一些测死案例是在node7.6的版本的基础上去使用的, 如果版本错误,会出现一些符号错误的问题(如await等异步同步问题)。

       1、创建用户

               根据文档说明,首先要创建根用户,通过根账户(文档中说明了根账户如何创建)向新建的账户转账,才能激活新账户,创建账户的代码如下,其中owner是生成的根账户信息:  

    'use strict';
    const ChainsqlAPI = require('chainsql').ChainsqlAPI;
    const c = new ChainsqlAPI();
    
    var owner = {
            secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb",
            address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh"
    }
    //var user ={
    //  secret: 'xx26wgq6XbnTLrNgDn21dqjBMsD38',
    //  address: 'zp7mxMmrDwAGQqPeSBpT5wKaM4RpGaKWeW'
    //}
    
    let account = c.generateAddress();
    console.log(account)
    
    c.connect('ws://127.0.0.1:6006').then( ()=>{
            console.log('连接成功')
       c.as(owner);    //这里owner指一个有足够zxc的账户,第一个转账操作肯定要用根账户               
       let ret = c.pay(account.address,100000000).then((ret)=>{
       console.log(ret);
      })
    }
    );
    

      输出结果为tesSUCCESS 说明提交成功。

    如果失败可能是官方把版本 给升级类,可以这样试一试

    var amount = {
    value: 20000
    }
    res = await c.pay(user.address, amount).submit({ expect: 'validate_success' })
    console.log(res)

    2、创建数据库,以及往数据库中插入数据

        根据官方的使用说明,可以根据以下的案例,其中的user是刚才激活的新账户。

    'use strict';
    const ChainsqlAPI = require('chainsql').ChainsqlAPI;
    const r = new ChainsqlAPI();
    
    var user = {
            secret: 'xpiCV45NQ3bRxPJvmjBgkTLPwMqAC',
      address: 'zNn8qGS3spd8vyRJ88NpymiGEqKxvxgikY',
      publicKey: 'cBQFdZcmk5xsbqN8yPvk1Ay9L4PrgviGwcHxzoT7gN2XRtfqXzRR'
    }
    r.connect('ws://127.0.0.1:6006', function(err, data) {
            if (err) {
                    console.log('连接失败. ');
            return
            }
        console.log('连接成功');
        r.as(user);
            r.createTable("dc_universe", [
            {
                    'field':'id',
                    'type':'int',
                    'length':11,
                    'PK':1,
                    'NN':1,
                    'UQ':1
            },
            {
                    'field':'name',
                    'type':'varchar',
                    'length':50,
                    'default':null
            },
            {
                    'field':'age',
                    'type':'int'
            }]
            ).submit();
            r.table("dc_universe").insert({id:1, name: 'peera',age: 22},{id:2, name: 'peerb',age: 21}).submit();
             getLedger();
    });
    
    function getLedger() {
            r.getLedger({
                    ledgerVersion: 22
            }, function(err, data) {
                    console.log(err, data)
            })
    }
          
    

      一次性向数据库的表中插入多条数据,同时查看交易信息,可以根据以下的案例进行测试,这个user是另外激活的新账户,与上面不同:

    'use strict';
    const ChainsqlAPI = require('chainsql').ChainsqlAPI;
    const c = new ChainsqlAPI();
    
    
    var root = {
             secret: 'xnoPBzXtMeMyMHUVTgbuqAfg1SUTb',
      address: 'zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh'
    }
    
    var user ={
      secret: 'xx26wgq6XbnTLrNgDn21dqjBMsD38',
      address: 'zp7mxMmrDwAGQqPeSBpT5wKaM4RpGaKWeW'
    }
    c.connect('ws://127.0.0.1:6006').then( async ()=>{
            console.log('连接成功')
       c.as(root);    //这里owner指一个有足够zxc的账户,第一个转账操作肯定要用根账户               
       c.setRestrict(false);
      // var raw=[ { id: 61, name: 'peer61', age: 71 },{ id: 62, name: 'peer62', age: 72 }];
      var raw=[];
       for(var i=62;i<67;i++){
            raw.push({'id':i, 'name': 'peer'+i,'age': i+10});
        //  var raw=[{id:15+i, name: 'gqx'+i,age: 23+i}];
         //   console.log(raw);
       //    c.table("dc_universe").insert(raw).submit({expect:'db_success'});
        }
     // console.log(raw); 
      // var raw=[
    //      {'id':7, 'name': 'gqx11','age': 25},
    //      {'id':8, 'name': 'gqx22','age': 45},
      //      {'id':9, 'name': 'gqx33','age': 64}
      // ]
      // var rs=await c.table("dc_universe").insert(raw).submit({expect:"db_success"});
      // console.log(rs);
      var opt = {limit:200}
      c.getTransactions('zp7mxMmrDwAGQqPeSBpT5wKaM4RpGaKWeW',opt,callback);
    
    }
    );
    
    function callback(err,data){
            if(err){
                    console.error(err);
            }else{
                    console.log(JSON.stringify(data));
            }
    }
    

      最后,要注意一些问题,比如官方文档的说明中有些错误,比如插入数据的格式问题,还有架设网络的第二步中检查是否成功,只需要在chainsql目录中执行(centOs)watch ./chainsqld server_info等等。还有要注意插入数据时,插入数据的操作者要有足够的费用去支持插入的行为,否则即使插入不成功,也不会出现错误信息,很难发现错误。

  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/9800948.html
Copyright © 2011-2022 走看看