Chainsql使用相关笔记
安装
按照github上chainsql的安装过程,这里主要介绍区块网络搭建过程(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 =
ip = 127.0.0.1
admin = 127.0.0.1
protocol = http #peer端口配置,用于p2p节点发现
[port_peer]
port =
ip = 0.0.0.0
protocol = peer #websocket端口配置
[port_ws_admin_local]
port =
ip = 127.0.0.1
admin = 127.0.0.1
protocol = ws
其余的配置信息部分如下:
#对等连接的其他主机的ip,以及对于的peer端口设置
[ips_fixed]
10.11.6.116
10.11.6.117
10.11.6.118
还有要注意的是,就是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" : ,
"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等等。还有要注意插入数据时,插入数据的操作者要有足够的费用去支持插入的行为,否则即使插入不成功,也不会出现错误信息,很难发现错误。
Chainsql使用相关笔记的更多相关文章
- HTTPS证书申请相关笔记
申请免费的HTTPS证书相关资料 参考资料: HTTPS 检测 苹果ATS检测 什么是ECC证书? 渠道2: Let's Encrypt 优点 缺点 Let's Encrypt 的是否支持非80,44 ...
- JNI相关笔记 [TOC]
JNI相关笔记 目录 JNI相关笔记 1 生成native code所需要的头文件 2 JNI提供的一些函数和方法 3 局部引用,全局引用,全局弱引用. 4 异常 1 生成native code所需要 ...
- Hadoop相关笔记
一. Zookeeper( 分布式协调服务框架 ) 1. Zookeeper概述和集群搭建: (1) Zookeeper概述: Zookeeper 是一个分布式 ...
- redis相关笔记(二.集群配置及使用)
redis笔记一 redis笔记二 redis笔记三 1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置 在上述8333配 ...
- redis相关笔记(三.redis设计与实现(笔记))
redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...
- Windows API 进程相关笔记
0. 前言 最近做了一个进程信息相关的项目,整理了一下自己做项目时的笔记,分享给大家 1. 相关概念 1.1 HANDLE 概念 HANDLE(句柄)是Windows操作系统中的一个概念. 在Wind ...
- PHP相关笔记
扩展包(相关链接):https://packagist.org/: 插件postman主要应用于web开发时get.post请求时查看其响应:
- lua相关笔记
--[[ xpcall( 调用函数, 错误捕获函数 ); lua提供了xpcall来捕获异常 xpcall接受两个参数:调用函数.错误处理函数. 当错误发生时,Lua会在栈释放以前调用错误处理函数,因 ...
- C使用相关笔记
#将c文件编译成动态库 //hello.c int hello_add(int a, int b) { return a + b; } gcc -O -c -fPIC -o hello.o hello ...
随机推荐
- SQL Server 2008 R2 根据WSDL访问WebService
参考网站:WebService学习整理(一)——客户端三种调用方式整理 自我概括: WebService 通过HTTP通讯,数据以XML格式传输使两个系统进行数据交互 SOAP 是访问协议(注明访问W ...
- centos 7 命令行模式和桌面版之间的切换
CentOS7图形界面与命令行界面切换 在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 命令 切换到dos界面 输入 ...
- 201621123002《Java程序设计》第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- loadtxt()函数的糟心历程
原计划:导入一个csv文件,然后算出平均值 import numpy as np c=np.loadtxt('d:\python36\data.csv', delimiter=',', usecols ...
- 结构体struct、联合体union、枚举类型enum
1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...
- 基于ESP32的uart通讯
本文源码地址为:http://download.csdn.net/download/noticeable/9961054 ESP32上有三个UART通讯接口,设备号,从0~2,即UART0,UART1 ...
- Vmware Vtop基本使用
俗话说:"最了解孩子的莫过于亲妈",算了编不下去了,简而言之就是我们想知道虚机的详情可以通过Vmware Vtop登录宿主机进行查看,直接上干货. 有这些信息我们可以从Vt ...
- Hadoop 综合揭秘——MapReduce 基础编程(介绍 Combine、Partitioner、WritableComparable、WritableComparator 使用方式)
前言 本文主要介绍 MapReduce 的原理及开发,讲解如何利用 Combine.Partitioner.WritableComparator等组件对数据进行排序筛选聚合分组的功能.由于文章是针对开 ...
- HSmartWindowControl之安装篇 (Visual Studio 2013 & Halcon 18)
1.环境简介 Visual Studio 2013社区版 Halcon18.05 2.使用Nuget在VS工程中安装Halcon插件 搜索栏输入关键字halcon,出现两个插件,分别是halcon语言 ...
- VS工具栏没有出现可用工具的情况
(1)没有切换到资源视图,打开具体的对话框. (2)如果你在调试状态,即使打开了具体的对话框,VS工具箱还是不会出现可用的控件的.所以不要在调试状态下添加控件.