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= 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 說明提交成功。
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等等。還有要注意插入資料時,插入資料的操作者要有足夠的費用去支援插入的行為,否則即使插入不成功,也不會出現錯誤資訊,很難發現錯誤。