• 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等等。还有要注意插入数据时,插入数据的操作者要有足够的费用去支持插入的行为,否则即使插入不成功,也不会出现错误信息,很难发现错误。

  • 相关阅读:
    [C++]C++11右值引用
    [cocos2d-x]registerScriptHandler和registerScriptTapHandler区别
    [深度探索C++对象模型]关于成员初始化列表(member initiallization list)
    [深度探索C++对象模型]memcpy和memset注意事项
    sql server isnull函数
    sql server 数据类型
    sql server SQL 服务器
    案例:按钮拖动移动
    PHP 随笔记
    laravel5 事务回滚
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/9800948.html
Copyright © 2020-2023  润新知