From c3e8ddce1c03b6cc71ad9de0bdf404e89c154a8c Mon Sep 17 00:00:00 2001 From: Mojicode Date: Tue, 14 Jul 2020 16:34:08 +0800 Subject: [PATCH 01/80] add setEncTabToSyc getSyncTabAccount getNodeAccount interface for gm --- package.json | 2 +- src/index.js | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 18719ac..0fe6ba6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.6.67", + "version": "0.6.68", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index 8d50fbb..53c001b 100644 --- a/src/index.js +++ b/src/index.js @@ -904,6 +904,26 @@ ChainsqlAPI.prototype.generatCryptData = function(smAlgType, dataSetCount, plain }); }; +ChainsqlAPI.prototype.setEncTabToSync = function(address, tableName) { + const chainsqlCon = this.connect; + return chainsqlCon.api.connection.request({ + command: "g_addEncTabToSync", + account: address, + tablename: tableName + }); +}; +ChainsqlAPI.prototype.getSyncTabAccount = function() { + const chainsqlCon = this.connect; + return chainsqlCon.api.connection.request({ + command: "g_getSyncPub" + }); +}; +ChainsqlAPI.prototype.getNodeAccount = function() { + const chainsqlCon = this.connect; + return chainsqlCon.api.connection.request({ + command: "g_getNodePub" + }); +}; ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,includeFailure){ From 062ce38823fdab49c9c7e0411bca9884c071980e Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 9 Sep 2020 18:54:24 +0800 Subject: [PATCH 02/80] 1 support gm algorithm (sm2 sm3 sm4) 2 upgrade version to 0.6.68 --- lib/crypto.js | 11 +++++- lib/util.js | 105 ++++++++++++++++++++++++++++++++++++++++++++------ package.json | 9 +++-- src/index.js | 101 ++++++++++++++++++++++++++++++++++++------------ src/submit.js | 4 +- src/table.js | 9 ++++- 6 files changed, 195 insertions(+), 44 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index 1b5e1cc..9becf93 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -122,6 +122,8 @@ function eciesDecrypt(messageHex, privateKey) { return plainMsgBuf; } + + function hmac(key, bytes) { //debug('key: ', JSON.stringify(key)); //debug('bytes: ', JSON.stringify(bytes)); @@ -211,7 +213,10 @@ function paddingPass(password,keyLen){ var symEncrypt = function(symKey, plaintext, algType = 'aes') { if(algType === "gmAlg") { return keypairs.gmAlgSymEnc(symKey, plaintext); - } else { + } else if(algType === "softGMAlg"){ + return keypairs.softGMAlgSymEnc(symKey, plaintext); + } + else { return aesEncrypt(symKey, plaintext); } }; @@ -236,7 +241,9 @@ var aesEncrypt = function(secret, plaintext) { var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { if(algType === "gmAlg") { return keypairs.gmAlgSymDec(symKey, encryptedHex); - } else { + } else if(algType === "softGMAlg"){ + return keypairs.softGMAlgSymDec(symKey, encryptedHex); + }else { return aesDecrypt(symKey, encryptedHex); } }; diff --git a/lib/util.js b/lib/util.js index 8e9b810..4ee4dd8 100644 --- a/lib/util.js +++ b/lib/util.js @@ -29,25 +29,52 @@ function getSequence(api, address) { } -function generateToken(key, secretIn) { - let symKey = secretIn; +/** + * + * @param {*} key asymmetrically encrypted public or private key + * @param {*} symKey symmetrically encrypted key + */ +function generateToken(key, symKey) { + let token; const isUserPub = symKey ? true : false; - symKey = symKey ? symKey : cryptoo.randomBytes(AESKeyLength / 2).toString('hex'); - if (key === "gmAlg" || keypairs.getCryptAlgType() === "gmAlg") { + symKey = symKey ? symKey : cryptoo.randomBytes(AESKeyLength / 2).toString('hex'); + + var algType = "ecdsa-secp256k1"; + var encrytPub = ""; + if(isUserPub){ + algType = keypairs.getAlgFromPubKey(key); + encrytPub = key; + }else{ + algType = keypairs.getAlgFromPrivateKey(key); + encrytPub = keypairs.deriveKeypair(key).publicKey; + } + + if ( algType === "gmAlg" ) { token = keypairs.gmAlgSm2Enc(key, symKey); - } else { - const userPub = isUserPub ? key : keypairs.deriveKeypair(key).publicKey; - token = crypto.eciesEncrypt(symKey, userPub); + }else if(algType === "softGMAlg") { + + if(symKey && typeof symKey === "object" && Buffer.isBuffer(symKey)){ + symKey = symKey.toString('hex'); + } + + token = keypairs.softGMAlgSm2Enc(symKey,encrytPub); + }else { + token = crypto.eciesEncrypt(symKey, encrytPub); } return token; } function decodeToken(that, token) { - let symKey; + + let symKey; + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + if(that.connect.secret === "gmAlg") { symKey = keypairs.gmAlgSm2Dec(that.connect.secret, token); - } else { + }else if( regSoftGMSeed.test(that.connect.secret)){ + symKey = keypairs.softGMAlgSm2Dec(that.connect.secret, token); + }else { let keypair = keypairs.deriveKeypair(that.connect.secret); symKey = crypto.eciesDecrypt(token, keypair.privateKey); } @@ -354,12 +381,66 @@ function decodeChainsqlAddr(addrStr){ return hexAddrStr; } + +/** + * 32 bytes hex string to base58 chainsql address + * @param {string} : hexStr + * @returns {string} : base58 address string + */ +function encodeChainsqlAccountSecret(hexStr){ + let hexArray = Buffer.from(hexStr,'hex'); + let encodeRes = addressCodec.encodeAccountPrivate(hexArray); + return encodeRes; +} + +/** + * base58 chainsql address to 32 bytes hex string + * @param {string} : base58 address string + * @returns {string} : hexStr + */ +function decodeChainsqlAccountSecret(accountSecretStr){ + let decodeRes = addressCodec.decodeAccountPrivate(accountSecretStr); + //decodeRes is decimal, format to hex + let hexAddrStr = Buffer.from(decodeRes).toString('hex'); + return hexAddrStr; +} + +/** + * 获取账户使用的加密算法 + * "gmAlg" :硬国密 + * "normal":spec256k1 + * "softGMAlg": 软国密 + * "ed25519": ed25519 + * @param {*} account + */ +function getCryptAlgTypeFromAccout(account){ + + const CryptAlgType = { + GMALG:"gmAlg", + ED25519:"ed25519", + SOFTGMALG:"softGMAlg", + NORMAL:"normal" + } + + const regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + var cryptoAlg = CryptAlgType.NORMAL; + if(account.secret === "gmAlg"){ + cryptoAlg = CryptAlgType.GMALG ; + }else if(regSoftGMSeed.test(account.secret)){ + cryptoAlg = CryptAlgType.SOFTGMALG ; + } + + + return cryptoAlg; +} + + module.exports = { - getFee: getFee, - getSequence: getSequence, convertStringToHex: convertStringToHex, convertHexToString : convertHexToString, unHexTxData: unHexTxData, + getCryptAlgTypeFromAccout:getCryptAlgTypeFromAccout, getTableSequence: getTableSequence, getUserToken: getUserToken, getTableName: getTableName, @@ -374,6 +455,8 @@ module.exports = { isMeaningless: isMeaningless, encodeChainsqlAddr: encodeChainsqlAddr, decodeChainsqlAddr: decodeChainsqlAddr, + encodeChainsqlAccountSecret: encodeChainsqlAccountSecret, + decodeChainsqlAccountSecret: decodeChainsqlAccountSecret, signData:signData, parseCb: parseCb, checkCbOpt:checkCbOpt, diff --git a/package.json b/package.json index 18719ac..e2b9037 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "chainsql", - "version": "0.6.67", + "version": "0.6.68", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "mocha" }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.6", + "chainsql-keypairs": "^0.10.11", "chainsql-lib": "^0.17.44", "co": "^4.6.0", "elliptic": "^5.1.0", @@ -21,6 +21,9 @@ "web3-utils": "1.0.0-beta.36", "ws": "^7.2.0" }, + "devDependencies": { + "mocha": "~2.3.3" + }, "repository": { "type": "git", "url": "git+https://github.com/chainsql/node-chainsql-api" diff --git a/src/index.js b/src/index.js index 8d50fbb..cbbe08f 100644 --- a/src/index.js +++ b/src/index.js @@ -20,10 +20,9 @@ const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); const opType = require('../lib/config').opType; -const getFee = util.getFee; -const getSequence = util.getSequence; const convertStringToHex = util.convertStringToHex; -const getTableSequence = util.getTableSequence; +const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; + const getUserToken = util.getUserToken; const getTxJson = util.getTxJson; const generateToken = util.generateToken; @@ -47,10 +46,10 @@ class ChainsqlAPI extends Submit { this.cache = []; this.strictMode = false; this.needVerify = 1; - if(algType === "gmAlg" || algType === "normal") { + if(algType === "gmAlg" || algType === "normal" || algType === "softGMAlg" ) { keypairs.setCryptAlgType(algType); } else { - throw new Error("Wrong algType for ChainsqlAPI object, must be 'gmAlg' or 'normal'"); + throw new Error("Wrong algType for ChainsqlAPI object, must be 'gmAlg','softGMAlg' or 'normal'"); } } @@ -112,10 +111,14 @@ ChainsqlAPI.prototype.disconnect = function (cb) { } } ChainsqlAPI.prototype.as = function (account) { + if(!account.secret || !account.address){ throw chainsqlError("c.as parameter invalid,must contain 'secret' and 'address'"); } - this.connect.as(account); + + // 根据账户信息判断底层的算法类型 + keypairs.setCryptAlgType(getCryptAlgTypeFromAccout(account)); + this.connect.as(account); } ChainsqlAPI.prototype.use = function (address) { this.connect.use(address); @@ -151,7 +154,8 @@ ChainsqlAPI.prototype.contract = function(jsonInterface, address, options) { } ChainsqlAPI.prototype.generateAddress = function () { - var account; + + var account = {secret:"",address:""}; var keypair; let ripple = new RippleAPI(); if (arguments.length == 0) { @@ -159,19 +163,23 @@ ChainsqlAPI.prototype.generateAddress = function () { keypair = keypairs.deriveKeypair(account.secret); } else { if(typeof(arguments[0]) === "object" ) { - let secretNew = keypairs.generateSeed(arguments[0]); - keypair = keypairs.deriveKeypair(secretNew); - account = { - secret: secretNew, - address: keypairs.deriveAddress(keypair.publicKey) - } - } else { - keypair = keypairs.deriveKeypair(arguments[0]); - account = { - secret: arguments[0], - address: keypairs.deriveAddress(keypair.publicKey) + let seed = keypairs.generateSeed(arguments[0]); + keypair = keypairs.deriveKeypair(seed); + + if(typeof(seed) !== "object"){ + // ed25519 + account.secret = seed; + }else{ + // softGMAlg + account.secret = util.encodeChainsqlAccountSecret(keypair.privateKey) } + + } else { + keypair = keypairs.deriveKeypair(arguments[0]) + account.secret =arguments[0] } + + account.address = keypairs.deriveAddress(keypair.publicKey); } var opt = { version: 35 @@ -305,19 +313,22 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { }; if (confidential) { - var token = generateToken(that.connect.secret); + var token = generateToken(that.connect.secret); var symKey = decodeToken(that, token); + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + if(that.connect.secret === "gmAlg") { payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").toUpperCase(); - } else { + }else if( regSoftGMSeed.test(that.connect.secret)){ + payment.raw = crypto.symEncrypt(symKey, payment.raw, "softGMAlg").toUpperCase(); + } + else { payment.raw = crypto.symEncrypt(symKey, payment.raw).toUpperCase(); - } - + } payment.token = token.toUpperCase(); } else { payment.raw = convertStringToHex(payment.raw); } - if (payment.operationRule) { payment.operationRule = convertStringToHex(payment.operationRule); } @@ -774,6 +785,7 @@ function handleGrantPayment(ChainSQL) { reject(chainsqlError('your publicKey is not validate')); } ChainSQL.payment.token = token; + console.log("token : ",token) } delete ChainSQL.payment.name; delete ChainSQL.payment.publicKey; @@ -802,6 +814,47 @@ ChainsqlAPI.prototype.eciesDecrypt = function (cipher, secret) { return crypto.eciesDecrypt(cipher,keypair.privateKey); } + + +/** + * 对称加密 + * @param {*} plainText + * @param {*} publicKey + */ +ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') { + return crypto.symEncrypt(symKey,plaintext,algType); +} + +/** + * 对称解密 + * @param {*} cipher + * @param {*} privateKey + */ +ChainsqlAPI.prototype.symDecrypt = function (symKey, encryptedHex, algType = 'aes') { + + return crypto.symDecrypt(symKey, encryptedHex, algType); +} + +/** + * 非对称加密 + * @param {*} plainText + * @param {*} publicKey + */ +ChainsqlAPI.prototype.asymEncrypt = function (plainText, publicKey) { + return keypairs.asymEncrypt(plainText,publicKey); +} + +/** + * 非对称解密 + * @param {*} cipher + * @param {*} privateKey + */ +ChainsqlAPI.prototype.asymDecrypt = function (cipher, privateKey) { + + return keypairs.asymDecrypt(cipher,privateKey); +} + + ChainsqlAPI.prototype.getAccountTables = function(address, bGetDetailInfo=false){ var connection = this.api ? this.api.connection : this.connect.api.connection; return new Promise(function(resolve, reject){ @@ -927,7 +980,7 @@ ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,include ChainsqlAPI.prototype.signFromString = function (messageHex, secret) { - var keypair = keypairs.deriveKeypair(secret); + var keypair = keypairs.deriveKeypair(secret); var signatue = keypairs.sign(messageHex,keypair.privateKey); return signatue; }; diff --git a/src/submit.js b/src/submit.js index c88dd85..46cc813 100644 --- a/src/submit.js +++ b/src/submit.js @@ -20,9 +20,7 @@ Submit.prototype.submit = function (expectOpt) { try { self.prepareJson().then(function (prepared) { self.txJSON = prepared.txJSON; - - self.setCert(); - + self.setCert(); let signedRet = self.signTx(); self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); }).catch(function (error) { diff --git a/src/table.js b/src/table.js index 4cac68c..089152e 100644 --- a/src/table.js +++ b/src/table.js @@ -412,7 +412,14 @@ function prepareTable(ChainSQL, payment, resolve, reject) { token = token[ChainSQL.connect.scope + ChainSQL.tab]; if (token && token != '') { var secret = decodeToken(ChainSQL, token); - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(ChainSQL.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ + algType = "softGMAlg"; + } payment.raw = crypto.symEncrypt(secret, payment.raw, algType).toUpperCase(); } else { payment.raw = convertStringToHex(payment.raw); From 5557d0ddbece9103472a9dcf1e736e605e7f5e01 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 9 Sep 2020 18:56:00 +0800 Subject: [PATCH 03/80] upgrade version to 0.6.69 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e2b9037..aea49ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.6.68", + "version": "0.6.69", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 0700b88d9a94fa74955af0af5ff3e6cc73165a33 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 16 Sep 2020 15:48:07 +0800 Subject: [PATCH 04/80] Table transaction adds a field TxsHashFillField --- src/table.js | 34 ++++++++++++++++++++++++++-------- src/tablePayment.js | 3 ++- test/test.js | 22 ++++++++++------------ 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/table.js b/src/table.js index 089152e..241c5b8 100644 --- a/src/table.js +++ b/src/table.js @@ -19,7 +19,8 @@ class Table extends Submit { this.exec = ''; this.field = null; this.connect = ChainsqlAPI.connect; - this.cache = []; + this.cache = []; + this.txsHashFillField = null; } submit (cb) { @@ -59,13 +60,18 @@ class Table extends Submit { } } -Table.prototype.insert = function(raw, field) { +Table.prototype.insert = function(raw, autoField ,txsHashFillField) { if (!this.tab) throw chainsqlError('you must appoint the table name'); if (this.exec !== '' && this.exec !== 'r_insert') throw chainsqlError('Object can not hava function insert'); var that = this; - if (field) { - this.field = field; + if (autoField) { + this.field = autoField; + } + + if (txsHashFillField) { + this.txsHashFillField = txsHashFillField; } + if (Object.prototype.toString.call(raw) === '[object Array]') { raw.forEach(function(item) { that.query.push(item); @@ -90,7 +96,7 @@ Table.prototype.insert = function(raw, field) { } } -Table.prototype.update = function(raw,field) { +Table.prototype.update = function(raw,field,txsHashFillField) { if (!this.tab) throw chainsqlError('you must appoint the table name'); if (this.exec !== 'r_get') throw chainsqlError('Object can not hava function update'); this.query.unshift(raw); @@ -99,6 +105,10 @@ Table.prototype.update = function(raw,field) { this.field = field; } + if (txsHashFillField) { + this.txsHashFillField = txsHashFillField; + } + this.exec = 'r_update'; if (this.transaction) { this.cache.push({ @@ -397,10 +407,18 @@ Table.prototype.prepareJson = function() { }], tsType: 'SQLStatement' }; - if ( (that.exec == 'r_insert' || that.exec == 'r_update') && that.field) { - payment.autoFillField = convertStringToHex(that.field); - } + if ( (that.exec == 'r_insert' || that.exec == 'r_update') ) { + + if(that.field){ + payment.autoFillField = convertStringToHex(that.field); + } + if ( that.txsHashFillField) { + payment.txsHashFillField = convertStringToHex(that.txsHashFillField); + } + + } + return new Promise(function (resolve, reject) { prepareTable(that, payment, resolve, reject); }); diff --git a/src/tablePayment.js b/src/tablePayment.js index 39d7780..c938ef9 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -61,7 +61,8 @@ function createPaymentTransaction(paymentArgument) { AutoFillField:payment.autoFillField, Token:payment.token, StrictMode: payment.strictMode, - OperationRule: payment.operationRule + OperationRule: payment.operationRule, + TxsHashFillField:payment.txsHashFillField, } return txJSON; } diff --git a/test/test.js b/test/test.js index 42f054c..6ae5a20 100644 --- a/test/test.js +++ b/test/test.js @@ -25,7 +25,7 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "fasefa"; +var sTableName = "fasefa25"; var sTableName2 = "b1"; var sReName = "boy1234"; var sTableName3 = "hijack12"; @@ -34,7 +34,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:6005'); + await c.connect('ws://127.0.0.1:7017'); //await c.connect('ws://101.201.40.124:5006'); console.log('连接成功'); @@ -143,9 +143,9 @@ async function testChainsql(){ // await testCreateTable(); // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); - // await testInsert(); - // await testUpdate(); + //await testCreateTable1(); + //await testInsert(); + await testUpdate(); // await testDelete(); // await testRename(); // await testGet(); @@ -204,8 +204,8 @@ var testCreateTable = async function() { var testCreateTable1 = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, - {'field':'name','type':'varchar','length':50,'default':null}, - {'field':'age','type':'int'} + {'field':'name','type':'text','default':''}, + {'field':'txnField','type':'text'} ]; var option = { confidential: false @@ -222,12 +222,10 @@ var testCreateTable1 = async function() { //重复插入的情况下报异常 var testInsert = async function() { var raw = [ - {'id':1,'age': 333,'name':'hello'}, - {'id':2,'age': 444,'name':'sss'}, - {'id':3,'age': 555,'name':'rrr'} + {'id':7} ]; try { - var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + var rs = await c.table(sTableName).insert(raw,"name","txnField").submit({expect:'db_success'}); console.log("testInsert",rs); } catch (error) { console.error(error); @@ -236,7 +234,7 @@ var testInsert = async function() { var testUpdate = async function(){ try { - var rs = await c.table(sTableName).get({'id': 2}).update({'age':200}).submit({expect:'db_success'}); + var rs = await c.table(sTableName).get({'id': 7}).update({'name':"26"},"name","txnField").submit({expect:'db_success'}); console.log("testUpdate",rs); } catch (error) { console.error(error); From 165dc6bcc0770f96d0a4f1b8b1cac0d6b2d8a5af Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 22 Sep 2020 18:37:26 +0800 Subject: [PATCH 05/80] upgrade version to 0.70.0 --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index aea49ef..082f50e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.6.69", + "version": "0.7.0", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -22,7 +22,8 @@ "ws": "^7.2.0" }, "devDependencies": { - "mocha": "~2.3.3" + "mocha": "~2.3.3", + "chai": "^4.2.0" }, "repository": { "type": "git", From a3016242c62fa8cedd34a333a70836a0a5035c6e Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 30 Sep 2020 10:02:25 +0800 Subject: [PATCH 06/80] 1 fix t_sqlTxs bug 2 submit test version chainsql-test^0.6.70 --- package.json | 4 ++-- src/index.js | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index aea49ef..2f14cda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql", - "version": "0.6.69", + "name": "chainsql-test", + "version": "0.6.70", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index cbbe08f..0c90e4f 100644 --- a/src/index.js +++ b/src/index.js @@ -681,7 +681,14 @@ function handleCommit(ChainSQL, object, resolve, reject) { var secret = decodeToken(ChainSQL, token); if (cache[i].Raw) { if (cache[i].OpType != opType.t_grant) { - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + let algType = "aes"; + if(ChainSQL.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ + algType = "softGMAlg"; + } cache[i].Raw = crypto.symEncrypt(secret, JSON.stringify(cache[i].Raw), algType).toUpperCase(); } else { cache[i].Raw = convertStringToHex(JSON.stringify(cache[i].Raw)); From 29fa3fcb895ded7e3c8678af18e680869cbff1a1 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 12 Oct 2020 14:12:50 +0800 Subject: [PATCH 07/80] create a new branch feature/chainsql-test --- lib/crypto.js | 2 +- lib/util.js | 2 +- package.json | 6 +- solidity-example/solidity-TableTxs.sol | 9 +- src/index.js | 25 ++++- src/smartContract.js | 2 +- test/server.js | 2 +- test/test.js | 128 ++++++++++++++++++----- test/testContractTableTxs.js | 94 +++++++++++------ test/testTable.js | 138 ++++++++++++++++++++----- 10 files changed, 312 insertions(+), 96 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index 9becf93..30909d7 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -1,6 +1,6 @@ "use strict"; // requires -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const hashjs = require('hash.js'); const elliptic = require('elliptic'); diff --git a/lib/util.js b/lib/util.js index 4ee4dd8..abb0861 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); const common = require('chainsql-lib').ChainsqlLibCommon; -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const cryptoo = require('crypto'); const crypto = require('./crypto'); const opType = require('./config').opType; diff --git a/package.json b/package.json index 082f50e..10a3503 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql", - "version": "0.7.0", + "name": "chainsql-test", + "version": "0.6.71", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -8,7 +8,7 @@ }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.11", + "chainsql-keypairs-test": "^0.10.16", "chainsql-lib": "^0.17.44", "co": "^4.6.0", "elliptic": "^5.1.0", diff --git a/solidity-example/solidity-TableTxs.sol b/solidity-example/solidity-TableTxs.sol index 506aebb..2f1e8e5 100644 --- a/solidity-example/solidity-TableTxs.sol +++ b/solidity-example/solidity-TableTxs.sol @@ -85,12 +85,11 @@ contract DBTest { return msg.sender.grant(toWho, tableName, raw); } - function sqlTransaction(string tableName) public{ + function sqlTransaction(address owner,string tableName) public{ db.beginTrans(); - msg.sender.create(tableName, "[{\"field\":\"id\", \"type\" : \"int\", \"length\" : 11, \"PK\" : 1, \"NN\" : 1, \"UQ\" : 1}, { \"field\":\"account\", \"type\" : \"varchar\" }, { \"field\":\"age\", \"type\" : \"int\" }]"); - msg.sender.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); - msg.sender.deletex(tableName, "{\"id\":1}"); - msg.sender.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); + msg.sender.insert(owner,tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); + msg.sender.deletex(owner,tableName, "{\"id\":1}"); + msg.sender.update(owner,tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); db.commit(); } diff --git a/src/index.js b/src/index.js index cbbe08f..107cdd0 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ 'use strict' const crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const EventManager = require('./eventManager') const _ = require('lodash'); @@ -19,6 +19,7 @@ const Connection = require('./connect'); const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); +const co = require('co'); const opType = require('../lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; @@ -316,6 +317,10 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { var token = generateToken(that.connect.secret); var symKey = decodeToken(that, token); var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + + // 原始的大小 + console.log("pre :",payment.raw); if(that.connect.secret === "gmAlg") { payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").toUpperCase(); @@ -325,7 +330,13 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { else { payment.raw = crypto.symEncrypt(symKey, payment.raw).toUpperCase(); } + + // + console.log("after :",payment.raw); + payment.token = token.toUpperCase(); + + console.log("token :",payment.token); } else { payment.raw = convertStringToHex(payment.raw); } @@ -681,7 +692,17 @@ function handleCommit(ChainSQL, object, resolve, reject) { var secret = decodeToken(ChainSQL, token); if (cache[i].Raw) { if (cache[i].OpType != opType.t_grant) { - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + //const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + + + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(ChainSQL.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ + algType = "softGMAlg"; + } cache[i].Raw = crypto.symEncrypt(secret, JSON.stringify(cache[i].Raw), algType).toUpperCase(); } else { cache[i].Raw = convertStringToHex(JSON.stringify(cache[i].Raw)); diff --git a/src/smartContract.js b/src/smartContract.js index 5ffe469..862acaa 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -4,7 +4,7 @@ var util = require('../lib/util'); const _ = require('lodash'); var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); var abi = require('web3-eth-abi'); diff --git a/test/server.js b/test/server.js index f4b3bbc..96f1f62 100644 --- a/test/server.js +++ b/test/server.js @@ -8,7 +8,7 @@ var path = require('path'); var basePath = path.join(require.resolve('chainsql-lib'), '../common'); var common = require(basePath); var crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); co(function*() { try { diff --git a/test/test.js b/test/test.js index 6ae5a20..504423f 100644 --- a/test/test.js +++ b/test/test.js @@ -25,34 +25,83 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "fasefa25"; +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", + publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' +} + + +// zM8SaWYBPSiRd7x8KpcrwLL7UJU8YDG8Wf + +// pwhRt7Cw561HobWUtsCn3heg3UqCCjNSk6vZXLk1LjwmbtzVy1r + +var smTest = { + secret: 'pwhRt7Cw561HobWUtsCn3heg3UqCCjNSk6vZXLk1LjwmbtzVy1r', + address: 'zM8SaWYBPSiRd7x8KpcrwLL7UJU8YDG8Wf', + publicKey: 'pYvPU2kQCUgJZzMYX3RFFGvhyVHeSb3UeLGLAjTtTn7jPTR2hJbHvDi7ScDXMyuc7aFueaNMohSxJnoa9KGKgTwxaqgWWEvc' +} + +var smUser7 ={ + secret:"pwRdHmA4cSUKKtFyo4m2vhiiz5g6ym58Noo9dTsUU97mARNjevj", + address: "zMXMtS2C36J1p3uhTxRFWV8pEhHa8AMMSL", + publicKey: "pYvXDbsUUr5dpumrojYApjG8nLfFMXhu3aDvxq5oxEa4ZSeyjrMzisdPsYjfxyg9eN3ZJsNjtNENbzXPL89st39oiSp5yucU" +} + +// var smTest = { +// secret: 'pw2E1su2nmj5qnFJoq6WfCQLjGLWuKVuAFR49vrkSGr16DQwHKu', +// address: 'zGPoujotavee98sssyKCVGig3mVJB42sZJ', +// publicKey: 'pYvhKdDqBnGzXc4Ff1wutzc7z3z2UcN4aPxMPN1pW66…hkDLmoHFRkGmBaz2fzdjZsXW85FCgHFVw3VqeGGVfQt' +// } + +var sTableName = "jmtable5"; var sTableName2 = "b1"; -var sReName = "boy1234"; +var sReName = "jmtable2"; var sTableName3 = "hijack12"; +//var wsAddr = "ws://192.168.191.208:5215"; +//var wsAddr = "ws://192.168.191.223:6006"; +var wsAddr = "ws://192.168.29.113:6006" main(); - async function main(){ + try { - await c.connect('ws://127.0.0.1:7017'); - //await c.connect('ws://101.201.40.124:5006'); + + // let accountInfo = c.generateAddress({algorithm:"softGMAlg",secret:smUser7.secret}); + // console.log(JSON.stringify(accountInfo)) + // accountInfo = c.generateAddress({algorithm:"softGMAlg"}); + // console.log(accountInfo) + // accountInfo = c.generateAddress({algorithm:"softGMAlg"}); + // console.log(accountInfo) + + await c.connect(wsAddr); + //await c.connect('ws://127.0.0.1:7017'); console.log('连接成功'); - c.as(owner); + c.as(smRoot); - // // 读取证书文件 - // var data = fs.readFileSync('D:\\git\\ca\\test\\userCert.cert'); + // 读取证书文件 + // var data = fs.readFileSync('C:\\ca\\userCert.cert'); // c.useCert(data.toString()); + // let accountInfo = c.generateAddress({algorithm:"softGMAlg"}); + // console.log(accountInfo) + // c.setRestrict(true); //激活user账户 - // await activateAccount(user.address); + await activateAccount(smUser.address); //await testSubscribe(); // await testRippleAPI(); // await testAccount(); - await testChainsql(); + //await testChainsql(); //await c.disconnect(); console.log('运行结束'); @@ -140,12 +189,12 @@ async function testAccount(){ } async function testChainsql(){ - // await testCreateTable(); + //await testCreateTable(); // // //创建另一张表,用来测试rename,drop - //await testCreateTable1(); - //await testInsert(); - await testUpdate(); +// await testCreateTable1(); + await testInsert(); +// await testUpdate(); // await testDelete(); // await testRename(); // await testGet(); @@ -194,7 +243,7 @@ var testCreateTable = async function() { {'field':'age','type':'int'} ] var option = { - confidential: false + confidential: true } // 创建表 let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); @@ -205,7 +254,29 @@ var testCreateTable1 = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, {'field':'name','type':'text','default':''}, - {'field':'txnField','type':'text'} + {'field':'txnField','type':'text'}, + {"field":"age1","type":"int"}, + {"field":"age2","type":"int"}, + {"field":"age3","type":"int"}, + {"field":"age4","type":"int"}, + {"field":"age5","type":"int"}, + {"field":"age6","type":"int"}, + {"field":"age7","type":"int"}, + {"field":"age8","type":"int"}, + {"field":"age9","type":"int"}, + {"field":"age10","type":"int"}, + {"field":"age11","type":"int"}, + {"field":"age12","type":"int"}, + {"field":"age13","type":"int"}, + {"field":"age14","type":"int"}, + {"field":"age15","type":"int"}, + {"field":"age16","type":"int"}, + {"field":"age17","type":"int"}, + {"field":"age18","type":"int"}, + {"field":"age19","type":"int"}, + {"field":"age20","type":"int"}, + {"field":"age21","type":"int"}, + {"field":"age22","type":"int"} ]; var option = { confidential: false @@ -219,14 +290,20 @@ var testCreateTable1 = async function() { } }; +// {'age': 333,'name':'hello'}, +// {'age': 444,'name':'sss'}, +// {'age': 555,'name':'rrr'} + //重复插入的情况下报异常 var testInsert = async function() { var raw = [ - {'id':7} + {'id':7}, + {'id':8}, + {'id':9} ]; try { - var rs = await c.table(sTableName).insert(raw,"name","txnField").submit({expect:'db_success'}); - console.log("testInsert",rs); + var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + console.log("testInsert ",rs); } catch (error) { console.error(error); } @@ -234,7 +311,7 @@ var testInsert = async function() { var testUpdate = async function(){ try { - var rs = await c.table(sTableName).get({'id': 7}).update({'name':"26"},"name","txnField").submit({expect:'db_success'}); + var rs = await c.table(sTableName).get({'id': 7}).update({'name':"28"},"name","txnField").submit({expect:'db_success'}); console.log("testUpdate",rs); } catch (error) { console.error(error); @@ -290,8 +367,8 @@ var testDrop = async function(){ //重复授权可能出异常,测一下 var testGrant = async function(){ try { - var raw = {select:true, insert:false, update:false, delete:true}; - var rs = await c.grant(sTableName, user.address, raw, user.publicKey).submit({expect:'db_success'}); + var raw = {select:true, insert:true, update:true, delete:true}; + var rs = await c.grant(sTableName, smUser7.address, raw, smUser7.publicKey).submit({expect:'validate_success'}); console.log("testGrant",rs); } catch (error) { console.error(error); @@ -314,10 +391,11 @@ var insertAfterGrant = async function(){ var testTxs = async function(){ try { + c.as(smRoot) c.beginTran(); - c.grant(sTableName,user.address,{insert:true,update:true},user.publicKey) - c.table(sTableName).insert({ 'age': 333, 'name': 'hello' }); - c.table(sTableName).get({ 'age': 333 }).update({ 'name': 'world' }); + //c.grant(sTableName,user.address,{insert:true,update:true},user.publicKey) + c.table(sTableName).insert({ 'id':1245, 'name': '333'}); + // c.table(sTableName).get({ 'age': 333 }).update({ 'name': 'world' }); var rs = await c.commit({expect: 'db_success'}); console.log("testTxs",rs); } catch (error) { diff --git a/test/testContractTableTxs.js b/test/testContractTableTxs.js index 6c80ef7..9fd3b82 100644 --- a/test/testContractTableTxs.js +++ b/test/testContractTableTxs.js @@ -16,6 +16,19 @@ var user = { address: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv", secret: "xnJn5J5uYz3qnYX72jXkAPVB3ZsER" } + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + + var userOperation = user; var user1 = { @@ -26,7 +39,7 @@ var user1 = { var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; -var sTableName = "sTable"; +var sTableName = "n3"; var sTableNameNew = "table_new" var rawTable = "[ \ { \"field\": \"id\", \"type\": \"int\" }, \ @@ -50,8 +63,10 @@ var rawGet = "{\"id\": 2}" var myContract; -const abi = '[{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"create","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"drop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"toWho","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"grant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"},{"name":"field","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'; -const deployBytecode = '0x608060405234801561001057600080fd5b50611f58806100206000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff8146100ca578063198e2b8a1461022957806331445f171461038857806331c3e4561461059e5780635310b551146107945780636c02d6921461085c578063746ecd69146109db5780638b0a4ee114610b5a57806391025cb114610cd957806399489c2114610da15780639c7c722b14610f99578063cf22eb59146110f8578063ea0f5b7a14611387575b600080fd5b3480156100d657600080fd5b50610227600480360360408110156100ed57600080fd5b810190808035906020019064010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460018302840111640100000000831117156101d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506114e6565b005b34801561023557600080fd5b506103866004803603604081101561024c57600080fd5b810190808035906020019064010000000081111561026957600080fd5b82018360208201111561027b57600080fd5b8035906020019184600183028401116401000000008311171561029d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561030057600080fd5b82018360208201111561031257600080fd5b8035906020019184600183028401116401000000008311171561033457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061152d565b005b34801561039457600080fd5b5061059c600480360360808110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103e857600080fd5b8201836020820111156103fa57600080fd5b8035906020019184600183028401116401000000008311171561041c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460018302840111640100000000831117156104b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561051657600080fd5b82018360208201111561052857600080fd5b8035906020019184600183028401116401000000008311171561054a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611574565b005b3480156105aa57600080fd5b50610792600480360360608110156105c157600080fd5b81019080803590602001906401000000008111156105de57600080fd5b8201836020820111156105f057600080fd5b8035906020019184600183028401116401000000008311171561061257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561067557600080fd5b82018360208201111561068757600080fd5b803590602001918460018302840111640100000000831117156106a957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561070c57600080fd5b82018360208201111561071e57600080fd5b8035906020019184600183028401116401000000008311171561074057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506115c8565b005b3480156107a057600080fd5b5061085a600480360360208110156107b757600080fd5b81019080803590602001906401000000008111156107d457600080fd5b8201836020820111156107e657600080fd5b8035906020019184600183028401116401000000008311171561080857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061161b565b005b34801561086857600080fd5b506109d96004803603606081101561087f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111640100000000831117156108f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561095357600080fd5b82018360208201111561096557600080fd5b8035906020019184600183028401116401000000008311171561098757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611656565b005b3480156109e757600080fd5b50610b58600480360360608110156109fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b80359060200191846001830284011164010000000083111715610a6f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ad257600080fd5b820183602082011115610ae457600080fd5b80359060200191846001830284011164010000000083111715610b0657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061169e565b005b348015610b6657600080fd5b50610cd760048036036060811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610bba57600080fd5b820183602082011115610bcc57600080fd5b80359060200191846001830284011164010000000083111715610bee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c5157600080fd5b820183602082011115610c6357600080fd5b80359060200191846001830284011164010000000083111715610c8557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116e6565b005b348015610ce557600080fd5b50610d9f60048036036020811015610cfc57600080fd5b8101908080359060200190640100000000811115610d1957600080fd5b820183602082011115610d2b57600080fd5b80359060200191846001830284011164010000000083111715610d4d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611731565b005b348015610dad57600080fd5b50610f1e60048036036060811015610dc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e0157600080fd5b820183602082011115610e1357600080fd5b80359060200191846001830284011164010000000083111715610e3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e9857600080fd5b820183602082011115610eaa57600080fd5b80359060200191846001830284011164010000000083111715610ecc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061195e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f5e578082015181840152602081019050610f43565b50505050905090810190601f168015610f8b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fa557600080fd5b506110f660048036036040811015610fbc57600080fd5b8101908080359060200190640100000000811115610fd957600080fd5b820183602082011115610feb57600080fd5b8035906020019184600183028401116401000000008311171561100d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561107057600080fd5b82018360208201111561108257600080fd5b803590602001918460018302840111640100000000831117156110a457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b48565b005b34801561110457600080fd5b5061130c6004803603608081101561111b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561115857600080fd5b82018360208201111561116a57600080fd5b8035906020019184600183028401116401000000008311171561118c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156111ef57600080fd5b82018360208201111561120157600080fd5b8035906020019184600183028401116401000000008311171561122357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561128657600080fd5b82018360208201111561129857600080fd5b803590602001918460018302840111640100000000831117156112ba57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b8f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561134c578082015181840152602081019050611331565b50505050905090810190601f1680156113795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561139357600080fd5b506114e4600480360360408110156113aa57600080fd5b81019080803590602001906401000000008111156113c757600080fd5b8201836020820111156113d957600080fd5b803590602001918460018302840111640100000000831117156113fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561145e57600080fd5b82018360208201111561147057600080fd5b8035906020019184600183028401116401000000008311171561149257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d12565b005b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611528573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c094505050505015801561156f573d6000803e3d6000d15b505050565b8373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc596505050505050501580156115c1573d6000803e3d6000d15b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc59650505050505050158015611615573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1681805190602001818184c192505050158015611652573d6000803e3d6000d15b5050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611698573d6000803e3d6000d15b50505050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c49450505050501580156116e0573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1683838051906020018480519060200181818585888ac79550505050505015801561172b573d6000803e3d6000d15b50505050565bc83373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681526020017f6a566173795073463459486a323234222c20226964223a31317d2c207b22616381526020017f636f756e74223a227a55343279445733667a466a47576f736465566a5661737981526020017f5073463459486a323234222c202020226964223a31327d5d00000000000000008152506078019050604051809103908181016040528181858588c394505050505015801561181a573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226964223a317d0000000000000000000000000000000000000000000000008152506008019050604051809103908181016040528181858588c4945050505050158015611891573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226163636f756e74223a2269643d3d32227d0000000000000000000000000081525060130190506040518091039081810160405260405180807f7b226964223a20327d00000000000000000000000000000000000000000000008152506009019050604051809103908181016040528181858589898cc59650505050505050158015611947573d6000803e3d6000d15b50c915801561195a573d6000803e3d6000d15b5050565b606060008473ffffffffffffffffffffffffffffffffffffffff1684805190602001858051906020018181858588c6945050505050905060008114151515611a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050600082cb9050606060008090505b83811015611b395760008090505b83811015611aea576060868383808284d0602001806040519081016040528181848688cd9450505050509050611a8c8482611d59565b93506001850382141515611adc57611ad9846040805190810160405280600281526020017f2c20000000000000000000000000000000000000000000000000000000000000815250611d59565b93505b508080600101915050611a56565b50611b2a826040805190810160405280600281526020017f3b0a000000000000000000000000000000000000000000000000000000000000815250611d59565b91508080600101915050611a48565b50809450505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c2945050505050158015611b8a573d6000803e3d6000d15b505050565b606060008573ffffffffffffffffffffffffffffffffffffffff1685805190602001868051906020018181858588c6945050505050905060008114151515611c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050606060008090505b82811015611d0357606084828880519060200181818486cf6020018060405190810160405281818585888acc955050505050509050611cb28382611d59565b9250611cf3836040805190810160405280600181526020017f3b00000000000000000000000000000000000000000000000000000000000000815250611d59565b9250508080600101915050611c73565b50809350505050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c4945050505050158015611d54573d6000803e3d6000d15b505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611d9d5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8551811015611e63578581815181101515611dc757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e2657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611db0565b5060008090505b8451811015611f1d578481815181101515611e8157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611ee057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611e6a565b508195505050505050929150505600a165627a7a723058200b0dbd97123f4e63cdd05fb7f53186505f6425bd763465b61c74dc7f7a282eeb0029'; + +const abi = '[{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"create","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"drop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"toWho","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"grant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"},{"name":"field","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]' +const deployBytecode = '0x608060405234801561001057600080fd5b50611f79806100206000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff8146100ca5780630a3cb6e414610229578063198e2b8a1461031157806331445f171461047057806331c3e456146106865780635310b5511461087c5780636c02d69214610944578063746ecd6914610ac35780638b0a4ee114610c4257806399489c2114610dc15780639c7c722b14610fb9578063cf22eb5914611118578063ea0f5b7a146113a7575b600080fd5b3480156100d657600080fd5b50610227600480360360408110156100ed57600080fd5b810190808035906020019064010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460018302840111640100000000831117156101d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611506565b005b34801561023557600080fd5b5061030f6004803603604081101561024c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561028957600080fd5b82018360208201111561029b57600080fd5b803590602001918460018302840111640100000000831117156102bd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061154d565b005b34801561031d57600080fd5b5061046e6004803603604081101561033457600080fd5b810190808035906020019064010000000081111561035157600080fd5b82018360208201111561036357600080fd5b8035906020019184600183028401116401000000008311171561038557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103e857600080fd5b8201836020820111156103fa57600080fd5b8035906020019184600183028401116401000000008311171561041c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061177b565b005b34801561047c57600080fd5b506106846004803603608081101561049357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156104d057600080fd5b8201836020820111156104e257600080fd5b8035906020019184600183028401116401000000008311171561050457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561056757600080fd5b82018360208201111561057957600080fd5b8035906020019184600183028401116401000000008311171561059b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156105fe57600080fd5b82018360208201111561061057600080fd5b8035906020019184600183028401116401000000008311171561063257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506117c2565b005b34801561069257600080fd5b5061087a600480360360608110156106a957600080fd5b81019080803590602001906401000000008111156106c657600080fd5b8201836020820111156106d857600080fd5b803590602001918460018302840111640100000000831117156106fa57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561075d57600080fd5b82018360208201111561076f57600080fd5b8035906020019184600183028401116401000000008311171561079157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107f457600080fd5b82018360208201111561080657600080fd5b8035906020019184600183028401116401000000008311171561082857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611816565b005b34801561088857600080fd5b506109426004803603602081101561089f57600080fd5b81019080803590602001906401000000008111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111640100000000831117156108f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611869565b005b34801561095057600080fd5b50610ac16004803603606081101561096757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460018302840111640100000000831117156109d857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b80359060200191846001830284011164010000000083111715610a6f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118a4565b005b348015610acf57600080fd5b50610c4060048036036060811015610ae657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610b2357600080fd5b820183602082011115610b3557600080fd5b80359060200191846001830284011164010000000083111715610b5757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610bba57600080fd5b820183602082011115610bcc57600080fd5b80359060200191846001830284011164010000000083111715610bee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118ec565b005b348015610c4e57600080fd5b50610dbf60048036036060811015610c6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ca257600080fd5b820183602082011115610cb457600080fd5b80359060200191846001830284011164010000000083111715610cd657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610d3957600080fd5b820183602082011115610d4b57600080fd5b80359060200191846001830284011164010000000083111715610d6d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611934565b005b348015610dcd57600080fd5b50610f3e60048036036060811015610de457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e2157600080fd5b820183602082011115610e3357600080fd5b80359060200191846001830284011164010000000083111715610e5557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610eb857600080fd5b820183602082011115610eca57600080fd5b80359060200191846001830284011164010000000083111715610eec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061197f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f7e578082015181840152602081019050610f63565b50505050905090810190601f168015610fab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fc557600080fd5b5061111660048036036040811015610fdc57600080fd5b8101908080359060200190640100000000811115610ff957600080fd5b82018360208201111561100b57600080fd5b8035906020019184600183028401116401000000008311171561102d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561109057600080fd5b8201836020820111156110a257600080fd5b803590602001918460018302840111640100000000831117156110c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b69565b005b34801561112457600080fd5b5061132c6004803603608081101561113b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561117857600080fd5b82018360208201111561118a57600080fd5b803590602001918460018302840111640100000000831117156111ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561120f57600080fd5b82018360208201111561122157600080fd5b8035906020019184600183028401116401000000008311171561124357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156112a657600080fd5b8201836020820111156112b857600080fd5b803590602001918460018302840111640100000000831117156112da57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611bb0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561136c578082015181840152602081019050611351565b50505050905090810190601f1680156113995780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156113b357600080fd5b50611504600480360360408110156113ca57600080fd5b81019080803590602001906401000000008111156113e757600080fd5b8201836020820111156113f957600080fd5b8035906020019184600183028401116401000000008311171561141b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561147e57600080fd5b82018360208201111561149057600080fd5b803590602001918460018302840111640100000000831117156114b257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d33565b005b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611548573d6000803e3d6000d15b505050565bc88173ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681526020017f6a566173795073463459486a323234222c20226964223a317d2c207b2261636381526020017f6f756e74223a227a55343279445733667a466a47576f736465566a566173795081526020017f73463459486a323234222c202020226964223a327d5d000000000000000000008152506076019050604051809103908181016040528181858588c3945050505050158015611636573d6000803e3d6000d15b508173ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226964223a317d0000000000000000000000000000000000000000000000008152506008019050604051809103908181016040528181858588c49450505050501580156116ad573d6000803e3d6000d15b508173ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226163636f756e74223a2269643d3d32227d0000000000000000000000000081525060130190506040518091039081810160405260405180807f7b226964223a20327d00000000000000000000000000000000000000000000008152506009019050604051809103908181016040528181858589898cc59650505050505050158015611763573d6000803e3d6000d15b50c9158015611776573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c09450505050501580156117bd573d6000803e3d6000d15b505050565b8373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc5965050505050505015801561180f573d6000803e3d6000d15b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc59650505050505050158015611863573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1681805190602001818184c1925050501580156118a0573d6000803e3d6000d15b5050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c39450505050501580156118e6573d6000803e3d6000d15b50505050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c494505050505015801561192e573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1683838051906020018480519060200181818585888ac795505050505050158015611979573d6000803e3d6000d15b50505050565b606060008473ffffffffffffffffffffffffffffffffffffffff1684805190602001858051906020018181858588c6945050505050905060008114151515611a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050600082cb9050606060008090505b83811015611b5a5760008090505b83811015611b0b576060868383808284d0602001806040519081016040528181848688cd9450505050509050611aad8482611d7a565b93506001850382141515611afd57611afa846040805190810160405280600281526020017f2c20000000000000000000000000000000000000000000000000000000000000815250611d7a565b93505b508080600101915050611a77565b50611b4b826040805190810160405280600281526020017f3b0a000000000000000000000000000000000000000000000000000000000000815250611d7a565b91508080600101915050611a69565b50809450505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c2945050505050158015611bab573d6000803e3d6000d15b505050565b606060008573ffffffffffffffffffffffffffffffffffffffff1685805190602001868051906020018181858588c6945050505050905060008114151515611c86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050606060008090505b82811015611d2457606084828880519060200181818486cf6020018060405190810160405281818585888acc955050505050509050611cd38382611d7a565b9250611d14836040805190810160405280600181526020017f3b00000000000000000000000000000000000000000000000000000000000000815250611d7a565b9250508080600101915050611c94565b50809350505050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c4945050505050158015611d75573d6000803e3d6000d15b505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611dbe5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8551811015611e84578581815181101515611de857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e4757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611dd1565b5060008090505b8451811015611f3e578481815181101515611ea257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611f0157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611e8b565b508195505050505050929150505600a165627a7a723058208b20fb88ba248a768795bdfa5965f60013dcd97a4301932345ddd45829cee2100029' + //solidity code: solidity-example/solidity-TableTxs.sol var tagStep = { @@ -61,17 +76,29 @@ var tagStep = { table_update: 10, table_get: 11, table_transaction: 12, deployContract: 13 } +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", + publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' +} + + main(); async function main() { - let res = await c.connect('ws://127.0.0.1:6005'); + + var wsAddress = 'ws://192.168.29.118:6006'; + let res = await c.connect(wsAddress); console.log(" connect successfully.") c.setRestrict(true); + let res2 = await c.getTableAuth(smRoot.address,sTableName); + console.log( JSON.stringify(res2)); + /**************************************/ // userOperation = user; - const contractAddr = "zEyJTYupmFGo3tWCts8uyzmkkmjJAwgS2u"; - let nStep = tagStep.deployContract; + const contractAddr = "zGAcwQoo5xqHKy42waq9d2Tb6Myn2MyvJf"; + let nStep = tagStep.table_transaction; // sTableName = sTableNameNew; // if (nStep != tagStep.active && nStep != tagStep.deployContract) { @@ -97,7 +124,7 @@ async function main() { } async function deployContract() { - c.as(owner) + c.as(smRoot) myContract = c.contract(JSON.parse(abi)); try { let deployRes = await myContract.deploy( @@ -117,20 +144,20 @@ async function deployContract() { } var active = async function () { - c.as(root); + c.as(smRoot); var amount = 20000 console.log("----------- active >>>>>>>>>>>>>"); - let res = await c.pay(owner.address, amount).submit({ expect: 'validate_success' }) - console.log("\n owner", owner.address, ":", res) - res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) - console.log("\n user", user.address, ":", res) - res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) - console.log("\n user1", user1.address, ":", res) - console.log("\n----------- active <<<<<<<<<<<<<"); + let res = await c.pay(smUser.address, amount).submit({ expect: 'validate_success' }) + console.log("\n owner", smUser.address, ":", res) + // res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) + // console.log("\n user", user.address, ":", res) + // res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) + // console.log("\n user1", user1.address, ":", res) + // console.log("\n----------- active <<<<<<<<<<<<<"); } var table_create = async function () { - c.as(owner) + c.as(smRoot) //发交易调用合约 try { myContract.methods.create(sTableName, rawTable).submit({ @@ -190,9 +217,9 @@ var table_rename = async function () { } } var table_grant = async function () { - c.as(owner) + c.as(smRoot) try { - myContract.methods.grant(grantAddr, sTableName, flag).submit({ + myContract.methods.grant(smUser.address, sTableName, flag).submit({ Gas: 500000, expect: "validate_success" }, (err, res) => { @@ -216,24 +243,24 @@ var table_drop = async function () { } } var table_insert = async function () { - c.as(userOperation) + c.as(smUser) try { - if (userOperation.address != owner.address) { - myContract.methods.insert(owner.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField - Gas: 500000, + // if (userOperation.address != owner.address) { + myContract.methods.insert(smRoot.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + Gas: 5000000, expect: "db_success" }, (err, res) => { err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); }); - } - else { - myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField - Gas: 500000, - expect: "db_success" - }, (err, res) => { - err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); - }); - } + // } + // else { + // myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + // Gas: 500000, + // expect: "db_success" + // }, (err, res) => { + // err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); + // }); + // } } catch (error) { console.log(error); } @@ -370,9 +397,10 @@ var table_get = async function () { // console.log(" record with fields:", lll); } var table_transaction = async function () { - c.as(owner) + c.as(smUser) + c.use(smRoot.address) try { - myContract.methods.sqlTransaction(sTableName).submit({ + myContract.methods.sqlTransaction(smRoot.address,sTableName).submit({ Gas: 500000, expect: "validate_success" }, (err, res) => { diff --git a/test/testTable.js b/test/testTable.js index 1211925..da6e1c1 100644 --- a/test/testTable.js +++ b/test/testTable.js @@ -3,9 +3,10 @@ const ChainsqlAPI = require('../src/index'); const c = new ChainsqlAPI(); var root = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" -}; + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + var owner = { address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", @@ -23,9 +24,22 @@ var user2 = { secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" } +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", + publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9U…txxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' +} + + +const smUser7 ={ + secret:"pwRdHmA4cSUKKtFyo4m2vhiiz5g6ym58Noo9dTsUU97mARNjevj", + address: "zMXMtS2C36J1p3uhTxRFWV8pEhHa8AMMSL", + publicKey: "pYvXDbsUUr5dpumrojYApjG8nLfFMXhu3aDvxq5oxEa4ZSeyjrMzisdPsYjfxyg9eN3ZJsNjtNENbzXPL89st39oiSp5yucU" +} + var grantAddr = "0xzzzzzzzzzzzzzzzzzzzzBZbvji"; -var sTableName = "chainsqlTest"; +var sTableName = "hjkz9"; var sTableNameNew = "table_new" var tableRaw = [ { 'field': 'id', 'type': 'int' }, @@ -57,15 +71,76 @@ var tagStep = { table_update: 10, table_get: 11, table_transaction: 12 } +var wsAddr = 'ws://192.168.29.69:8006' + main(); async function main() { - let res = await c.connect('ws://127.0.0.1:6006'); + let res = await c.connect(wsAddr); console.log("connect successfully.") c.setRestrict(true); + //test + c.as(smRoot) + try{ + + var tableRaw = [ + { 'field': 'id', 'type': 'int', 'length': 100, 'PK': 1, 'NN': 1 }, + { 'field': 'name', 'type': 'varchar', 'length': 100 }, + { 'field': 'age', 'type': 'int' }, + { 'field': 'account', 'type': 'varchar', 'length': 40 } + ]; + + var rule = { + 'Insert': { + 'Condition': { 'account': '$account' }, //Condition:指定插入操作可设置的默认值 + 'Count': { 'AccountField': 'account', 'CountLimit': 5 } + }, + 'Delete': { + 'Condition': { 'account': '$account' } //只能删除自己插入的数据 + }, + 'Get': { + 'Condition': { 'id': { '$ge': 5 } } //只能查询id大于5的数据 + }, + 'Update': { + 'Fields': ['name'] //只能更新name字段 + } + }; + var option = { + confidential: false, + operationRule: rule + }; + + var lll; + // lll = await c.createTable(sTableName, tableRaw, option).submit({ expect: 'db_success' }); + // console.log(" createTable_operationRule", lll); + + // var insertRaw2 = [ + // { 'id': 1, 'name': 'zhangsan', 'age': 123 } + // ]; + + + // lll = await c.table(sTableName).insert(insertRaw2).submit({ expect: 'validate_success' }); + // console.log(" insert", lll); + + + var rs = await c.table(sTableName).get({ 'id': 1 }).delete().submit({ expect: 'db_success' }) + console.log("testDelete", rs) + }catch(e){ + + console.error(e) + } + + return ; + + + + + + + //t /**************************************/ - let nStep = tagStep.table_insert; + let nStep = tagStep.table_insert_operationRule; // userOperation = user; switch (nStep) { case tagStep.active: active(); break; @@ -99,27 +174,41 @@ var active = async function () { } var table_create = async function () { - c.as(owner) + c.as(smRoot) try { - let lll = await c.createTable(sTableName, tableRaw).submit({expect:"db_success"}); + var option = { + confidential: true + }; + let lll = await c.createTable(sTableName, tableRaw,option).submit({expect:"db_success"}); console.log(" createTable", sTableName, lll); } catch (error) { console.log(" createTable ", sTableName, error); } }; var table_create_operationRule = async function () { - c.as(owner) - var rule = { - 'Insert': { - 'Condition': { 'txHash': '$tx_hash' } //Condition:指定插入操作可设置的默认值 - } - }; - var option = { - confidential: false, - operationRule: rule - }; - let lll = await c.createTable(sTableName, tableRaw, option).submit({ expect: 'db_success' }); - console.log(" createTable_operationRule", lll); + + + try{ + c.as(smRoot) + var rule = { + 'Insert': { + 'Condition': { 'txHash': '$tx_hash' } //Condition:指定插入操作可设置的默认值 + } + }; + var option = { + confidential: false, + operationRule: rule + }; + let lll = await c.createTable(sTableName, tableRaw, option).submit({ expect: 'db_success' }); + console.log(" createTable_operationRule", lll); + + }catch(e){ + + console.error(e); + + } + + } var table_rename = async function () { c.as(owner) @@ -138,8 +227,9 @@ var table_drop = async function () { console.log(" dropTable", sTableName, lll); } var table_insert = async function () { - c.as(userOperation) - c.use(owner.address) + c.as(smRoot) + // c.as(userOperation) + // c.use(owner.address) try { let lll = await c.table(sTableName).insert(insertRaw, "txHash").submit({ expect: 'db_success' }); console.log(" insert", lll); @@ -148,8 +238,8 @@ var table_insert = async function () { } }; var table_insert_operationRule = async function () { - c.as(userOperation) - c.use(owner.address) + c.as(smRoot) + // c.use(owner.address) let lll = await c.table(sTableName).insert(insertRaw).submit({ expect: 'db_success' }); console.log(" insert", lll); } From 0c28ff1b210927b99b9b707c00e44107dcd4ca00 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 12 Oct 2020 14:54:11 +0800 Subject: [PATCH 08/80] upgrade version to 0.6.71 --- lib/error.js | 2 +- lib/util.js | 2 +- package.json | 2 +- src/index.js | 2 +- src/ripple.js | 2 +- src/smartContract.js | 2 +- src/submit.js | 2 +- src/tablePayment.js | 2 +- src/txPayment.js | 2 +- test/server.js | 2 +- test/test.js | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/error.js b/lib/error.js index 32fdb44..cd1ae33 100644 --- a/lib/error.js +++ b/lib/error.js @@ -1,6 +1,6 @@ "use strict"; -const chainsqldError = require('chainsql-lib').ChainsqlLibCommon.errors.ChainsqldError; +const chainsqldError = require('chainsql-lib-test').ChainsqlLibCommon.errors.ChainsqldError; function chainsqlError( errMsg ) { let errName = "apiGeneralErr"; diff --git a/lib/util.js b/lib/util.js index abb0861..3b6d65e 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,6 +1,6 @@ 'use strict'; const path = require('path'); -const common = require('chainsql-lib').ChainsqlLibCommon; +const common = require('chainsql-lib-test').ChainsqlLibCommon; const keypairs = require('chainsql-keypairs-test'); const cryptoo = require('crypto'); const crypto = require('./crypto'); diff --git a/package.json b/package.json index 10a3503..1453622 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs-test": "^0.10.16", - "chainsql-lib": "^0.17.44", + "chainsql-lib-test": "^0.17.52", "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", diff --git a/src/index.js b/src/index.js index 107cdd0..897ab6f 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ const keypairs = require('chainsql-keypairs-test'); const EventManager = require('./eventManager') const _ = require('lodash'); -const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); const chainsqlError = require('../lib/error'); diff --git a/src/ripple.js b/src/ripple.js index 93353e0..777d3cf 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -2,7 +2,7 @@ var util = require('../lib/util'); var Submit = require('./submit'); const FloatOperation = require('../lib/floatOperation'); -var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { diff --git a/src/smartContract.js b/src/smartContract.js index 862acaa..0ec476e 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -3,7 +3,7 @@ var util = require('../lib/util'); const _ = require('lodash'); -var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; const keypairs = require('chainsql-keypairs-test'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); diff --git a/src/submit.js b/src/submit.js index 46cc813..a052bb5 100644 --- a/src/submit.js +++ b/src/submit.js @@ -1,6 +1,6 @@ 'use strict' var util = require('../lib/util'); -const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; const Connection = require('./connect'); class Submit { diff --git a/src/tablePayment.js b/src/tablePayment.js index c938ef9..50ba7b2 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -4,7 +4,7 @@ var _ = require('lodash'); const path = require('path'); const getTxJson = require('../lib/util').getTxJson; const calcFee = require('../lib/util').calcFee; -var utils = require('chainsql-lib').ChainsqlLibUtil; +var utils = require('chainsql-lib-test').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; diff --git a/src/txPayment.js b/src/txPayment.js index 09c4951..8eb7343 100644 --- a/src/txPayment.js +++ b/src/txPayment.js @@ -2,7 +2,7 @@ var _ = require('lodash'); const path = require('path'); -var utils = require('chainsql-lib').ChainsqlLibUtil; +var utils = require('chainsql-lib-test').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; diff --git a/test/server.js b/test/server.js index 96f1f62..9d95924 100644 --- a/test/server.js +++ b/test/server.js @@ -5,7 +5,7 @@ const co = require('co') const ChainsqlAPI = require('../src/index'); const r = new ChainsqlAPI(); var path = require('path'); -var basePath = path.join(require.resolve('chainsql-lib'), '../common'); +var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); var common = require(basePath); var crypto = require('../lib/crypto'); const keypairs = require('chainsql-keypairs-test'); diff --git a/test/test.js b/test/test.js index 504423f..bf6e68d 100644 --- a/test/test.js +++ b/test/test.js @@ -7,7 +7,7 @@ const ChainsqlAPI = require('../src/index'); // ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); const c = new ChainsqlAPI(); -const RippleAPI = new require('chainsql-lib').RippleAPI; +const RippleAPI = new require('chainsql-lib-test').RippleAPI; var user = { secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", From f87e2f6e44db01fbd91d0fa03b1a3cf4f89175ef Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 23 Oct 2020 15:34:12 +0800 Subject: [PATCH 09/80] add schemaID parameter to the connection interface with the chainsql node --- solidity-example/solidity-TableTxs.sol | 9 ++++----- src/connect.js | 4 ++++ src/eventManager.js | 9 ++++++++- src/index.js | 8 ++++++++ src/ripple.js | 7 +++++++ src/submit.js | 2 -- src/tablePayment.js | 12 ++++++++++++ 7 files changed, 43 insertions(+), 8 deletions(-) diff --git a/solidity-example/solidity-TableTxs.sol b/solidity-example/solidity-TableTxs.sol index 506aebb..3bdc20e 100644 --- a/solidity-example/solidity-TableTxs.sol +++ b/solidity-example/solidity-TableTxs.sol @@ -85,12 +85,11 @@ contract DBTest { return msg.sender.grant(toWho, tableName, raw); } - function sqlTransaction(string tableName) public{ + function sqlTransaction(address owner,string tableName) public{ db.beginTrans(); - msg.sender.create(tableName, "[{\"field\":\"id\", \"type\" : \"int\", \"length\" : 11, \"PK\" : 1, \"NN\" : 1, \"UQ\" : 1}, { \"field\":\"account\", \"type\" : \"varchar\" }, { \"field\":\"age\", \"type\" : \"int\" }]"); - msg.sender.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); - msg.sender.deletex(tableName, "{\"id\":1}"); - msg.sender.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); + owner.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); + owner.deletex(tableName, "{\"id\":1}"); + owner.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); db.commit(); } diff --git a/src/connect.js b/src/connect.js index d0064f2..c5f279c 100644 --- a/src/connect.js +++ b/src/connect.js @@ -17,6 +17,10 @@ Connection.prototype.useCert = function(cert) { this.userCert = cert; } +Connection.prototype.setSchema = function(schemaID) { + this.schemaID = schemaID; +} + Connection.prototype.connect = function() { let that = this; return new Promise(function(resolve, reject) { diff --git a/src/eventManager.js b/src/eventManager.js index f3647ee..3c7012b 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -28,9 +28,16 @@ EventManager.prototype.subscribeTable = function(owner, name, cb) { }; EventManager.prototype.subscribeTx = function(id, cb) { var that = this; + + var schema_id = "" + if(that.chainsql.connect.schemaID !=undefined){ + schema_id = that.chainsql.connect.schemaID + } + var messageTx = { "command": "subscribe", - "transaction": id + "transaction": id, + schema_id: schema_id, }; if (!that.onMessage) { _onMessage(that); diff --git a/src/index.js b/src/index.js index cbbe08f..e91421b 100644 --- a/src/index.js +++ b/src/index.js @@ -1019,6 +1019,14 @@ ChainsqlAPI.prototype.prepareJson = function(){ }) } +/** + * 设置操作链的ID + * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; + */ +ChainsqlAPI.prototype.setSchema = function(schemaID){ + this.connect.setSchema(schemaID); +} + function callback(data, callback) { } diff --git a/src/ripple.js b/src/ripple.js index 93353e0..7fef145 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -73,6 +73,13 @@ Ripple.prototype.prepareJson = function () { txJson.source.maxAmount.value = (FloatOperation.accAdd(parseFloat(value), fee)).toString(); } } + + //self.connect + + if(self.ChainsqlAPI.connect.schemaID != undefined){ + self.ChainsqlAPI.api.schemaID = self.ChainsqlAPI.connect.schemaID; + } + self.ChainsqlAPI.api.preparePayment(self.ChainsqlAPI.connect.address, txJson, instructions) .then(function (data) { resolve(data); diff --git a/src/submit.js b/src/submit.js index 46cc813..9f45797 100644 --- a/src/submit.js +++ b/src/submit.js @@ -83,8 +83,6 @@ Submit.prototype.setCert = function () { } - - } }; diff --git a/src/tablePayment.js b/src/tablePayment.js index 39d7780..1b66b2a 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -81,11 +81,23 @@ function prepareTablePayment(payment, chainsqlApi) { } function prepareTable(ChainSQL, payment, resolve, reject) { + + if(ChainSQL.connect.schemaID != undefined){ + ChainSQL.api.schemaID = ChainSQL.connect.schemaID; + } + prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { // console.log(tx_json); getTxJson(ChainSQL, JSON.parse(tx_json.txJSON)).then(function (data) { var dropsPerByte = Math.ceil(1000000.0 / 1024);; + + + if(ChainSQL.ChainsqlAPI.connect.schemaID != undefined){ + ChainSQL.ChainsqlAPI.api.schemaID = ChainSQL.ChainsqlAPI.connect.schemaID ; + } + + ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ From d55643b341a39813a98229823785c60c2037f7aa Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 27 Oct 2020 18:24:24 +0800 Subject: [PATCH 10/80] add unit test code --- test/contract-tabletxs-test.js | 520 +++++++++++++++++++++++++++++++++ test/crypto-test.js | 63 ++++ test/gateway-test.js | 406 +++++++++++++++++++++++++ test/ripple-test.js | 73 +++++ test/server-test.js | 138 +++++++++ test/table-contract-test.js | 197 +++++++++++++ test/table-test.js | 192 ++++++++++++ 7 files changed, 1589 insertions(+) create mode 100644 test/contract-tabletxs-test.js create mode 100644 test/crypto-test.js create mode 100644 test/gateway-test.js create mode 100644 test/ripple-test.js create mode 100644 test/server-test.js create mode 100644 test/table-contract-test.js create mode 100644 test/table-test.js diff --git a/test/contract-tabletxs-test.js b/test/contract-tabletxs-test.js new file mode 100644 index 0000000..24597fa --- /dev/null +++ b/test/contract-tabletxs-test.js @@ -0,0 +1,520 @@ +'use strict' +const chai = require('chai'); +const assert = chai.assert; +const ChainsqlAPI = require('../src/index'); +const c = new ChainsqlAPI(); + +var root = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + +var owner = { + address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", + secret: "xnnUqirFepEKzVdsoBKkMf577upwT" +} + +var user = { + address: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv", + secret: "xnJn5J5uYz3qnYX72jXkAPVB3ZsER" +} +var userOperation = user; + +var user1 = { + address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", + secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" +} + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + +var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; +var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; + +var sTableName = "n1"; +var sTableNameNew = "table_new" +var rawTable = "[ \ + { \"field\": \"id\", \"type\": \"int\" }, \ + { \"field\": \"time\", \"type\": \"datetime\" }, \ + { \"field\": \"txHash\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"name\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"email\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"account\", \"type\": \"varchar\", \"length\": 40 } \ +]"; + +var rawInsert = "[ \ + { \"id\": 11, \"name\": \"zhangsan\", \"email\": \"123\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 22, \"name\": \"lisi\", \"email\": \"124\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 33, \"name\": \"wangwu\", \"email\": \"125\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 44, \"name\": \"zhaoliu\", \"email\": \"126\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" } \ +]"; + +var rawDelete = "{\"id\":1}" +var rawUpdate = "{ \"account\": \"134\" }" +var rawGet = "{\"id\": 2}" + + +var myContract; +var contractAddr; +const abi = '[{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"create","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"drop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"toWho","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"grant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"},{"name":"field","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'; +const deployBytecode = '0x608060405234801561001057600080fd5b50611f58806100206000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff8146100ca578063198e2b8a1461022957806331445f171461038857806331c3e4561461059e5780635310b551146107945780636c02d6921461085c578063746ecd69146109db5780638b0a4ee114610b5a57806391025cb114610cd957806399489c2114610da15780639c7c722b14610f99578063cf22eb59146110f8578063ea0f5b7a14611387575b600080fd5b3480156100d657600080fd5b50610227600480360360408110156100ed57600080fd5b810190808035906020019064010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460018302840111640100000000831117156101d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506114e6565b005b34801561023557600080fd5b506103866004803603604081101561024c57600080fd5b810190808035906020019064010000000081111561026957600080fd5b82018360208201111561027b57600080fd5b8035906020019184600183028401116401000000008311171561029d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561030057600080fd5b82018360208201111561031257600080fd5b8035906020019184600183028401116401000000008311171561033457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061152d565b005b34801561039457600080fd5b5061059c600480360360808110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103e857600080fd5b8201836020820111156103fa57600080fd5b8035906020019184600183028401116401000000008311171561041c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460018302840111640100000000831117156104b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561051657600080fd5b82018360208201111561052857600080fd5b8035906020019184600183028401116401000000008311171561054a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611574565b005b3480156105aa57600080fd5b50610792600480360360608110156105c157600080fd5b81019080803590602001906401000000008111156105de57600080fd5b8201836020820111156105f057600080fd5b8035906020019184600183028401116401000000008311171561061257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561067557600080fd5b82018360208201111561068757600080fd5b803590602001918460018302840111640100000000831117156106a957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561070c57600080fd5b82018360208201111561071e57600080fd5b8035906020019184600183028401116401000000008311171561074057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506115c8565b005b3480156107a057600080fd5b5061085a600480360360208110156107b757600080fd5b81019080803590602001906401000000008111156107d457600080fd5b8201836020820111156107e657600080fd5b8035906020019184600183028401116401000000008311171561080857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061161b565b005b34801561086857600080fd5b506109d96004803603606081101561087f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111640100000000831117156108f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561095357600080fd5b82018360208201111561096557600080fd5b8035906020019184600183028401116401000000008311171561098757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611656565b005b3480156109e757600080fd5b50610b58600480360360608110156109fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b80359060200191846001830284011164010000000083111715610a6f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ad257600080fd5b820183602082011115610ae457600080fd5b80359060200191846001830284011164010000000083111715610b0657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061169e565b005b348015610b6657600080fd5b50610cd760048036036060811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610bba57600080fd5b820183602082011115610bcc57600080fd5b80359060200191846001830284011164010000000083111715610bee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c5157600080fd5b820183602082011115610c6357600080fd5b80359060200191846001830284011164010000000083111715610c8557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116e6565b005b348015610ce557600080fd5b50610d9f60048036036020811015610cfc57600080fd5b8101908080359060200190640100000000811115610d1957600080fd5b820183602082011115610d2b57600080fd5b80359060200191846001830284011164010000000083111715610d4d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611731565b005b348015610dad57600080fd5b50610f1e60048036036060811015610dc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e0157600080fd5b820183602082011115610e1357600080fd5b80359060200191846001830284011164010000000083111715610e3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e9857600080fd5b820183602082011115610eaa57600080fd5b80359060200191846001830284011164010000000083111715610ecc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061195e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f5e578082015181840152602081019050610f43565b50505050905090810190601f168015610f8b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fa557600080fd5b506110f660048036036040811015610fbc57600080fd5b8101908080359060200190640100000000811115610fd957600080fd5b820183602082011115610feb57600080fd5b8035906020019184600183028401116401000000008311171561100d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561107057600080fd5b82018360208201111561108257600080fd5b803590602001918460018302840111640100000000831117156110a457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b48565b005b34801561110457600080fd5b5061130c6004803603608081101561111b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561115857600080fd5b82018360208201111561116a57600080fd5b8035906020019184600183028401116401000000008311171561118c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156111ef57600080fd5b82018360208201111561120157600080fd5b8035906020019184600183028401116401000000008311171561122357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561128657600080fd5b82018360208201111561129857600080fd5b803590602001918460018302840111640100000000831117156112ba57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b8f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561134c578082015181840152602081019050611331565b50505050905090810190601f1680156113795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561139357600080fd5b506114e4600480360360408110156113aa57600080fd5b81019080803590602001906401000000008111156113c757600080fd5b8201836020820111156113d957600080fd5b803590602001918460018302840111640100000000831117156113fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561145e57600080fd5b82018360208201111561147057600080fd5b8035906020019184600183028401116401000000008311171561149257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d12565b005b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611528573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c094505050505015801561156f573d6000803e3d6000d15b505050565b8373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc596505050505050501580156115c1573d6000803e3d6000d15b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc59650505050505050158015611615573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1681805190602001818184c192505050158015611652573d6000803e3d6000d15b5050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611698573d6000803e3d6000d15b50505050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c49450505050501580156116e0573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1683838051906020018480519060200181818585888ac79550505050505015801561172b573d6000803e3d6000d15b50505050565bc83373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681526020017f6a566173795073463459486a323234222c20226964223a31317d2c207b22616381526020017f636f756e74223a227a55343279445733667a466a47576f736465566a5661737981526020017f5073463459486a323234222c202020226964223a31327d5d00000000000000008152506078019050604051809103908181016040528181858588c394505050505015801561181a573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226964223a317d0000000000000000000000000000000000000000000000008152506008019050604051809103908181016040528181858588c4945050505050158015611891573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226163636f756e74223a2269643d3d32227d0000000000000000000000000081525060130190506040518091039081810160405260405180807f7b226964223a20327d00000000000000000000000000000000000000000000008152506009019050604051809103908181016040528181858589898cc59650505050505050158015611947573d6000803e3d6000d15b50c915801561195a573d6000803e3d6000d15b5050565b606060008473ffffffffffffffffffffffffffffffffffffffff1684805190602001858051906020018181858588c6945050505050905060008114151515611a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050600082cb9050606060008090505b83811015611b395760008090505b83811015611aea576060868383808284d0602001806040519081016040528181848688cd9450505050509050611a8c8482611d59565b93506001850382141515611adc57611ad9846040805190810160405280600281526020017f2c20000000000000000000000000000000000000000000000000000000000000815250611d59565b93505b508080600101915050611a56565b50611b2a826040805190810160405280600281526020017f3b0a000000000000000000000000000000000000000000000000000000000000815250611d59565b91508080600101915050611a48565b50809450505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c2945050505050158015611b8a573d6000803e3d6000d15b505050565b606060008573ffffffffffffffffffffffffffffffffffffffff1685805190602001868051906020018181858588c6945050505050905060008114151515611c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050606060008090505b82811015611d0357606084828880519060200181818486cf6020018060405190810160405281818585888acc955050505050509050611cb28382611d59565b9250611cf3836040805190810160405280600181526020017f3b00000000000000000000000000000000000000000000000000000000000000815250611d59565b9250508080600101915050611c73565b50809350505050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c4945050505050158015611d54573d6000803e3d6000d15b505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611d9d5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8551811015611e63578581815181101515611dc757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e2657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611db0565b5060008090505b8451811015611f1d578481815181101515611e8157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611ee057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611e6a565b508195505050505050929150505600a165627a7a723058200b0dbd97123f4e63cdd05fb7f53186505f6425bd763465b61c74dc7f7a282eeb0029'; +//solidity code: solidity-example/solidity-TableTxs.sol + +var tagStep = { + active: 1, table_create: 2, table_create_operationRule: 3, + table_rename: 4, table_grant: 5, table_drop: 6, + table_insert: 7, table_insert_operationRule: 8, table_delete: 9, + table_update: 10, table_get: 11, table_transaction: 12, deployContract: 13 +} + +var wsAddress = 'ws://192.168.29.69:5003'; + +describe('contract table txs', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(smRoot); + }) + + it('active', async function(){ + + var amount = 2000 + let res = await c.pay(smUser.address, amount).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + + }) + + it('deployContract', async function(){ + + this.timeout(5000) + myContract = c.contract(JSON.parse(abi)); + let deployRes = await myContract.deploy( + { + ContractData: deployBytecode, + }).submit({ + Gas: '5000000', + }); + + assert.hasAllKeys(deployRes, ['status', 'tx_hash','contractAddress']) + assert.equal(deployRes.status,'validate_success') + + contractAddr = deployRes.contractAddress + }) + + it('create table', async function(){ + + //发交易调用合约 + let res = await myContract.methods.create(sTableName, rawTable).submit({ + Gas: 500000, + expect: "db_success" + }); + + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'db_success') + }) + + it('table insert', async function(){ + + // if (userOperation.address != owner.address) { + // let res = await myContract.methods.insert(owner.address, sTableName, rawInsert/*, "txHash"*/).submit({ + // Gas: 500000, + // expect: "db_success" + // }) + + // assert.hasAllKeys(res, ['status', 'tx_hash']) + // assert.equal(res.status,'db_success') + // } + // else { + let res = await myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + Gas: 500000, + expect: "db_success" + }) + + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'db_success') + //} + }) + + it('table grant', async function(){ + + // c.as(smRoot) + let res = await myContract.methods.grant(smUser.address, sTableName, flag).submit({ + Gas: 500000, + expect: "validate_success" + }) + + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'validate_success') + }) + + + // it('table insert', async function(){ + + // c.as(smUser) + // let res = await myContract.methods.insert(smRoot.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + // Gas: 500000, + // expect: "db_success" + // }) + + // assert.hasAllKeys(res, ['status', 'tx_hash']) + // assert.equal(res.status,'db_success') + + // // c.as(smRoot) + // // res = await myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + // // Gas: 500000, + // // expect: "db_success" + // // }) + + // // assert.hasAllKeys(res, ['status', 'tx_hash']) + // // assert.equal(res.status,'db_success') + + // }) + + + it('table drop', async function(){ + + // c.as(owner) + let res = await myContract.methods.drop(sTableName).submit({ + Gas: 500000, + expect: "validate_success" + }); + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'validate_success') + }) + + +}) + + + + +// main(); +// async function main() { +// let res = await c.connect(wsAddress); +// console.log(" connect successfully.") +// c.setRestrict(true); + + +// /**************************************/ +// // userOperation = user; +// const contractAddr = "zEyJTYupmFGo3tWCts8uyzmkkmjJAwgS2u"; +// let nStep = tagStep.deployContract; +// // sTableName = sTableNameNew; +// // +// if (nStep != tagStep.active && nStep != tagStep.deployContract) { +// myContract = c.contract(JSON.parse(abi), contractAddr); +// } +// switch (nStep) { +// case tagStep.active: active(); break; +// case tagStep.deployContract: deployContract(); break; +// case tagStep.table_create: table_create(); break; +// case tagStep.table_create_operationRule: table_create_operationRule(); break; +// case tagStep.table_rename: table_rename(); break; +// case tagStep.table_grant: table_grant(); break; +// case tagStep.table_drop: table_drop(); break; +// case tagStep.table_insert: table_insert(); break; +// case tagStep.table_insert_operationRule: table_insert_operationRule(); break; +// case tagStep.table_delete: table_delete(); break; +// case tagStep.table_update: table_update(); break; +// case tagStep.table_get: table_get(); break; +// case tagStep.table_transaction: table_transaction(); break; +// default: break; +// } +// /**************************************/ +// } + +// async function deployContract() { +// c.as(owner) +// myContract = c.contract(JSON.parse(abi)); +// try { +// let deployRes = await myContract.deploy( +// { +// ContractData: deployBytecode, +// }).submit({ +// Gas: '5000000', +// // ContractValue: "10000000", +// }); +// console.log(" deployContract Res:", deployRes); +// if (deployRes.contractAddress != "undefined") { +// console.log(" contractAddress:", deployRes.contractAddress); +// } +// } catch (error) { +// console.log(error); +// } +// } + +// var active = async function () { +// c.as(root); +// var amount = 20000 +// console.log("----------- active >>>>>>>>>>>>>"); +// let res = await c.pay(owner.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n owner", owner.address, ":", res) +// res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n user", user.address, ":", res) +// res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n user1", user1.address, ":", res) +// console.log("\n----------- active <<<<<<<<<<<<<"); +// } + +// var table_create = async function () { +// c.as(owner) +// //发交易调用合约 +// try { +// myContract.methods.create(sTableName, rawTable).submit({ +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); +// }); +// /* +// //不发交易调用合约 +// myContract.methods.create(sTableName, rawTable).call({ +// Gas: 500000 +// }, (err, res) => { +// err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); +// }); +// // */ +// } catch (error) { +// console.log(error); +// } +// } +// var table_create_operationRule = async function () { +// console.log(" no support in this version") +// /* +// c.as(owner) +// var rule = { +// 'Insert': { +// 'Condition': { 'txHash': '$tx_hash' } //Condition:指定插入操作可设置的默认值 +// } +// }; +// var option = { +// confidential: false, +// operationRule: rule +// }; +// try { +// myContract.methods.create(sTableName, rawTable, option).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" CreateTable operationRule res:", err) : console.log(" CreateTable operationRule res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// // */ +// } +// var table_rename = async function () { +// c.as(owner) +// try { +// myContract.methods.rename(sTableName, sTableNameNew).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" renameTable res:", err) : console.log(" renameTable res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } +// var table_grant = async function () { +// c.as(owner) +// try { +// myContract.methods.grant(grantAddr, sTableName, flag).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" grant res:", err) : console.log(" grant res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } +// var table_drop = async function () { +// c.as(owner) +// try { +// myContract.methods.drop(sTableName).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" dropTable res:", err) : console.log(" dropTable res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } +// var table_insert = async function () { +// c.as(userOperation) +// try { +// if (userOperation.address != owner.address) { +// myContract.methods.insert(owner.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// }); +// } +// else { +// myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// }); +// } +// } catch (error) { +// console.log(error); +// } +// } +// var table_insert_operationRule = async function () { +// console.log(" no support in this version") +// // c.as(userOperation) +// // try { +// // if(userOperation.address != owner.address) +// // { +// // myContract.methods.insert(owner.address, sTableName, rawInsert).submit({ //no support autoFillField +// // Gas: 500000, +// // expect: "validate_success" +// // }, (err, res) => { +// // err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// // }); +// // } +// // else{ +// // myContract.methods.insert(sTableName, rawInsert).submit({ //no support autoFillField +// // Gas: 500000, +// // expect: "validate_success" +// // }, (err, res) => { +// // err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// // }); +// // } +// // } catch (error) { +// // console.log(error); +// // } +// } +// var table_delete = async function () { +// c.as(userOperation) +// try { +// if (userOperation.address != owner.address) { +// myContract.methods.deletex(owner.address, sTableName, rawDelete).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" deletex res:", err) : console.log(" deletex res:", res); +// }); +// } +// else { +// myContract.methods.deletex(sTableName, rawDelete).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" deletex res:", err) : console.log(" deletex res:", res); +// }); +// } +// } catch (error) { +// console.log(error); +// } +// } +// function tableUpdate(i) { +// try { +// var arrayRawUpdate = [ +// "{ \"account\": \"update id==2\" }", +// "{ \"account\": \"update email==123\" }", +// "{ \"account\": \"update email == 126 || name == wangwu\" }", +// "{ \"account\": \"update email == 124 && name == lisi\" }", +// // "{ \"account\": \"update all\" }", +// ] +// var arrayRawGet = [ +// "{\"id\": 2}", +// "{\"email\": \"123\"}", +// "{ \"email\": \"126\" }, { \"name\": \"wangwu\" }", //{ $or: [{ \"email\": \"126\" }, { \"name\": \"wangwu\" }] } +// "{ \"email\": \"124\" , \"name\": \"lisi\" }", //{ $and: [{ \"email\": \"124\" }, { \"name\": \"lisi\" }] } +// // "", //C++ dispose 2 avoid update all, so no support update a table without a WHERE that uses a KEY column +// ] +// let length = arrayRawGet.length; +// if (i < length) { +// rawUpdate = arrayRawUpdate[i]; +// rawGet = arrayRawGet[i]; +// if (userOperation.address != owner.address) { +// myContract.methods.update(owner.address, sTableName, rawUpdate, rawGet).submit({ +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// if (err) { +// console.log(" update", i, err); +// } +// else { +// console.log(" update", i, res); +// tableUpdate(i + 1); +// } +// }); +// } +// else { +// myContract.methods.update(sTableName, rawUpdate, rawGet).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// if (err) { +// console.log(" update", i, err); +// } +// else { +// console.log(" update", i, res); +// tableUpdate(i + 1); +// } +// }); +// } +// } +// } catch (error) { +// console.log(error); +// } +// } +// var table_update = async function () { +// c.as(userOperation) +// tableUpdate(0); +// } +// var table_get = async function () { +// c.as(owner) +// try { +// myContract.methods.get(owner.address, sTableName, "").call((err, str) => { +// err ? console.log(" get handle err:", err) : console.log(" get:", str); +// }); +// var str = await myContract.methods.get(owner.address, sTableName, "", "name").call(); +// console.log(" get with field:", str); +// } catch (error) { +// console.log(error) +// } +// // myContract.methods.table(sTableName).get().submit(); +// // console.log(" all record:", lll); +// // myContract.methods.table(sTableName).get({ $or: [{ email: "123" }, { name: "zhangsan" }] }).submit(); +// // console.log(" record (or)", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).submit(); +// // console.log(" regex record:", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["COUNT(*) as count"]).submit(); +// // console.log(" record count:", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields([]).submit(); +// // console.log(" record count:", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).limit({ index: 0, total: 1 }).withFields([]).submit(); +// // console.log(" record count(limit):", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["account"]).submit(); +// // console.log(" record with fields:", lll); +// } +// var table_transaction = async function () { +// c.as(owner) +// try { +// myContract.methods.sqlTransaction(sTableName).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" transaction res:", err) : console.log(" transaction res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } + diff --git a/test/crypto-test.js b/test/crypto-test.js new file mode 100644 index 0000000..680429c --- /dev/null +++ b/test/crypto-test.js @@ -0,0 +1,63 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); + +const c = new ChainsqlAPI(); + +function hex2a(hexx) { + var hex = hexx.toString();//force conversion + var str = ''; + for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2) + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + return str; +} + + +describe('crypto', () => { + + it('eciesEncrypt', async function(){ + + var wallet = c.generateAddress() + var msg = "hello world" + var cipher = c.eciesEncrypt(msg,wallet.publicKey) + var plainTxt = c.eciesDecrypt(cipher,wallet.secret); + assert.equal(msg,plainTxt.toString()) + }) + + + + it('eciesEncrypt', async function(){ + + var wallet = c.generateAddress() + var msg = "hello world" + var cipher = c.eciesEncrypt(msg,wallet.publicKey) + var plainTxt = c.eciesDecrypt(cipher,wallet.secret) + assert.equal(msg,plainTxt.toString()) + }) + + + it('symEncrypt && symDecrypt', async function(){ + + var msg = "hello world" + var symKey = "1111111111111111"; + var cipher = c.symEncrypt(symKey,msg) + var plainText = c.symDecrypt(symKey,cipher) + assert.equal(msg,plainText) + var cipherGM = c.symEncrypt(symKey,msg,"softGMAlg") + + var plainTextGM = c.symDecrypt(symKey,cipherGM,"softGMAlg") + assert.equal(msg,hex2a(plainTextGM)) + }) + + it('asymEncrypt && asymDecrypt', async function(){ + + var accountInfo = c.generateAddress({algorithm:"softGMAlg"}) + var msg = "hello world" + + var cipher = c.asymEncrypt(msg,accountInfo.publicKey) + var plainText = c.asymDecrypt(cipher,accountInfo.secret) + assert.equal(msg,hex2a(plainText)) + }) + +}) diff --git a/test/gateway-test.js b/test/gateway-test.js new file mode 100644 index 0000000..68be548 --- /dev/null +++ b/test/gateway-test.js @@ -0,0 +1,406 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); + +const c = new ChainsqlAPI(); + +function hex2a(hexx) { + var hex = hexx.toString();//force conversion + var str = ''; + for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2) + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + return str; +} + +var sCurrency = "aaa" + +var wsAddress = 'ws://192.168.29.69:5003'; + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + +describe('gateway', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(smRoot); + }) + + + it('active', async function(){ + var amount = 20000 + let res = await c.pay(smUser.address, amount).submit({expect:'validate_success'}); + assert.equal(res.status,'validate_success') + }) + + it('init gateway', async function(){ + + var opt = { + enableRippling: true, + rate: 1.002, + min: 1, + max: 1.5 + } + + let res = await c.accountSet(opt).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + + }) + + it('trustSet gateway', async function(){ + + var amount = { + value: 30000, + currency: sCurrency, + issuer: smRoot.address + } + + c.as(smUser); + let res = await c.trustSet(amount).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + + }) + + it('payment gateway', async function(){ + + var amount = { + value: 50, + currency: sCurrency, + issuer: smRoot.address + } + + c.as(smRoot); + let res = await c.pay(smUser.address, amount).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + }) + + +}) + + + + +// 'use strict' +// const ChainsqlAPI = require('chainsql'); +// const c = new ChainsqlAPI(); + +// var root = { +// secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", +// address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +// } + +// var issuer = { +// secret: "xxXvas5HTwVwjpmGNLQDdRyYe2H6t", +// address: "z4ypskpHPpMDtHsZvFHg8eDEdTjQrYYYV6" +// } + +// var user = { +// address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", +// secret: "xnnUqirFepEKzVdsoBKkMf577upwT" +// } + +// var user1 = { +// address: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv", +// secret: "xnJn5J5uYz3qnYX72jXkAPVB3ZsER" +// } +// var user2 = { +// address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", +// secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" +// } +// var user3 = { +// address: "zU42yDW3fzFjGWosdeVjVasyPsF4YHj224", +// secret: "xncmqYJG4P9iyaYUf6T81GHs9W1kn" +// } + +// var tagStep = { +// active: 1, gateWay: 2, escrow: 3, +// balances: 4, getLedger: 5, getTxs: 6 +// } +// var sCurrency = "aaa" + + +// var root = { +// secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", +// address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", +// publicKey: "pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM" +// } + +// const smUser2 = { +// secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", +// address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", +// publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +// //cBPfBDz4jW5vxCLdyuaQNJTEFnjTBFc7DVZjdbwjirABD6HUjZUj +// }; + + + +// main(); +// async function main() { +// // let res = await c.connect('ws://101.201.40.124:5006'); +// await c.connect('ws://127.0.0.1:6005'); + +// c.as(root); +// c.setRestrict(true); +// /**************************************/ +// //测试步骤 +// // let nStep = tagStep.active; +// // let nStep = tagStep.gateWay; +// // let nStep = tagStep.escrow; +// // let nStep = tagStep.balances; +// // let nStep = tagStep.getLedger; +// let nStep = tagStep.gateWay; + +// switch (nStep) { +// case tagStep.active: testActive(); break;// 激活若干账户 +// case tagStep.gateWay: testGateWay2(); break;//部署网管,信任,发行币转账 +// case tagStep.escrow: testEscrow(); break; +// case tagStep.balances: testBalances(); break;//账户余额 +// case tagStep.getTxs: testTransactions(); break; +// case tagStep.getLedger: testGetLedger(); break; +// default: break; +// } +// /**************************************/ +// } + +// var testActive = async function () { +// var amount = 20000 +// console.log("----------- active >>>>>>>>>>>>>"); +// let res = await c.pay(issuer.address, amount).submit({ expect: 'validate_success' }) +// console.log(" active issuer", issuer.address, ":", res) +// res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user", user.address, ":", res) +// res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user1", user1.address, ":", res) +// res = await c.pay(user2.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user2", user2.address, ":", res) +// res = await c.pay(user3.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user3", user3.address, ":", res) +// console.log("\n----------- active <<<<<<<<<<<<<"); +// } + + +// var testGateWay2 = async function () { + +// try{ + +// let res; +// console.log("----------- GateWay2 >>>>>>>>>>>>>"); +// var opt = { +// enableRippling: true, +// rate: 1.002, +// min: 1, +// max: 1.5 +// } +// c.as(root); +// res = await c.accountSet(opt).submit({ expect: 'validate_success' }); +// console.log("\n accountSet issuer", root.address, ":", res) +// // +// var amount = { +// value: 30000, +// currency: sCurrency, +// issuer: issuer.address +// } + +// // +// c.as(smUser2); +// res = await c.trustSet(amount).submit({ expect: 'validate_success' }); +// console.log("\n trustSet smUser2", user.address, ":", res) + + +// c.as(root); +// amount.value = 10000; +// res = await c.pay(smUser2.address, amount).submit({ expect: 'validate_success' }) + +// console.log("\n transfer currency(root 2 smUser2)", root.address, smUser2.address, ":", res) + +// console.log("\n----------- GateWay <<<<<<<<<<<<<"); + +// }catch(e){ + +// console.error(e) +// } + + +// } + + +// var testGateWay = async function () { +// let res; +// console.log("----------- GateWay >>>>>>>>>>>>>"); +// var opt = { +// enableRippling: true, +// rate: 1.002, +// min: 1, +// max: 1.5 +// } +// c.as(issuer); +// res = await c.accountSet(opt).submit({ expect: 'validate_success' }); +// console.log("\n accountSet issuer", issuer.address, ":", res) +// // +// var amount = { +// value: 30000, +// currency: sCurrency, +// issuer: issuer.address +// } +// // +// c.as(user); +// res = await c.trustSet(amount).submit({ expect: 'validate_success' }); +// console.log("\n trustSet user", user.address, ":", res) +// c.as(root); +// res = await c.trustSet(amount).submit({ expect: 'validate_success' }); +// console.log("\n trustSet user1", user1.address, ":", res) +// // +// res = await c.api.getTrustlines(issuer.address); +// console.log("\n getTrustlines issuer", issuer.address, ":", res) + + + +// try{ +// c.as(issuer); + +// amount.value = 10; + +// res = await c.pay(root.address, amount).submit({ expect: 'validate_success'}) +// }catch(e){ +// console.error(e) + +// } + + +// console.log("\n transfer currency(issuer 2 user)", issuer.address, user.address, ":", res) +// c.as(user); +// amount.value = 10000; +// res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n transfer currency(user 2 user1)", user.address, user1.address, ":", res) +// console.log("\n----------- GateWay <<<<<<<<<<<<<"); +// } + +// var testEscrow = async function () { +// console.log("----------- Escrow >>>>>>>>>>>>>"); +// let res; +// // var amount = "1000"; +// var amount = 1000; +// var amount = { +// value: 1000, +// currency: sCurrency, +// issuer: issuer.address +// } +// // +// let bCreate = false; +// let bFinish = false; +// let bCancel = true; +// // +// let nSeq = 11; +// if (bCreate) { +// c.as(user); +// var opt = { +// dateFormatTMFinish:"2018-10-26 15:49:00", +// dateFormatTMCancel:"2018-10-26 15:50:00" +// } +// res = await c.escrowCreate(user1.address, amount, opt).submit({ expect: 'validate_success' }); +// console.log("\n escrowCreate :", res) +// let res1 = await c.getTransaction(res.tx_hash); +// console.log("\n txDetail", res.tx_hash, ":", res1,"\nseq:",res1.sequence) +// nSeq = res1.sequence; +// } +// if (bFinish) { +// c.as(user1) +// res = await c.escrowExecute(user.address, nSeq).submit({ expect: 'validate_success' }); +// console.log("\n escrowExecute :", res) +// } +// if (bCancel) { +// c.as(user) +// res = await c.escrowCancel(user.address, nSeq).submit({ expect: 'validate_success' }); +// console.log("\n escrowCancel :", res) +// } +// console.log("\n----------- Escrow <<<<<<<<<<<<<"); +// } + +// var testBalances = async function () { +// let res = await c.api.getBalances(user.address); +// console.log(" ", user.address, "balances:", res); +// //issue coin +// var options = { +// currency: sCurrency +// }; +// res = await c.api.getBalances(user1.address, options); +// if (res.length > 0) { +// console.log(" issue", sCurrency, "coin balance:", res[0]); +// // console.log(" balance:", res[0].value); +// } +// //sys coin +// var options = { +// currency: "ZXC" +// }; +// res = await c.api.getBalances(user1.address, options); +// if (res.length > 0) { +// console.log(" system coin balances:", res[0]); +// // console.log(" balance:", res[0].value); +// } +// } + +// var testTransactions = async function () { +// let res; +// // +// let bAll_one = true; +// let bMore = true; +// // +// if (bAll_one) { +// res = await c.api.getTransactions(root.address); +// console.log(" Txs:", res); +// // +// if (res.length > 0) { +// let id = res[0].id; +// res = await c.api.getTransaction(id); +// console.log(" Tx", id, ":", res); +// } +// } +// // +// if (bMore) { +// let nLimit = 10; +// var options = { +// limit: nLimit +// }; +// while (true) { +// res = await c.api.getTransactions(root.address, options); +// if (res.length > 0) { +// console.log(" Txs:", res); +// } +// if (res.length < 1 || res.length != nLimit) { +// break; +// } +// options.start = res[nLimit - 1].id; +// } +// } +// } + +// var testGetLedger = async function () { +// let llll = await c.api.getLedgerVersion(); +// llll = await c.api.getLedger(); +// c.api.getLedgerVersion().then(function (data) { +// console.log("ledger version:", data); +// }).catch(function (err) { +// console.log("err:", err); +// }); +// var opt = { +// // ledgerVersion: 2005, +// // includeAllData: false, +// // includeTransactions: true, +// // includeState: false +// } +// c.api.getLedger(opt).then(function (data) { +// console.log("ledger:", data); +// }) +// .catch(function (err) { +// console.log("err:", err); +// }); +// } diff --git a/test/ripple-test.js b/test/ripple-test.js new file mode 100644 index 0000000..8cf3aad --- /dev/null +++ b/test/ripple-test.js @@ -0,0 +1,73 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); +const { exit } = require('process'); + +const c = new ChainsqlAPI(); + +var user = { + secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", + address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", + publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" +} + +var ed25519Root = { + secret: "xEdTsZdgjNGe1bJ2VLn22Yyz2wJSzny", + address: "z9UgyKDdJWzzu37U7zKuwTEdWDjXhcNMWo" +} + +var owner = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" + } + +var sm2Root = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + + +var wsAddress = 'ws://192.168.29.69:5003'; + + +describe('ripple', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(sm2Root); + }) + + it('active', async function(){ + var amount = 20000 + let rs = await c.pay(owner.address, amount).submit({expect:'validate_success'}); + assert.equal(rs.status,'validate_success') + }) + + // it('switch active', async function(){ + // var amount = 20000 + // let rs = await c.pay(owner.address, amount).submit({expect:'validate_success'}) + // assert.equal(rs.status,'validate_success') + + // amount = 10000 + // c.as(owner) + // rs = await c.pay(sm2Root.address, amount).submit({expect:'validate_success'}) + // assert.equal(rs.status,'validate_success') + // }) + + // it('create confidential', async function(){ + // var raw = [ + // {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, + // {'field':'name','type':'varchar','length':50,'default':null}, + // {'field':'age','type':'int'} + // ]; + // var option = { + // confidential: true + // }; + + // let rs = await c.createTable(sConfidentialTableName, raw, option).submit({expect:'db_success'}); + // assert.equal(rs.status,'db_success') + // }) + + +}) diff --git a/test/server-test.js b/test/server-test.js new file mode 100644 index 0000000..bb56eb6 --- /dev/null +++ b/test/server-test.js @@ -0,0 +1,138 @@ +'use strict' + + +const co = require('co') +const ChainsqlAPI = require('../src/index'); +const r = new ChainsqlAPI(); +var path = require('path'); +var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); +var common = require(basePath); +var crypto = require('../lib/crypto'); +const keypairs = require('chainsql-keypairs-test'); + + +describe('server', () => { + + it('server', async function(){ + + try { + + // await r.connect('ws://192.168.0.14:6006'); + + // var cipher = crypto.eciesEncrypt("hello","03B7FBF1AC149B0D297B7407CAB9636792333B8D8B8A4036B2D4DE2E6D69D435B5"); + // var keypair = keypairs.deriveKeypair("xxHgHoRAHdGZxy5gWUdMeUK7hWrgr"); + // var plain = crypto.eciesDecrypt(cipher,keypair.privateKey); + // console.log(plain); + + // //字段级加密 + // console.log("multi encrypt test:"); + // var listPublic = ["cBP7JPfSVPgqGfGXVJVw168sJU5HhQfPbvDRZyriyKNeYjYLVL8M", "cBPaLRSCwtsJbz4Rq4K2NvoiDZWJyL2RnfdGv5CQ2UFWqyJ7ekHM"]; + // var cip = yield crypto.encryptText("test",listPublic); + // console.log("cipher:" + cip); + // var text = yield crypto.decryptText(cip,"xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); + // console.log("plain text:" + text); + // var text2 = yield crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); + // console.log("plain text2:" + text2); + + // console.log("AesPadding Test"); + // var aesCipher = crypto.aesEncrypt("abcdefg","hello,world"); + // console.log(aesCipher); + // var aesDecrypted = crypto.aesDecrypt("abcdefg",aesCipher); + // console.log(aesDecrypted); + + // // 创建表 + // let rs = yield r.createTable("abc", [{ + // "field": "id", + // "type": "int", + // "length": 11, + // "PK": 1, + // "NN": 1, + // "UQ": 1, + // "AI": 1 + // }, { + // "field": "name", + // "type": "varchar", + // "length": 46, + // "default": "null" + // }],{confidential:false}) + // .submit(); + // console.log(rs) + + // 删除表 + // let rs = yield r.drop(tb); + + // 重命名 + // let rs = yield r.rename(tb,'users'); + // 授权权限 + // let rs = yield r.assign(tb, 'rETMNdu2UgPhLZzbnDUVRHhB6NEDahj53c', [r.perm.insert],'0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02'); + // console.log(rs) + //取消授权 + // let rs = yield r.assignCancle('users', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ['lsfUpdate']); + // 插入数据 + //let rs = yield r.table(tb).insert({name:'xiaopeng'}).submit(); + // let rs = yield r.table(tb).insert({name:'feipeng1'}).submit(); + //删除数据 + // let rs = yield r.table(tb).get({id:1}).delete().submit(); + // 获取数据 + //let rs = yield r.table(tb).get(['id','name']).submit(); + + // 测试一个条件的情况 + //let rs = yield r.table(tb).get({id:{$ge:1}}).withFields(['id','name']).submit(); + + // // 测试 or 条件 + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'}).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:{$eq:'feipeng1'}}).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get({$or:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + + // 测试 and 条件 + //let rs = yield r.table(tb).get({$and:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get([{id:{$ge:1},name:'feipeng1'}]).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get([{id:{$ge:1},name:{$eq:'feipeng1'}}]).withFields(['id','name']).submit(); + + // 测试 limit + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:1}}).withFields(['id','name']).submit(); + // order by asc + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:1}]}).withFields(['id','name']).submit(); + // order by desc + // let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:-1}]}).withFields(['id','name']).submit(); + + //更新数据 + // let rs = yield r.table(tb).update({name:'xiaopeng'},{id:2}).submit(); + // 获取所有交易 + // let rs = yield r.getTransactions({limit:10,types:['sqlStatement']}); + // + // console.log(rs) + // 事务操作 + /*var raw ='[{"OpType":1,"TableName":"ExampleName","Raw":[{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},{"field":"age","type":"int"}],"$IsExisted":1},{"OpType":2,"TableName":"ExampleName","$IsExisted":0},{"OpType":6,"TableName":"ExampleName","Raw":[{"id":1,"age":1},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":1,"name":"test"}},{"OpType":8,"TableName":"ExampleName","Raw":[{"id":3,"age":2},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":3,"age":2}},{"OpType":9,"TableName":"ExampleName","Raw":[{"id":1,"age":1}],"$RowCount":0,"Cond":{"id":1,"age":1}}]';*/ + /*var raw ='[{"OpType":1,"TableName":"ExampleName","Raw":[{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},{"field":"age","type":"int"}],"$IsExisted":1},{"OpType":6,"TableName":"ExampleName","Raw":[{"id":1,"age":1},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":1,"name":"test"}},{"OpType":8,"TableName":"ExampleName","Raw":[{"id":3,"age":2},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":3,"age":2}},{"OpType":9,"TableName":"ExampleName","Raw":[{"id":1,"age":1}],"$RowCount":0,"Cond":{"id":1,"age":1}}]';*/ + + // var raw = '[{"OpType":1,"Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","TableName":"ExampleName","Raw":[{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},{"field":"age","type":"int"}],"$IsExisted":1},{"OpType":6,"Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","Owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","TableName":"ExampleName","Raw":[{"id":1,"age":1},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":1,"name":"test"}},{"OpType":8,"Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","Owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","TableName":"ExampleName","Raw":[{"id":3,"age":2},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":3,"age":2}},{"OpType":9,"TableName":"ExampleName","Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","Owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Raw":[{"id":1,"age":1}],"$RowCount":0,"Cond":{"id":1,"age":1}}]'; + // console.log(rs) + + // r.beginTran(); + + // r.create('user0144s4000', [{ + // "field": "id", + // "type": "int", + // "length": 11, + // "PK": 1, + // "NN": 1, + // "UQ": 1, + // "AI": 1 + // }, { + // "field": "name", + // "type": "varchar", + // "length": 46, + // "default": "null" + // }],{confidential:true}); + // r.table(tb).insert({id:33,name:'xiaopeng454'}); + // r.table(tb).insert({id:34,name:'feipeng14544'}); + // var data = yield r.commit(); + // console.log('data',data) + } catch (e) { + console.log(e) + } + + }) + +}) diff --git a/test/table-contract-test.js b/test/table-contract-test.js new file mode 100644 index 0000000..6b221e6 --- /dev/null +++ b/test/table-contract-test.js @@ -0,0 +1,197 @@ +"use strict"; + +//const fs = require ('fs'); +//const solc = require('solc'); +const ChainsqlAPI = require("../src/index"); +const c = new ChainsqlAPI(); + +const RootUser = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +}; +const abi = '[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferToUser","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"returnMixType","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newMem","type":"uint256"}],"name":"setMem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"returnString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getMsgSender","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTxOrigin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"userTransferUser","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getMem","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":true,"name":"number","type":"uint256"},{"indexed":false,"name":"result","type":"uint256"}],"name":"multiplylog","type":"event"}]'; +const deployBytecode = "0x6080604052610707806100136000396000f3006080604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635f7807a4146100a6578063645c9ac8146100f45780636606873b1461018b5780636cf43347146101c65780637a6ce2e114610256578063b8077e28146102b4578063c6888fa11461030b578063e8b3891e1461035a578063f05913081461039e578063f8b2cb4f146103c9575b005b6100f2600480360360408110156100bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061042e565b005b34801561010057600080fd5b50610109610479565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014f578082015181840152602081019050610134565b50505050905090810190601f16801561017c5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561019757600080fd5b506101c4600480360360208110156101ae57600080fd5b81019080803590602001909291905050506104c4565b005b3480156101d257600080fd5b506101db6104ce565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561021b578082015181840152602081019050610200565b50505050905090810190601f1680156102485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026257600080fd5b5061026b610531565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b3480156102c057600080fd5b506102c9610542565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031757600080fd5b506103446004803603602081101561032e57600080fd5b810190808035906020019092919050505061054a565b6040518082815260200191505060405180910390f35b61039c6004803603602081101561037057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610667565b005b3480156103aa57600080fd5b506103b36106b1565b6040518082815260200191505060405180910390f35b3480156103d557600080fd5b50610418600480360360208110156103ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106ba565b6040518082815260200191505060405180910390f35b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610474573d6000803e3d6000fd5b505050565b60006060600061029a9050806040805190810160405280601b81526020017f737472696e675465737432666f724d69785479706552657475726e000000000081525092509250509091565b8060008190555050565b60608060405190810160405280602981526020017f737472696e675465737431666f72616c6f6e67537472696e674d6f726574686181526020017f6e33324279746534310000000000000000000000000000000000000000000000815250905090565b600080336006809050915091509091565b600032905090565b60006001821115156105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d75737420696e7075742061206269676765722076616c7565207468616e206f81526020017f6e6500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600783029050827f414b7ab3d46ecc8ab359636c133f9a1b88ffc8c08e9560da2b3ef7949edf8ca33383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a280915050919050565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156106ad573d6000803e3d6000fd5b5050565b60008054905090565b60008173ffffffffffffffffffffffffffffffffffffffff163190509190505600a165627a7a723058206503ab514bf3f130f914693d97643dc702c6a46fa16526d2b59a62642b85e82d0029"; +const contractAddr = "zcdFPChLUNYXQTV6zr2osrWG8pV7Zyh8FL"; + + +var wsAddress = 'ws://192.168.29.136:6005'; + + +describe('smart-contract', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(RootUser); + }) + + it('deployContract', async function(){ + + + }) + +}) + + + + +// main(); + +// async function main(){ +// try { +// await c.connect(wsAddress); +// console.log("connected successfully"); + +// c.as(RootUser); +// // let contractCode = fs.readFileSync("./solidity-example/solidity-example.sol"); +// // let compileResult = solc.compile(contractCode.toString(), 1); +// // for (var contractName in compileResult.contracts) { +// // // code and ABI that are needed by web3 +// // console.log(contractName + ': ' + compileResult.contracts[contractName].bytecode); +// // deployBytecode = "0x" + compileResult.contracts[contractName].bytecode; +// // console.log(contractName + ': ' + compileResult.contracts[contractName].interface); +// // abi = compileResult.contracts[contractName].interface; +// // } + +// // deployContractAwait(); +// deployContract(); + +// // callContract(); +// } catch (error) { +// console.log(error); +// } +// } + +// function callContract(){ +// const myContract = chainsql.contract(JSON.parse(abi), contractAddr); +// /*use contract call way*/ +// // contractCall(myContract); + +// /*methods.events.eventlog*/ +// // contractEvent(myContract); + +// /*use contract submit way*/ +// contractSubmit(myContract); + +// // callContractWithMsgValue(myContract); + +// /*get function encodeABI*/ +// // getFuncEncodeABI(myContract); + +// /*methods.function.auto*/ +// // contractAuto(myContract); +// } + +// function contractSubmit(myContract){ +// /*methods.function.submit*/ +// chainsql.payToContract(contractAddr, 2000, 30000000).submit({ +// expect: "validate_success" +// }).then(data => { +// console.log(data); +// }).catch(err => { +// console.log(err); +// }); +// // Promise +// // myContract.methods.transferToUser("zLtH4NFSqDFioq5zifriKKLf8xcyyw7VCf", 12000000).submit({ +// // Gas: 30000000, +// // ContractValue : "20000000", +// // expect: "validate_success" +// // }).then(data => { +// // console.log(data); +// // }).catch(err => { +// // console.log(err); +// // }); + +// //callback +// // myContract.methods.userTransferUser("zPif8u9YqL8NhHxXGHKxopAaFMZ3rwHF6s").submit({ +// // Gas: 30000000, +// // ContractValue: "12000000", +// // expect: "validate_success" +// // }, function (err, res) { +// // err ? console.log(err) : console.log(res); +// // }); +// } + +// function contractEvent(myContract){ +// myContract.events.multiplylog((err, res) => { +// err ? console.log(err) : console.log(res); +// }); +// } + +// function callContractWithMsgValue(contractObj){ +// contractObj.methods.userTransferUser("zU8gAWTXZgLmaF1XVR8briCdnWXJsT8njM").submit({ +// Gas: 500000, +// ContractValue: "111111", +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(err) : console.log(res); +// }); +// } + +// function contractCall(contractObj){ +// /*methods.function.call*/ +// contractObj.methods.getMsgSender().call(function (err, res) { +// err ? console.log(err) : console.log(res); +// }); +// } + +// function getFuncEncodeABI(contractObj){ +// /*methods.function.encodeABI*/ +// let funInputData = contractObj.methods.setMem(16).encodeABI(); +// console.log(funInputData); +// } + +// function deployContract(){ +// const myContract = chainsql.contract(JSON.parse(abi)); +// // Promise +// // myContract.deploy({ +// // ContractData : deployBytecode, +// // arguments : [666] +// // }).submit({ +// // ContractValue : "10000000", +// // Gas : 400000 +// // }).then(data => { +// // console.log(data); +// // }).catch(err => { +// // console.log(err); +// // }); + +// // callback +// myContract.deploy({ +// ContractData : deployBytecode, +// arguments : [666] +// }).submit({ +// ContractValue : "10000000", +// Gas : 400000 +// }, function (err, res) { +// err ? console.log(err) : console.log(res); + +// /* you can call contract function directly here!*/ +// // myContract.methods.setMem(16).submit({ +// // Gas: 500000 +// // }, (err, res) => { +// // err ? console.log(err) : console.log(res); +// // }); +// }); +// } + +// async function deployContractAwait(){ +// const myContract = chainsql.contract(JSON.parse(abi)); +// try { +// let deployRes = await myContract.deploy({ +// ContractData : deployBytecode, +// arguments : [666] +// }).submit({ +// ContractValue : "10000000", +// Gas : 400000 +// }); + +// console.log(deployRes); +// myContract.methods.setMem(16).submit({ +// Gas:500000 +// }, (err, res) => { +// err ? console.log(err) : console.log(res); +// }); +// } catch (error) { +// console.log(error); +// } +// } \ No newline at end of file diff --git a/test/table-test.js b/test/table-test.js new file mode 100644 index 0000000..0b58903 --- /dev/null +++ b/test/table-test.js @@ -0,0 +1,192 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); +const { exit } = require('process'); + +const c = new ChainsqlAPI(); + +var user = { + secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", + address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", + publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" +} + +var ed25519Root = { + secret: "xEdTsZdgjNGe1bJ2VLn22Yyz2wJSzny", + address: "z9UgyKDdJWzzu37U7zKuwTEdWDjXhcNMWo" +} + +var owner = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" + } + +var sm2Root = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + + +var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; + +var sTableName = "n1"; +var sConfidentialTableName = "table_jm2"; +var sOperRuleTableName = "table_hjkz"; + +var wsAddress = 'ws://192.168.29.69:5003'; + + +var raw = [ + {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, + {'field':'name','type':'varchar','length':50,'default':null}, + {'field':'age','type':'int'} +]; + + +describe('table', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(sm2Root); + }) + + it('create table', async function(){ + + var option = { + confidential: false + }; + let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + + it('insert', async function(){ + var insertRaw = [ + {'id':11,'age': 333,'name':'hello'}, + {'id':22,'age': 444,'name':'sss'}, + {'id':33,'age': 555,'name':'rrr'} + ]; + var rs = await c.table(sTableName).insert(insertRaw).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + it('update', async function(){ + var rs = await c.table(sTableName).get({'id': 2}).update({'age':200}).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + + it('test grant', async function(){ + + var flag = { insert: true, update: true } + let rs = await c.grant(sTableName, smUser.address, flag,smUser.publicKey).submit({ expect: 'db_success' }); + assert.equal(rs.status,'db_success') + }) + + it('test insert after grant', async function(){ + + c.as(smUser); + c.use(sm2Root.address); + var raw = [ + {'id':34,'age': 333,'name':'hello'}, + {'id':35,'age': 444,'name':'sss'}, + {'id':36,'age': 555,'name':'rrr'} + ] + var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + it('delete', async function(){ + // 切换回原来的账户 + c.as(sm2Root); + var rs = await c.table(sTableName).get({'id': 3}).delete().submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + it('drop', async function(){ + + // 切换回原来的账户 + c.as(sm2Root); + var rs =await c.dropTable(sTableName).submit({ expect: 'db_success' }); + assert.equal(rs.status,'db_success') + }) + + + // it('create confidential', async function(){ + // var raw = [ + // {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, + // {'field':'name','type':'varchar','length':50,'default':null}, + // {'field':'age','type':'int'} + // ]; + // var option = { + // confidential: true + // }; + + // let rs = await c.createTable(sConfidentialTableName, raw, option).submit({expect:'db_success'}); + // assert.equal(rs.status,'db_success') + // }) + + // it('create operationRule', async function(){ + + // var raw = [ + // {'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1}, + // {'field':'name','type':'varchar','length':50,'default':null}, + // {'field':'age','type':'int'}, + // {'field':'account','type':'varchar','length':64} + // ] + // var rule = { + // 'Insert':{ + // 'Condition':{'account':'$account'}, + // 'Count':{'AccountField':'account','CountLimit':5}, + // }, + // 'Update':{ + // 'Condition':{'$or':[{'age':{'$le':28}},{'id':2}]}, + // 'Fields':['age'] + // }, + // 'Delete':{ + // 'Condition':{'$and':[{'age':'$lt18'},{'account':'$account'}]} + // }, + // 'Get':{ + // 'Condition':{'id':{'$ge':3}} + // } + // }; + // var option = { + // confidential: false, + // operationRule: rule + // } + // // 创建 行级控制表 + // let rs = await c.createTable(sOperRuleTableName, raw, option).submit({expect:'db_success'}); + // assert.equal(rs.status,'db_success') + + // }) + + +// it('test operationRule', async function(){ + +// var insertRaw = [ +// {'id':1,'age': 333,'name':'hello'}, +// {'id':2,'age': 444,'name':'sss'}, +// {'id':3,'age': 555,'name':'rrr'}, +// {'id':4,'age': 333,'name':'hello'}, +// {'id':5,'age': 444,'name':'sss'}, +// {'id':6,'age': 555,'name':'rrr'}, +// ]; + +// // 如果我想这一条必须失败的处理写法? +// var rs = await c.table(sOperRuleTableName).insert(insertRaw).submit({expect:'db_success'}); +// assert.equal(rs.status,'db_success') + +// }) + + + + + +}) From 7f3e35bedeabd32d421a28b9c160fb0e27f66fab Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 27 Oct 2020 19:13:46 +0800 Subject: [PATCH 11/80] upgrade version to 0.70.1(Overwrite wrong version 0.70.0) --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2f14cda..06d2532 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql-test", - "version": "0.6.70", + "name": "chainsql", + "version": "0.70.1", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -8,7 +8,7 @@ }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.11", + "chainsql-keypairs": "^0.10.16", "chainsql-lib": "^0.17.44", "co": "^4.6.0", "elliptic": "^5.1.0", From 038ce9b6b7502c0cde1c537bc2187c3f7140db13 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 4 Jan 2021 11:50:47 +0800 Subject: [PATCH 12/80] add add,del,modify,get interface of schema --- src/index.js | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 219 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index e91421b..19eccfc 100644 --- a/src/index.js +++ b/src/index.js @@ -19,6 +19,7 @@ const Connection = require('./connect'); const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); +const { utils } = require('elliptic'); const opType = require('../lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; @@ -42,7 +43,10 @@ class ChainsqlAPI extends Submit { select: 'lsfSelect', execute: 'lsfExecute' }; - this.transaction = false; + this.transaction = false; + this.schemaCreateTx = false; + this.schemaModifyTx = false; + this.cache = []; this.strictMode = false; this.needVerify = 1; @@ -1007,7 +1011,38 @@ ChainsqlAPI.prototype.verify = function (messageHex, signature, publicKey) { ChainsqlAPI.prototype.prepareJson = function(){ let that = this; return new Promise((resolve, reject) => { - if (that.payment.opType === opType['t_grant']) { + + if(that.schemaCreateTx || that.schemaModifyTx){ + var payment = that.payment; + that.api.prepareTx(payment).then(function (data) { + + var txJson = JSON.parse(data.txJSON); + var dropsPerByte = Math.ceil(1000000.0 / 1024); + that.api.getServerInfo().then(res => { + + if(res.validatedLedger.dropsPerByte != undefined){ + dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); + } + + txJson.Fee = util.calcFee(txJson,dropsPerByte); + data.txJSON = txJson; + that.schemaCreateTx = false; + that.schemaModifyTx = false; + resolve(data) + }).catch(err => { + that.schemaCreateTx = false; + that.schemaModifyTx = false; + reject(error) + }); + + }).catch(function (error) { + that.schemaCreateTx = false; + that.schemaModifyTx = false; + reject(error) + }); + + } + else if (that.payment.opType === opType['t_grant']) { handleGrantPayment(that).then(() => { that.api.prepareTable(that, that.payment, resolve, reject); }).catch(error => { @@ -1024,9 +1059,190 @@ ChainsqlAPI.prototype.prepareJson = function(){ * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; */ ChainsqlAPI.prototype.setSchema = function(schemaID){ - this.connect.setSchema(schemaID); + var connection = this.api ? this.api.connection : this.connect.api.connection; + if(connection._schema_id === undefined ){ + throw new Error("The current version does not support setSchema"); + } + connection._schema_id = schemaID; } +ChainsqlAPI.prototype.getSchemaList = function(options){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'schema_list'; + + if(options !== undefined && options.account !== undefined){ + params.account = options.account; + } + + if(options !== undefined && options.running !== undefined){ + params.running = options.running; + } + + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + +ChainsqlAPI.prototype.getSchemaInfo = function(schemaID){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + connection.request({ + command: 'schema_info', + schema:schemaID + }).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + + +ChainsqlAPI.prototype.createSchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaName !== undefined) && (schemaInfo.WithState !== undefined) && + (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && + (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + + if(!bValid){ + throw new Error("Invalid schemaInfo parameter"); + } + + // 继承自主链的状态 + // 锚定区块的hash值 + + var peerlists = [] + var i = 0; + var len = schemaInfo.PeerList.length + for(; i < len; i++) { + var hexPeer = convertStringToHex(schemaInfo.PeerList[i].Peer.Endpoint) + + var item = { + Peer:{ + Endpoint:hexPeer + } + } + peerlists.push(item) + } + + this.schemaCreateTx = true; + + var schemaCreateTxJson = { + Account: this.connect.address, + SchemaName:convertStringToHex(schemaInfo.SchemaName), + SchemaStrategy: schemaInfo.WithState? 2:1, + SchemaAdmin: this.connect.address, + Validators: schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaCreate' + }; + + + if(schemaCreateTxJson.SchemaStrategy === 2 ){ + + if(schemaInfo.AnchorLedgerHash === undefined ){ + throw new Error("Missing field AnchorLedgerHash"); + } + schemaCreateTxJson.AnchorLedgerHash = schemaInfo.AnchorLedgerHash; + } + + this.payment = schemaCreateTxJson; + return this; + +}; + + +ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaID !== undefined) && (schemaInfo.ModifyType !== undefined) && + (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && + (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + + if(!bValid){ + throw new Error("Invalid modifySchema parameter"); + } + + // var validators = [] + // var i = 0 + // var len = schemaInfo.Validators.length + + // for(; i < len; i++) { + // var hexValidator = convertStringToHex(schemaInfo.Validators[i].Validator.PublicKey) + + // var item = { + // Validator:{ + // PublicKey:hexValidator + // } + // } + // validators.push(item) + // } + + var peerlists = [] + var i = 0; + var len = schemaInfo.PeerList.length + for(; i < len; i++) { + var hexPeer = convertStringToHex(schemaInfo.PeerList[i].Peer.Endpoint) + + var item = { + Peer:{ + Endpoint:hexPeer + } + } + peerlists.push(item) + } + + var opType = 1; + if(schemaInfo.ModifyType === "schema_del"){ + opType = 2 + }else if(schemaInfo.ModifyType === "schema_add"){ + opType = 1 + }else{ + throw new Error("Invalid schemaInfo.ModifyType"); + } + + var schemaModifyTxJson = { + Account: this.connect.address, + SchemaID: schemaInfo.SchemaID, + OpType: opType, + Validators:schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaModify' + }; + + // 修改子链 + this.schemaModifyTx = true; + + // let payment = { + // Account: that.connect.address, + // SchemaID:"595FC1AA0C73D735C3362A0E9976A64E024C86976E08C02D299DB344CF674650", + // OpType: 1, + // Validators:[ + // { + // Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1A"} + // } + // ], + // PeerList:[ + // { + // Peer:{ Endpoint:convertStringToHex("192.168.29.116:7017") } + // } + + // ], + // TransactionType: 'SchemaModify' + // }; + + this.payment = schemaModifyTxJson; + return this; + +}; + + + function callback(data, callback) { } From 64873761dbb0e45e63da40b0330ae1a87a201e43 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 8 Jan 2021 10:56:19 +0800 Subject: [PATCH 13/80] add unit test code of schema --- test/test.js | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/test/test.js b/test/test.js index 42f054c..ee1e9ec 100644 --- a/test/test.js +++ b/test/test.js @@ -34,7 +34,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:6005'); + await c.connect('ws://127.0.0.1:8017'); //await c.connect('ws://101.201.40.124:5006'); console.log('连接成功'); @@ -140,10 +140,10 @@ async function testAccount(){ } async function testChainsql(){ - // await testCreateTable(); + //await testCreateTable(); // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); + // await testCreateTable1(); // await testInsert(); // await testUpdate(); // await testDelete(); @@ -161,8 +161,46 @@ async function testChainsql(){ //现在底层不允许直接删除所有记录这种操作了 // await testDeleteAll(); + + // + await testSchema(); } +//创建一个加密的表,table为要创建的表,confidential为是否要加密 +var testSchema = async function() { + + try{ + + // 不继承状态 + let schemaInfo = { + SchemaName:"hello", + WithState:false, + SchemaAdmin:user.address, + Validators:[ + { + Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1B"} + } + ], + PeerList:[ + { + Peer:{ Endpoint:"192.168.29.108:5125"} + } + ] + } + + let ret = await c.createSchema(schemaInfo).submit({expect:'validate_success'}) + //assert.strictEqual(ret.status,'validate_success') + // 继承状态 + + console.log("test CreateSchema" , ret) + + + }catch(e){ + console.error(e) + } + +}; + function subTable(tb, owner) { var event = c.event; event.subscribeTable(owner,tb,function(err, data) { From 0285adbe7f0d6abe7fcdd1cee680d2f671cff16a Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 8 Jan 2021 18:49:00 +0800 Subject: [PATCH 14/80] 1 add `LONGTEXT` data type supported 2 overwrite getTransaction 3 add `tableSet` to reduce the interaction time with chainsql nodes 4 add unit test code of `tableSet` and `getTransaction` --- lib/validate.js | 1 + src/index.js | 6 ++-- src/submit.js | 4 +-- src/table.js | 88 ++++++++++++++++++++++++++++++++++----------- src/tablePayment.js | 36 +++++++++++-------- test/test.js | 69 ++++++++++++++++++++++++++--------- 6 files changed, 147 insertions(+), 57 deletions(-) diff --git a/lib/validate.js b/lib/validate.js index 0353fa8..bd85b09 100644 --- a/lib/validate.js +++ b/lib/validate.js @@ -37,6 +37,7 @@ function create(name,obj) { case "text": case "datetime": case "date": + case "longtext": break; case "varchar": case "char": diff --git a/src/index.js b/src/index.js index ba32a54..a5bfa7a 100644 --- a/src/index.js +++ b/src/index.js @@ -507,11 +507,11 @@ ChainsqlAPI.prototype.getAccountTransactions = function (address, opts, cb) { } }; -ChainsqlAPI.prototype.getTransaction = function (hash, cb) { +ChainsqlAPI.prototype.getTransaction = function (hash,meta,meta_chain,cb) { if ((typeof cb) != 'function') { - return this.api.getTransaction(hash); + return this.api.getTransaction(hash,meta,meta_chain); } else { - this.api.getTransaction(hash).then(function (data) { + this.api.getTransaction(hash,meta,meta_chain).then(function (data) { cb(null, data); }).catch(function (err) { cb(err); diff --git a/src/submit.js b/src/submit.js index 46cc813..3969baf 100644 --- a/src/submit.js +++ b/src/submit.js @@ -18,8 +18,8 @@ Submit.prototype.submit = function (expectOpt) { let self = this; return new Promise(function (resolve, reject) { try { - self.prepareJson().then(function (prepared) { - self.txJSON = prepared.txJSON; + self.prepareJson().then(function (preparedJson) { + self.txJSON = preparedJson; self.setCert(); let signedRet = self.signTx(); self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); diff --git a/src/table.js b/src/table.js index 089152e..6d14d4f 100644 --- a/src/table.js +++ b/src/table.js @@ -19,7 +19,9 @@ class Table extends Submit { this.exec = ''; this.field = null; this.connect = ChainsqlAPI.connect; - this.cache = []; + this.cache = []; + this.nameInDB = ''; + this.confidential = true; } submit (cb) { @@ -166,6 +168,18 @@ Table.prototype.assert = function(json) { return this; } +Table.prototype.tableSet = function(json) { + + if(json.nameInDB !== undefined){ + this.nameInDB = json.nameInDB; + } + + if(json.confidential !== undefined){ + this.confidential = json.confidential; + } + return this; +} + function hasLimit(item) { for (var key in item) { if (key === '$limit') { @@ -392,7 +406,8 @@ Table.prototype.prepareJson = function() { strictMode: that.strictMode, tables: [{ Table: { - TableName: convertStringToHex(that.tab), + TableName: convertStringToHex(that.tab), + NameInDB: that.nameInDB } }], tsType: 'SQLStatement' @@ -405,30 +420,61 @@ Table.prototype.prepareJson = function() { prepareTable(that, payment, resolve, reject); }); } -function prepareTable(ChainSQL, payment, resolve, reject) { - var connect = ChainSQL.connect; - getUserToken(connect.api.connection, connect.scope, connect.address, ChainSQL.tab).then(function (token) { - token = token[ChainSQL.connect.scope + ChainSQL.tab]; - if (token && token != '') { - var secret = decodeToken(ChainSQL, token); - var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ - - let algType = "aes"; - if(ChainSQL.connect.secret === "gmAlg"){ - algType = "gmAlg"; - }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ - algType = "softGMAlg"; + + +function tryEncryptRaw(ChainSQL, payment) { + + var that = ChainSQL; + var raw = payment.raw; + return new Promise(function (resolve, reject) { + + if(! that.confidential){ + resolve( convertStringToHex(raw) ); + return ; + } + + // confidential table + + var connect = that.connect; + getUserToken(connect.api.connection, connect.scope, connect.address, that.tab).then(function (token) { + token = token[that.connect.scope + that.tab]; + + var ciperRaw; + if (token && token != '') { + var secret = decodeToken(that, token); + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(that.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(that.connect.secret)){ + algType = "softGMAlg"; + } + ciperRaw = crypto.symEncrypt(secret, raw, algType).toUpperCase(); + } else { + ciperRaw = convertStringToHex(raw); } - payment.raw = crypto.symEncrypt(secret, payment.raw, algType).toUpperCase(); - } else { - payment.raw = convertStringToHex(payment.raw); - } - - connect.api.prepareTable(connect, payment, resolve, reject); + + resolve(ciperRaw); + }).catch(function(error) { + reject(error); + }); + + }); +} + + +function prepareTable(ChainSQL, payment, resolve, reject) { + + var connect = ChainSQL.connect; + tryEncryptRaw(ChainSQL,payment).then(function (raw) { + payment.raw = raw; + connect.api.prepareTable(connect, payment, resolve, reject); }).catch(function(error) { reject(error); }); + } function handleGetRecord(ChainSQL, object, resolve, reject) { diff --git a/src/tablePayment.js b/src/tablePayment.js index 39d7780..95038ec 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -82,33 +82,39 @@ function prepareTablePayment(payment, chainsqlApi) { function prepareTable(ChainSQL, payment, resolve, reject) { prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { - // console.log(tx_json); - getTxJson(ChainSQL, JSON.parse(tx_json.txJSON)).then(function (data) { - + var dropsPerByte = Math.ceil(1000000.0 / 1024);; ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ - dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); } - - data.tx_json.Fee = calcFee(data.tx_json,dropsPerByte); - data.txJSON = data.tx_json; - delete data.tx_json; - resolve(data); + + // 1 calculate fee + var txJson = JSON.parse(tx_json.txJSON); + txJson.Fee = calcFee(txJson,dropsPerByte); + + if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ + resolve(txJson); + return ; + } + + // 2 get table's NameInDB + getTxJson(ChainSQL, txJson).then(function (data) { + resolve(data.tx_json); + }).catch(function (error) { + reject(error); + }); }).catch(err => { reject(err); }); + }).catch(err => { + reject(err); + }); + - }).catch(function (error) { - reject(error); - }); - }).catch(function (error) { - reject(error); - }); } module.exports = prepareTable; \ No newline at end of file diff --git a/test/test.js b/test/test.js index 42f054c..75b13e8 100644 --- a/test/test.js +++ b/test/test.js @@ -25,7 +25,7 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "fasefa"; +var sTableName = "test666"; var sTableName2 = "b1"; var sReName = "boy1234"; var sTableName3 = "hijack12"; @@ -34,7 +34,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:6005'); + await c.connect('ws://127.0.0.1:6006'); //await c.connect('ws://101.201.40.124:5006'); console.log('连接成功'); @@ -50,7 +50,7 @@ async function main(){ //await testSubscribe(); - // await testRippleAPI(); + //await testRippleAPI(); // await testAccount(); await testChainsql(); @@ -61,6 +61,23 @@ async function main(){ } } +async function testGetTransaction(){ + + var txHash = 'DC9782AFF31D495108FFB751E9B32C2DEFBCC7A3846CB1D8CB0E789F1CCC93E8'; + + let rs = await c.getTransaction(txHash); + console.log( "meta:false ; meta_chain true " , JSON.stringify( rs ) ) ; + + rs = await c.getTransaction(txHash,true); + console.log( "meta:true ; meta_chain true " , JSON.stringify( rs ) ) ; + + rs = await c.getTransaction(txHash,false,false); + console.log( "meta:false ; meta_chain false " ,JSON.stringify( rs ) ) ; +} + + + + var testSubscribe = async function(){ subTable(sTableName,owner.address); setTimeout(function(){ @@ -99,6 +116,7 @@ async function subTx() { },5000); }); } + function testSubscribeTx(hash){ var event = c.event; event.subscribeTx(hash,function(err, data) { @@ -126,8 +144,8 @@ async function testRippleAPI(){ // await testGetLedgerVersion(); // await testGetLedger(); - await testGetAccountTransactions(); - // await testGetTransaction(); +// await testGetAccountTransactions(); + await testGetTransaction(); // await testGetServerInfo(); // await testUnlList(); // await testEscrow(); @@ -139,11 +157,34 @@ async function testAccount(){ await activateAccount(account.address); } + + +async function testTableSet(){ + + var raw = [ + {'id':12345,'age': 333,'name':'hello'} + ]; + try { + + var nameInDB = await c.getTableNameInDB(owner.address,sTableName); + var tableProperty = {}; + tableProperty.nameInDB = nameInDB; + tableProperty.confidential = false; + + var rs = await c.table(sTableName).tableSet(tableProperty).insert(raw).submit({expect:'db_success'}); + console.log("testInsert",rs); + } catch (error) { + console.error(error); + } +} + async function testChainsql(){ + + // await testCreateTable(); - // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); + // 创建另一张表,用来测试rename,drop + // await testCreateTable1(); // await testInsert(); // await testUpdate(); // await testDelete(); @@ -161,6 +202,8 @@ async function testChainsql(){ //现在底层不允许直接删除所有记录这种操作了 // await testDeleteAll(); + + await testTableSet(); } function subTable(tb, owner) { @@ -191,7 +234,8 @@ var testCreateTable = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1}, {'field':'name','type':'varchar','length':50,'default':""}, - {'field':'age','type':'int'} + {'field':'age','type':'int'}, + {'field':'age1','type':'longtext'} ] var option = { confidential: false @@ -219,7 +263,7 @@ var testCreateTable1 = async function() { } }; -//重复插入的情况下报异常 +//重复插入的情况下报异常 var testInsert = async function() { var raw = [ {'id':1,'age': 333,'name':'hello'}, @@ -400,14 +444,7 @@ async function testGetAccountTransactions(){ // var rs = await callback2Promise(c.getTransactions,opt); // console.log(rs); } -async function testGetTransaction(){ - // let rs = await c.getTransaction('3E02AA296A348F10C1F54D2EF0CBBDA9A6D389F66EFFBA936F1842506FACD4EA'); - // console.log(rs); - c.getTransaction('B4FB648883D73D4EB2D3A9E6059F1D0CF97105445F06B763A9DAB9FA66AA2EFC',callback); - // var rs = await callback2Promise(c.api.getTransaction,opt); - // console.log(rs); -} async function testGetServerInfo(){ // let rs = await c.getServerInfo(); // console.log(rs); From 2427af4e67832c897bc1ef94a2e677b32664def5 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 19 Jan 2021 17:34:28 +0800 Subject: [PATCH 15/80] delete extra comment --- src/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index 19eccfc..379f6df 100644 --- a/src/index.js +++ b/src/index.js @@ -1109,14 +1109,12 @@ ChainsqlAPI.prototype.createSchema = function(schemaInfo){ let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaName !== undefined) && (schemaInfo.WithState !== undefined) && (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + if(!bValid){ throw new Error("Invalid schemaInfo parameter"); - } - - // 继承自主链的状态 - // 锚定区块的hash值 - + } + var peerlists = [] var i = 0; var len = schemaInfo.PeerList.length From d03d6598c47750082929241f309e9250b051f67b Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 19 Jan 2021 18:06:55 +0800 Subject: [PATCH 16/80] update version to 1.0.0 --- lib/error.js | 2 +- lib/util.js | 2 +- package.json | 4 ++-- src/index.js | 2 +- src/ripple.js | 2 +- src/smartContract.js | 2 +- src/submit.js | 2 +- src/tablePayment.js | 2 +- src/txPayment.js | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/error.js b/lib/error.js index cd1ae33..32fdb44 100644 --- a/lib/error.js +++ b/lib/error.js @@ -1,6 +1,6 @@ "use strict"; -const chainsqldError = require('chainsql-lib-test').ChainsqlLibCommon.errors.ChainsqldError; +const chainsqldError = require('chainsql-lib').ChainsqlLibCommon.errors.ChainsqldError; function chainsqlError( errMsg ) { let errName = "apiGeneralErr"; diff --git a/lib/util.js b/lib/util.js index 3b6d65e..abb0861 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,6 +1,6 @@ 'use strict'; const path = require('path'); -const common = require('chainsql-lib-test').ChainsqlLibCommon; +const common = require('chainsql-lib').ChainsqlLibCommon; const keypairs = require('chainsql-keypairs-test'); const cryptoo = require('crypto'); const crypto = require('./crypto'); diff --git a/package.json b/package.json index 1453622..f5bdff7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "0.6.71", + "version": "1.0.0", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -9,7 +9,7 @@ "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs-test": "^0.10.16", - "chainsql-lib-test": "^0.17.52", + "chainsql-lib": "~1.0.0", "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", diff --git a/src/index.js b/src/index.js index 3fbc92f..b4cf70c 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ const keypairs = require('chainsql-keypairs-test'); const EventManager = require('./eventManager') const _ = require('lodash'); -const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); const chainsqlError = require('../lib/error'); diff --git a/src/ripple.js b/src/ripple.js index 9030a08..7fef145 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -2,7 +2,7 @@ var util = require('../lib/util'); var Submit = require('./submit'); const FloatOperation = require('../lib/floatOperation'); -var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { diff --git a/src/smartContract.js b/src/smartContract.js index 0ec476e..862acaa 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -3,7 +3,7 @@ var util = require('../lib/util'); const _ = require('lodash'); -var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; const keypairs = require('chainsql-keypairs-test'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); diff --git a/src/submit.js b/src/submit.js index d82d47f..9f45797 100644 --- a/src/submit.js +++ b/src/submit.js @@ -1,6 +1,6 @@ 'use strict' var util = require('../lib/util'); -const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Connection = require('./connect'); class Submit { diff --git a/src/tablePayment.js b/src/tablePayment.js index 44e1dc1..f021d62 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -4,7 +4,7 @@ var _ = require('lodash'); const path = require('path'); const getTxJson = require('../lib/util').getTxJson; const calcFee = require('../lib/util').calcFee; -var utils = require('chainsql-lib-test').ChainsqlLibUtil; +var utils = require('chainsql-lib').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; diff --git a/src/txPayment.js b/src/txPayment.js index 8eb7343..09c4951 100644 --- a/src/txPayment.js +++ b/src/txPayment.js @@ -2,7 +2,7 @@ var _ = require('lodash'); const path = require('path'); -var utils = require('chainsql-lib-test').ChainsqlLibUtil; +var utils = require('chainsql-lib').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; From 3eec9027593d9ea6c93a99841b4acec8d9ea36c7 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 25 Jan 2021 13:39:33 +0800 Subject: [PATCH 17/80] fix bug RR-2777(set the parameter SchemaAdmin of schemaCreate) --- src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index b4cf70c..6281969 100644 --- a/src/index.js +++ b/src/index.js @@ -1156,12 +1156,14 @@ ChainsqlAPI.prototype.createSchema = function(schemaInfo){ Account: this.connect.address, SchemaName:convertStringToHex(schemaInfo.SchemaName), SchemaStrategy: schemaInfo.WithState? 2:1, - SchemaAdmin: this.connect.address, Validators: schemaInfo.Validators, PeerList:peerlists, TransactionType: 'SchemaCreate' }; + if(schemaInfo.SchemaAdmin !== undefined){ + schemaCreateTxJson.SchemaAdmin = schemaInfo.SchemaAdmin; + } if(schemaCreateTxJson.SchemaStrategy === 2 ){ From 185739bc3c03877ca0f9016d2b3783c42cfde9c6 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 25 Jan 2021 13:39:33 +0800 Subject: [PATCH 18/80] fix bug RR-2777(set the parameter SchemaAdmin of schemaCreate) --- src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 3fbc92f..47503af 100644 --- a/src/index.js +++ b/src/index.js @@ -1156,12 +1156,14 @@ ChainsqlAPI.prototype.createSchema = function(schemaInfo){ Account: this.connect.address, SchemaName:convertStringToHex(schemaInfo.SchemaName), SchemaStrategy: schemaInfo.WithState? 2:1, - SchemaAdmin: this.connect.address, Validators: schemaInfo.Validators, PeerList:peerlists, TransactionType: 'SchemaCreate' }; + if(schemaInfo.SchemaAdmin !== undefined){ + schemaCreateTxJson.SchemaAdmin = schemaInfo.SchemaAdmin; + } if(schemaCreateTxJson.SchemaStrategy === 2 ){ From 061fe9d6f942ea5c159f02cf956749608f3b6152 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 25 Jan 2021 13:47:30 +0800 Subject: [PATCH 19/80] update version to 1.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f5bdff7..a7d13ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.0", + "version": "1.0.1", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 8feb9282cbdae1b9850c0447fa9cd5204fe9ece8 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Thu, 28 Jan 2021 10:14:58 +0800 Subject: [PATCH 20/80] fix bug in function prepareJson --- src/submit.js | 2 +- src/tablePayment.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/submit.js b/src/submit.js index 3969baf..c9c7b13 100644 --- a/src/submit.js +++ b/src/submit.js @@ -19,7 +19,7 @@ Submit.prototype.submit = function (expectOpt) { return new Promise(function (resolve, reject) { try { self.prepareJson().then(function (preparedJson) { - self.txJSON = preparedJson; + self.txJSON = preparedJson.txJSON; self.setCert(); let signedRet = self.signTx(); self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); diff --git a/src/tablePayment.js b/src/tablePayment.js index 95038ec..810208d 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -94,14 +94,14 @@ function prepareTable(ChainSQL, payment, resolve, reject) { var txJson = JSON.parse(tx_json.txJSON); txJson.Fee = calcFee(txJson,dropsPerByte); - if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ - resolve(txJson); + if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== undefined ){ + resolve({txJSON:txJson}); return ; } // 2 get table's NameInDB getTxJson(ChainSQL, txJson).then(function (data) { - resolve(data.tx_json); + resolve({txJSON:data.tx_json}); }).catch(function (error) { reject(error); }); From e27eca38ef817115502eecb82dab8d8f327bd89a Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 23 Oct 2020 15:34:12 +0800 Subject: [PATCH 21/80] add schemaID parameter to the connection interface with the chainsql node --- solidity-example/solidity-TableTxs.sol | 9 ++++----- src/connect.js | 4 ++++ src/eventManager.js | 9 ++++++++- src/index.js | 8 ++++++++ src/ripple.js | 7 +++++++ src/submit.js | 2 -- src/tablePayment.js | 12 ++++++++++++ 7 files changed, 43 insertions(+), 8 deletions(-) diff --git a/solidity-example/solidity-TableTxs.sol b/solidity-example/solidity-TableTxs.sol index 506aebb..3bdc20e 100644 --- a/solidity-example/solidity-TableTxs.sol +++ b/solidity-example/solidity-TableTxs.sol @@ -85,12 +85,11 @@ contract DBTest { return msg.sender.grant(toWho, tableName, raw); } - function sqlTransaction(string tableName) public{ + function sqlTransaction(address owner,string tableName) public{ db.beginTrans(); - msg.sender.create(tableName, "[{\"field\":\"id\", \"type\" : \"int\", \"length\" : 11, \"PK\" : 1, \"NN\" : 1, \"UQ\" : 1}, { \"field\":\"account\", \"type\" : \"varchar\" }, { \"field\":\"age\", \"type\" : \"int\" }]"); - msg.sender.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); - msg.sender.deletex(tableName, "{\"id\":1}"); - msg.sender.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); + owner.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); + owner.deletex(tableName, "{\"id\":1}"); + owner.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); db.commit(); } diff --git a/src/connect.js b/src/connect.js index d0064f2..c5f279c 100644 --- a/src/connect.js +++ b/src/connect.js @@ -17,6 +17,10 @@ Connection.prototype.useCert = function(cert) { this.userCert = cert; } +Connection.prototype.setSchema = function(schemaID) { + this.schemaID = schemaID; +} + Connection.prototype.connect = function() { let that = this; return new Promise(function(resolve, reject) { diff --git a/src/eventManager.js b/src/eventManager.js index f3647ee..3c7012b 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -28,9 +28,16 @@ EventManager.prototype.subscribeTable = function(owner, name, cb) { }; EventManager.prototype.subscribeTx = function(id, cb) { var that = this; + + var schema_id = "" + if(that.chainsql.connect.schemaID !=undefined){ + schema_id = that.chainsql.connect.schemaID + } + var messageTx = { "command": "subscribe", - "transaction": id + "transaction": id, + schema_id: schema_id, }; if (!that.onMessage) { _onMessage(that); diff --git a/src/index.js b/src/index.js index a5bfa7a..8c9462e 100644 --- a/src/index.js +++ b/src/index.js @@ -1046,6 +1046,14 @@ ChainsqlAPI.prototype.prepareJson = function(){ }) } +/** + * 设置操作链的ID + * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; + */ +ChainsqlAPI.prototype.setSchema = function(schemaID){ + this.connect.setSchema(schemaID); +} + function callback(data, callback) { } diff --git a/src/ripple.js b/src/ripple.js index 93353e0..7fef145 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -73,6 +73,13 @@ Ripple.prototype.prepareJson = function () { txJson.source.maxAmount.value = (FloatOperation.accAdd(parseFloat(value), fee)).toString(); } } + + //self.connect + + if(self.ChainsqlAPI.connect.schemaID != undefined){ + self.ChainsqlAPI.api.schemaID = self.ChainsqlAPI.connect.schemaID; + } + self.ChainsqlAPI.api.preparePayment(self.ChainsqlAPI.connect.address, txJson, instructions) .then(function (data) { resolve(data); diff --git a/src/submit.js b/src/submit.js index c9c7b13..858e472 100644 --- a/src/submit.js +++ b/src/submit.js @@ -83,8 +83,6 @@ Submit.prototype.setCert = function () { } - - } }; diff --git a/src/tablePayment.js b/src/tablePayment.js index 810208d..4cd2683 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -81,9 +81,21 @@ function prepareTablePayment(payment, chainsqlApi) { } function prepareTable(ChainSQL, payment, resolve, reject) { + + if(ChainSQL.connect.schemaID != undefined){ + ChainSQL.api.schemaID = ChainSQL.connect.schemaID; + } + prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { var dropsPerByte = Math.ceil(1000000.0 / 1024);; + + + if(ChainSQL.ChainsqlAPI.connect.schemaID != undefined){ + ChainSQL.ChainsqlAPI.api.schemaID = ChainSQL.ChainsqlAPI.connect.schemaID ; + } + + ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ From 69fb794706ceb23afb99cb1f810b0392c59fe169 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 4 Jan 2021 11:50:47 +0800 Subject: [PATCH 22/80] add add,del,modify,get interface of schema --- src/index.js | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 219 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 8c9462e..d5432e8 100644 --- a/src/index.js +++ b/src/index.js @@ -19,6 +19,7 @@ const Connection = require('./connect'); const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); +const { utils } = require('elliptic'); const opType = require('../lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; @@ -42,7 +43,10 @@ class ChainsqlAPI extends Submit { select: 'lsfSelect', execute: 'lsfExecute' }; - this.transaction = false; + this.transaction = false; + this.schemaCreateTx = false; + this.schemaModifyTx = false; + this.cache = []; this.strictMode = false; this.needVerify = 1; @@ -1034,7 +1038,38 @@ ChainsqlAPI.prototype.verify = function (messageHex, signature, publicKey) { ChainsqlAPI.prototype.prepareJson = function(){ let that = this; return new Promise((resolve, reject) => { - if (that.payment.opType === opType['t_grant']) { + + if(that.schemaCreateTx || that.schemaModifyTx){ + var payment = that.payment; + that.api.prepareTx(payment).then(function (data) { + + var txJson = JSON.parse(data.txJSON); + var dropsPerByte = Math.ceil(1000000.0 / 1024); + that.api.getServerInfo().then(res => { + + if(res.validatedLedger.dropsPerByte != undefined){ + dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); + } + + txJson.Fee = util.calcFee(txJson,dropsPerByte); + data.txJSON = txJson; + that.schemaCreateTx = false; + that.schemaModifyTx = false; + resolve(data) + }).catch(err => { + that.schemaCreateTx = false; + that.schemaModifyTx = false; + reject(error) + }); + + }).catch(function (error) { + that.schemaCreateTx = false; + that.schemaModifyTx = false; + reject(error) + }); + + } + else if (that.payment.opType === opType['t_grant']) { handleGrantPayment(that).then(() => { that.api.prepareTable(that, that.payment, resolve, reject); }).catch(error => { @@ -1051,9 +1086,190 @@ ChainsqlAPI.prototype.prepareJson = function(){ * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; */ ChainsqlAPI.prototype.setSchema = function(schemaID){ - this.connect.setSchema(schemaID); + var connection = this.api ? this.api.connection : this.connect.api.connection; + if(connection._schema_id === undefined ){ + throw new Error("The current version does not support setSchema"); + } + connection._schema_id = schemaID; } +ChainsqlAPI.prototype.getSchemaList = function(options){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'schema_list'; + + if(options !== undefined && options.account !== undefined){ + params.account = options.account; + } + + if(options !== undefined && options.running !== undefined){ + params.running = options.running; + } + + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + +ChainsqlAPI.prototype.getSchemaInfo = function(schemaID){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + connection.request({ + command: 'schema_info', + schema:schemaID + }).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + + +ChainsqlAPI.prototype.createSchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaName !== undefined) && (schemaInfo.WithState !== undefined) && + (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && + (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + + if(!bValid){ + throw new Error("Invalid schemaInfo parameter"); + } + + // 继承自主链的状态 + // 锚定区块的hash值 + + var peerlists = [] + var i = 0; + var len = schemaInfo.PeerList.length + for(; i < len; i++) { + var hexPeer = convertStringToHex(schemaInfo.PeerList[i].Peer.Endpoint) + + var item = { + Peer:{ + Endpoint:hexPeer + } + } + peerlists.push(item) + } + + this.schemaCreateTx = true; + + var schemaCreateTxJson = { + Account: this.connect.address, + SchemaName:convertStringToHex(schemaInfo.SchemaName), + SchemaStrategy: schemaInfo.WithState? 2:1, + SchemaAdmin: this.connect.address, + Validators: schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaCreate' + }; + + + if(schemaCreateTxJson.SchemaStrategy === 2 ){ + + if(schemaInfo.AnchorLedgerHash === undefined ){ + throw new Error("Missing field AnchorLedgerHash"); + } + schemaCreateTxJson.AnchorLedgerHash = schemaInfo.AnchorLedgerHash; + } + + this.payment = schemaCreateTxJson; + return this; + +}; + + +ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaID !== undefined) && (schemaInfo.ModifyType !== undefined) && + (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && + (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + + if(!bValid){ + throw new Error("Invalid modifySchema parameter"); + } + + // var validators = [] + // var i = 0 + // var len = schemaInfo.Validators.length + + // for(; i < len; i++) { + // var hexValidator = convertStringToHex(schemaInfo.Validators[i].Validator.PublicKey) + + // var item = { + // Validator:{ + // PublicKey:hexValidator + // } + // } + // validators.push(item) + // } + + var peerlists = [] + var i = 0; + var len = schemaInfo.PeerList.length + for(; i < len; i++) { + var hexPeer = convertStringToHex(schemaInfo.PeerList[i].Peer.Endpoint) + + var item = { + Peer:{ + Endpoint:hexPeer + } + } + peerlists.push(item) + } + + var opType = 1; + if(schemaInfo.ModifyType === "schema_del"){ + opType = 2 + }else if(schemaInfo.ModifyType === "schema_add"){ + opType = 1 + }else{ + throw new Error("Invalid schemaInfo.ModifyType"); + } + + var schemaModifyTxJson = { + Account: this.connect.address, + SchemaID: schemaInfo.SchemaID, + OpType: opType, + Validators:schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaModify' + }; + + // 修改子链 + this.schemaModifyTx = true; + + // let payment = { + // Account: that.connect.address, + // SchemaID:"595FC1AA0C73D735C3362A0E9976A64E024C86976E08C02D299DB344CF674650", + // OpType: 1, + // Validators:[ + // { + // Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1A"} + // } + // ], + // PeerList:[ + // { + // Peer:{ Endpoint:convertStringToHex("192.168.29.116:7017") } + // } + + // ], + // TransactionType: 'SchemaModify' + // }; + + this.payment = schemaModifyTxJson; + return this; + +}; + + + function callback(data, callback) { } From 57facc2c05627aab098e59bd58ec4ddc9584f68e Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 25 Jan 2021 13:39:33 +0800 Subject: [PATCH 23/80] fix bug RR-2777(set the parameter SchemaAdmin of schemaCreate) --- src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index d5432e8..73323b6 100644 --- a/src/index.js +++ b/src/index.js @@ -1164,12 +1164,14 @@ ChainsqlAPI.prototype.createSchema = function(schemaInfo){ Account: this.connect.address, SchemaName:convertStringToHex(schemaInfo.SchemaName), SchemaStrategy: schemaInfo.WithState? 2:1, - SchemaAdmin: this.connect.address, Validators: schemaInfo.Validators, PeerList:peerlists, TransactionType: 'SchemaCreate' }; + if(schemaInfo.SchemaAdmin !== undefined){ + schemaCreateTxJson.SchemaAdmin = schemaInfo.SchemaAdmin; + } if(schemaCreateTxJson.SchemaStrategy === 2 ){ From db9cdc950ee9b834fd923e1670335bcb52a32736 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 1 Feb 2021 15:08:33 +0800 Subject: [PATCH 24/80] add test code of schema --- test/testSchema.js | 201 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 test/testSchema.js diff --git a/test/testSchema.js b/test/testSchema.js new file mode 100644 index 0000000..9056d24 --- /dev/null +++ b/test/testSchema.js @@ -0,0 +1,201 @@ +'use strict' + +const fs = require("fs"); +const co = require('co') +const ChainsqlAPI = require('../src/index'); + +const c = new ChainsqlAPI(); + + var owner = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" + } + +main(); + +async function main(){ + try { + await c.connect('ws://127.0.0.1:6006'); + //await c.connect('ws://101.201.40.124:5006'); + console.log('连接成功'); + c.as(owner); + await testChainsql(); + console.log('运行结束'); + }catch(e){ + console.error(e); + } +} + +async function testChainsql(){ + await testSchema(); +} + +//创建一个加密的表,table为要创建的表,confidential为是否要加密 +var testSchema = async function() { + + try{ + + // // 获取主,子链的信息 + // { + // let ret = await c.getServerInfo() + // console.log("主链:" + JSON.stringify(ret)) + // c.setSchema("AB34D23A49AD8A07D1F906135B71E8FEC8F94EE1CF41D36C1860C2CA79FB71BF") + // ret = await c.getServerInfo(); + // console.log("子链:" + JSON.stringify(ret)) + // } + + // // 获取所有子链的信息 + // { + // c.setSchema("") + // let ret = await c.getSchemaList() + // console.log("getSchemaList:" + JSON.stringify(ret)) + // } + + + // 创建子链 + { + + + // { + // "method": "submit", + // "params": [{ + // "secret": "xnqz3WMyyeaizQjPSaX6MjAUoa5vD", + // "tx_json": { + // "TransactionType": "SchemaCreate", + // "Account": "zKQhss2DSrPT3H5p7Ej55gx6F3snWH4KtT", + // "SchemaName":"716c69", + // "SchemaStrategy":2, + // "SchemaAdmin":"zKQhss2DSrPT3H5p7Ej55gx6F3snWH4KtT", + // "AnchorLedgerHash":"A8262DD30EA3268E379E5C4B9D9C27AE71F6CEF55C2B78CA9DAC180FC40E2263", + // "Validators":[ + // { + // "Validator":{ + // "PublicKey":"0249DF94DCE166BC5097FA6A447C55DD378996A091CE0450B58BACDE258EB785B3" + // } + // }, + // { + // "Validator":{ + // "PublicKey":"033E10D1FF3DC55889DCC811B537E199DE09876A6B194989D5A1926AD8FBC0FBDB" + // } + // }, + // { + // "Validator":{ + // "PublicKey":"02AF9D493C879C114BE1084EB675983F3FC457874B299B45BFA34C597E28187647" + // } + // } + // ], + // "PeerList":[ + // { + // "Peer":{ "Endpoint":"3132372e302e302e313a3135313235" } 127.0.0.1:15125 + // }, + // { + // "Peer":{ "Endpoint":"3132372e302e302e313a3235313235" } 127.0.0.1:25125 + // }, + // { + // "Peer":{ "Endpoint":"3132372e302e302e313a3335313235" } 127.0.0.1:35125 + // } + // ] + // } + // }] + // } + + // 1、 不继承主链状态 + let schemaInfo = { + SchemaName:"hello", + WithState:false, + SchemaAdmin:owner.address, + Validators:[ + { + Validator:{PublicKey:"0249DF94DCE166BC5097FA6A447C55DD378996A091CE0450B58BACDE258EB785B3"} + }, + { + Validator:{PublicKey:"033E10D1FF3DC55889DCC811B537E199DE09876A6B194989D5A1926AD8FBC0FBDB"} + }, + { + Validator:{PublicKey:"02AF9D493C879C114BE1084EB675983F3FC457874B299B45BFA34C597E28187647"} + } + ], + PeerList:[ + { + Peer:{ Endpoint:"127.0.0.1:15125"} + }, + { + Peer:{ Endpoint:"127.0.0.1:25125"} + }, + { + Peer:{ Endpoint:"127.0.0.1:35125"} + } + ] + } + + let ret = await c.createSchema(schemaInfo).submit({expect:'validate_success'}) + + console.log("创建子链 不继承状态:" + JSON.stringify(ret)) + + + // 2、 继承主链状态 + // let schemaInfo = { + // SchemaName:"jc", + // WithState:true, + // AnchorLedgerHash:"A8262DD30EA3268E379E5C4B9D9C27AE71F6CEF55C2B78CA9DAC180FC40E2263", + // SchemaAdmin:owner.address, + // Validators:[ + // { + // Validator:{PublicKey:"0249DF94DCE166BC5097FA6A447C55DD378996A091CE0450B58BACDE258EB785B3"} + // }, + // { + // Validator:{PublicKey:"033E10D1FF3DC55889DCC811B537E199DE09876A6B194989D5A1926AD8FBC0FBDB"} + // }, + // { + // Validator:{PublicKey:"02AF9D493C879C114BE1084EB675983F3FC457874B299B45BFA34C597E28187647"} + // } + // ], + // PeerList:[ + // { + // Peer:{ Endpoint:"127.0.0.1:15125"} + // }, + // { + // Peer:{ Endpoint:"127.0.0.1:25125"} + // }, + // { + // Peer:{ Endpoint:"127.0.0.1:35125"} + // } + // ] + // } + + // let ret = await c.createSchema(schemaInfo).submit({expect:'validate_success'}) + + // console.log("创建子链 不继承状态:" + JSON.stringify(ret)) + + + + } + + // // 不继承状态 + // let schemaInfo = { + // SchemaName:"hello", + // WithState:false, + // SchemaAdmin:user.address, + // Validators:[ + // { + // Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1B"} + // } + // ], + // PeerList:[ + // { + // Peer:{ Endpoint:"192.168.29.108:5125"} + // } + // ] + // } + + // let ret = await c.createSchema(schemaInfo).submit({expect:'validate_success'}) + // //assert.strictEqual(ret.status,'validate_success') + // // 继承状态 + + // console.log("test CreateSchema" , ret) + + + }catch(e){ + console.error(e) + } +} \ No newline at end of file From 1d35f51170ec937ca18a5e477762fe7511488f39 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 1 Feb 2021 15:29:07 +0800 Subject: [PATCH 25/80] require('chainsql-keypairs') --- lib/crypto.js | 2 +- lib/util.js | 2 +- src/index.js | 2 +- src/smartContract.js | 2 +- test/test.js | 8 +++----- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index 30909d7..9becf93 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -1,6 +1,6 @@ "use strict"; // requires -const keypairs = require('chainsql-keypairs-test'); +const keypairs = require('chainsql-keypairs'); const hashjs = require('hash.js'); const elliptic = require('elliptic'); diff --git a/lib/util.js b/lib/util.js index abb0861..4ee4dd8 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); const common = require('chainsql-lib').ChainsqlLibCommon; -const keypairs = require('chainsql-keypairs-test'); +const keypairs = require('chainsql-keypairs'); const cryptoo = require('crypto'); const crypto = require('./crypto'); const opType = require('./config').opType; diff --git a/src/index.js b/src/index.js index 1c2edfb..6f62f8a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ 'use strict' const crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs-test'); +const keypairs = require('chainsql-keypairs'); const EventManager = require('./eventManager') const _ = require('lodash'); diff --git a/src/smartContract.js b/src/smartContract.js index 862acaa..5ffe469 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -4,7 +4,7 @@ var util = require('../lib/util'); const _ = require('lodash'); var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; -const keypairs = require('chainsql-keypairs-test'); +const keypairs = require('chainsql-keypairs'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); var abi = require('web3-eth-abi'); diff --git a/test/test.js b/test/test.js index 2f52940..4db295b 100644 --- a/test/test.js +++ b/test/test.js @@ -7,8 +7,6 @@ const ChainsqlAPI = require('../src/index'); // ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); const c = new ChainsqlAPI(); -const RippleAPI = new require('chainsql-lib-test').RippleAPI; - var user = { secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", @@ -72,7 +70,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:8017'); + await c.connect('ws://192.168.29.69:46006'); // let accountInfo = c.generateAddress({algorithm:"softGMAlg",secret:smUser7.secret}); // console.log(JSON.stringify(accountInfo)) @@ -81,7 +79,7 @@ async function main(){ // accountInfo = c.generateAddress({algorithm:"softGMAlg"}); // console.log(accountInfo) console.log('连接成功'); - c.as(smRoot); + c.as(owner); // 读取证书文件 // var data = fs.readFileSync('C:\\ca\\userCert.cert'); @@ -92,7 +90,7 @@ async function main(){ // c.setRestrict(true); //激活user账户 - await activateAccount(smUser.address); + await activateAccount(user.address); //await testSubscribe(); From 4e1dd7bd924d58335ee7f09faa324848a638fa7d Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 1 Feb 2021 16:07:03 +0800 Subject: [PATCH 26/80] 1 set "chainsql-lib" to "~1.0.0" 2 fix merge bug --- package.json | 2 +- src/tablePayment.js | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 06d2532..e45f998 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs": "^0.10.16", - "chainsql-lib": "^0.17.44", + "chainsql-lib": "~1.0.0", "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", diff --git a/src/tablePayment.js b/src/tablePayment.js index 4cd2683..6bfa660 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -82,20 +82,11 @@ function prepareTablePayment(payment, chainsqlApi) { function prepareTable(ChainSQL, payment, resolve, reject) { - if(ChainSQL.connect.schemaID != undefined){ - ChainSQL.api.schemaID = ChainSQL.connect.schemaID; - } prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { var dropsPerByte = Math.ceil(1000000.0 / 1024);; - - - if(ChainSQL.ChainsqlAPI.connect.schemaID != undefined){ - ChainSQL.ChainsqlAPI.api.schemaID = ChainSQL.ChainsqlAPI.connect.schemaID ; - } - - + ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ @@ -106,7 +97,7 @@ function prepareTable(ChainSQL, payment, resolve, reject) { var txJson = JSON.parse(tx_json.txJSON); txJson.Fee = calcFee(txJson,dropsPerByte); - if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== undefined ){ + if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ resolve({txJSON:txJson}); return ; } From b008b2a3bcc3e21ef5b324839c363abc72ebcdce Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 1 Feb 2021 16:07:03 +0800 Subject: [PATCH 27/80] 1 set "chainsql-lib" to "~1.0.0" 2 fix merge bug --- src/tablePayment.js | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/tablePayment.js b/src/tablePayment.js index 7379377..98315ae 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -83,20 +83,11 @@ function prepareTablePayment(payment, chainsqlApi) { function prepareTable(ChainSQL, payment, resolve, reject) { - if(ChainSQL.connect.schemaID != undefined){ - ChainSQL.api.schemaID = ChainSQL.connect.schemaID; - } prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { var dropsPerByte = Math.ceil(1000000.0 / 1024);; - - - if(ChainSQL.ChainsqlAPI.connect.schemaID != undefined){ - ChainSQL.ChainsqlAPI.api.schemaID = ChainSQL.ChainsqlAPI.connect.schemaID ; - } - - + ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ @@ -107,7 +98,7 @@ function prepareTable(ChainSQL, payment, resolve, reject) { var txJson = JSON.parse(tx_json.txJSON); txJson.Fee = calcFee(txJson,dropsPerByte); - if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== undefined ){ + if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ resolve({txJSON:txJson}); return ; } From a7ce3cea3c27d3881697f093515bad330169b79e Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 1 Feb 2021 16:15:11 +0800 Subject: [PATCH 28/80] update version to 1.0.2 --- package.json | 2 +- test/test.js | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2b9f1fb..b29cc69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.1", + "version": "1.0.2", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/test/test.js b/test/test.js index 4db295b..d84b1b0 100644 --- a/test/test.js +++ b/test/test.js @@ -90,13 +90,13 @@ async function main(){ // c.setRestrict(true); //激活user账户 - await activateAccount(user.address); + //await activateAccount(user.address); //await testSubscribe(); //await testRippleAPI(); // await testAccount(); - //await testChainsql(); + await testChainsql(); //await c.disconnect(); console.log('运行结束'); @@ -224,6 +224,7 @@ async function testTableSet(){ async function testChainsql(){ + await testInsert() // await testDelete(); // await testRename(); // await testGet(); @@ -240,8 +241,8 @@ async function testChainsql(){ //现在底层不允许直接删除所有记录这种操作了 // await testDeleteAll(); - await testTableSet(); - await testSchema(); + //await testTableSet(); + //await testSchema(); } //创建一个加密的表,table为要创建的表,confidential为是否要加密 From fa482657e4d20107270982baf74b0c04897bfc89 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 2 Feb 2021 11:33:46 +0800 Subject: [PATCH 29/80] fix the bug of NameInDB --- src/tablePayment.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tablePayment.js b/src/tablePayment.js index 6bfa660..b714ce3 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -97,7 +97,10 @@ function prepareTable(ChainSQL, payment, resolve, reject) { var txJson = JSON.parse(tx_json.txJSON); txJson.Fee = calcFee(txJson,dropsPerByte); - if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ + if( txJson.Tables.length === 1 + && txJson.Tables[0].Table.NameInDB !== undefined + && txJson.Tables[0].Table.NameInDB !== ''){ + resolve({txJSON:txJson}); return ; } From b5c4c3ddc917b39cae18c8e8e0eb5ca29a67b1f2 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 2 Feb 2021 11:33:46 +0800 Subject: [PATCH 30/80] fix the bug of NameInDB --- src/tablePayment.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tablePayment.js b/src/tablePayment.js index 98315ae..297e5da 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -98,7 +98,10 @@ function prepareTable(ChainSQL, payment, resolve, reject) { var txJson = JSON.parse(tx_json.txJSON); txJson.Fee = calcFee(txJson,dropsPerByte); - if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ + if( txJson.Tables.length === 1 + && txJson.Tables[0].Table.NameInDB !== undefined + && txJson.Tables[0].Table.NameInDB !== ''){ + resolve({txJSON:txJson}); return ; } From 307fef22b758a2868babcb2835a40396c45c1241 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 2 Feb 2021 11:36:25 +0800 Subject: [PATCH 31/80] update version to 1.0.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b29cc69..73197c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.2", + "version": "1.0.3", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 674048fa95dc0fd70cf81e791f20bb8fbd2a5384 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Thu, 4 Feb 2021 10:22:46 +0800 Subject: [PATCH 32/80] fix RR-2795 table name not valid --- lib/validate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/validate.js b/lib/validate.js index bd85b09..2fd6c1b 100644 --- a/lib/validate.js +++ b/lib/validate.js @@ -4,7 +4,7 @@ const permission = require('./config').permission; function create(name,obj) { if(name == undefined || name.length > 64 || name.length == 0){ - throw new Error("tabla name not valid"); + throw new Error("table name not valid"); } let result = []; if (!isArrayFn(obj)) { From f8d647a25fefde49400d1cc4e9feffb1af338c3c Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 11 Mar 2021 16:34:04 +0800 Subject: [PATCH 33/80] add modify table related functions --- lib/config.js | 8 ++++++- lib/util.js | 43 ++++++++++++++++++++++++++++++++++- src/index.js | 63 ++++++++++++++++++++++++++++++++++++++++++++------- src/table.js | 45 +----------------------------------- test/test.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 164 insertions(+), 56 deletions(-) diff --git a/lib/config.js b/lib/config.js index b6ff4be..74904b6 100644 --- a/lib/config.js +++ b/lib/config.js @@ -20,7 +20,13 @@ const opType = { r_delete: 9, t_assert:10, t_grant: 11, - t_recreate:12 + t_recreate:12, + t_report:13, + t_add_fields:14, + t_delete_fields:15, + t_modify_fields:16, + t_create_index:17, + t_delete_index:18 } exports.permission = permission; exports.opType = opType; \ No newline at end of file diff --git a/lib/util.js b/lib/util.js index 4ee4dd8..338856f 100644 --- a/lib/util.js +++ b/lib/util.js @@ -435,6 +435,46 @@ function getCryptAlgTypeFromAccout(account){ return cryptoAlg; } +function tryEncryptRaw(ChainSQL, payment) { + + var that = ChainSQL; + var raw = payment.raw; + return new Promise(function (resolve, reject) { + + if(! that.confidential){ + resolve( convertStringToHex(raw) ); + return ; + } + + // confidential table + + var connect = that.connect; + getUserToken(connect.api.connection, connect.scope, connect.address, that.tab).then(function (token) { + token = token[that.connect.scope + that.tab]; + + var ciperRaw; + if (token && token != '') { + var secret = decodeToken(that, token); + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(that.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(that.connect.secret)){ + algType = "softGMAlg"; + } + ciperRaw = crypto.symEncrypt(secret, raw, algType).toUpperCase(); + } else { + ciperRaw = convertStringToHex(raw); + } + + resolve(ciperRaw); + }).catch(function(error) { + reject(error); + }); + + }); +} module.exports = { convertStringToHex: convertStringToHex, @@ -461,5 +501,6 @@ module.exports = { parseCb: parseCb, checkCbOpt:checkCbOpt, checkExpect:checkExpect, - checkSubError:checkSubError + checkSubError:checkSubError, + tryEncryptRaw:tryEncryptRaw } \ No newline at end of file diff --git a/src/index.js b/src/index.js index 73323b6..9209589 100644 --- a/src/index.js +++ b/src/index.js @@ -390,6 +390,45 @@ ChainsqlAPI.prototype.dropTable = function (name) { return this; } } + +ChainsqlAPI.prototype.addTableFields = function (name, raw){ + validate.create(name,raw); + return modifyTable(this,opType.t_add_fields,name, raw); +} + +ChainsqlAPI.prototype.deleteTableFields = function (name, raw){ + return modifyTable(this,opType.t_delete_fields,name, raw); +} + +ChainsqlAPI.prototype.modifyTableFields = function (name, raw){ + validate.create(name,raw); + return modifyTable(this,opType.t_modify_fields,name, raw); +} + +ChainsqlAPI.prototype.createIndex = function (name, raw){ + return modifyTable(this,opType.t_create_index,name, raw); +} + +ChainsqlAPI.prototype.deleteIndex = function (name, raw){ + return modifyTable(this,opType.t_delete_index,name, raw); +} + +function modifyTable(ChainSQL,optype,name,raw){ + ChainSQL.payment = { + address: ChainSQL.connect.address, + opType: optype, + tables: [{ + Table: { + TableName: convertStringToHex(name) + } + }], + raw: JSON.stringify(raw), + tsType: 'TableListSet', + }; + + return ChainSQL; +} + ChainsqlAPI.prototype.renameTable = function (oldName, newName) { if (newName == '' || !newName) { throw chainsqlError("Table new name can not be empty") @@ -1068,15 +1107,23 @@ ChainsqlAPI.prototype.prepareJson = function(){ reject(error) }); - } - else if (that.payment.opType === opType['t_grant']) { - handleGrantPayment(that).then(() => { + }else{ + if (that.payment.opType === opType['t_grant']) { + handleGrantPayment(that).then(() => { + that.api.prepareTable(that, that.payment, resolve, reject); + }).catch(error => { + reject(error); + }); + } else if(that.payment.opType >= opType.t_add_fields && that.payment.opType <= opType.t_delete_index){ + util.tryEncryptRaw(that,that.payment).then(function (raw) { + that.payment.raw = raw; + that.api.prepareTable(that, that.payment, resolve, reject); + }).catch(function(error) { + reject(error); + }); + }else { that.api.prepareTable(that, that.payment, resolve, reject); - }).catch(error => { - reject(error); - }); - } else { - that.api.prepareTable(that, that.payment, resolve, reject); + } } }) } diff --git a/src/table.js b/src/table.js index 6d14d4f..75c0aea 100644 --- a/src/table.js +++ b/src/table.js @@ -9,6 +9,7 @@ const getUserToken = util.getUserToken; const getTxJson = util.getTxJson; const generateToken = util.generateToken; const decodeToken = util.decodeToken; +const tryEncryptRaw = util.tryEncryptRaw; const crypto = require('../lib/crypto'); class Table extends Submit { @@ -421,50 +422,6 @@ Table.prototype.prepareJson = function() { }); } - - -function tryEncryptRaw(ChainSQL, payment) { - - var that = ChainSQL; - var raw = payment.raw; - return new Promise(function (resolve, reject) { - - if(! that.confidential){ - resolve( convertStringToHex(raw) ); - return ; - } - - // confidential table - - var connect = that.connect; - getUserToken(connect.api.connection, connect.scope, connect.address, that.tab).then(function (token) { - token = token[that.connect.scope + that.tab]; - - var ciperRaw; - if (token && token != '') { - var secret = decodeToken(that, token); - var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ - - let algType = "aes"; - if(that.connect.secret === "gmAlg"){ - algType = "gmAlg"; - }else if(regSoftGMSeed.test(that.connect.secret)){ - algType = "softGMAlg"; - } - ciperRaw = crypto.symEncrypt(secret, raw, algType).toUpperCase(); - } else { - ciperRaw = convertStringToHex(raw); - } - - resolve(ciperRaw); - }).catch(function(error) { - reject(error); - }); - - }); -} - - function prepareTable(ChainSQL, payment, resolve, reject) { var connect = ChainSQL.connect; diff --git a/test/test.js b/test/test.js index 75b13e8..e033fe3 100644 --- a/test/test.js +++ b/test/test.js @@ -25,7 +25,7 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "test666"; +var sTableName = "test888"; var sTableName2 = "b1"; var sReName = "boy1234"; var sTableName3 = "hijack12"; @@ -203,7 +203,9 @@ async function testChainsql(){ //现在底层不允许直接删除所有记录这种操作了 // await testDeleteAll(); - await testTableSet(); + // await testTableSet(); + + // await testModifyTable(); } function subTable(tb, owner) { @@ -358,6 +360,61 @@ var insertAfterGrant = async function(){ c.as(owner); } +var testModifyTable = async function(){ + await testAddFields(); + + // await testModifyFields(); + + // await testDeleteFields(); + + // await testCreateIndex(); + + // await testDeleteIndex(); +} + +var testAddFields = async function(){ + var raw = [ + {'field':'firmname','type':'varchar','length':50,'default':null}, + {'field':'height','type':'int'} + ] + var rs = await c.addTableFields(sTableName,raw).submit({expect:'db_success'}); + console.log("addTableFields",rs); +} + +var testModifyFields = async function(){ + var raw = [ + {'field':'firmname','type':'text'} + ] + var rs = await c.modifyTableFields(sTableName,raw).submit({expect:'db_success'}); + console.log("modifyTableFields",rs); +} + +var testDeleteFields = async function(){ + var raw = [ + {'field':'firmname'} + ] + var rs = await c.deleteTableFields(sTableName,raw).submit({expect:'db_success'}); + console.log("deleteTableFields",rs); +} + +var testCreateIndex = async function(){ + var raw = [ + {'index':'NameIndex'}, + {'field':'id'}, + {'field':'name'} + ] + var rs = await c.createIndex(sTableName,raw).submit({expect:'db_success'}); + console.log("createIndex",rs); +} + +var testDeleteIndex = async function(){ + var raw = [ + {'index':'NameIndex'} + ] + var rs = await c.deleteIndex(sTableName,raw).submit({expect:'db_success'}); + console.log("deleteIndex",rs); +} + var testTxs = async function(){ try { c.beginTran(); From e66529a5e4d20644a03bc5bc40cdc1c0f0c3a611 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 12 Mar 2021 12:04:03 +0800 Subject: [PATCH 34/80] throw exception if WithState is false and fill AnchorLedgerHash --- src/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/index.js b/src/index.js index 9209589..e60e3ed 100644 --- a/src/index.js +++ b/src/index.js @@ -1226,6 +1226,10 @@ ChainsqlAPI.prototype.createSchema = function(schemaInfo){ throw new Error("Missing field AnchorLedgerHash"); } schemaCreateTxJson.AnchorLedgerHash = schemaInfo.AnchorLedgerHash; + }else{ + if(schemaInfo.AnchorLedgerHash){ + throw new Error("Field 'AnchorLedgerHash' is unnecessary"); + } } this.payment = schemaCreateTxJson; From 0da36bddc989a89ad519a0dda31a1fa0d043b42d Mon Sep 17 00:00:00 2001 From: luleigreat Date: Mon, 15 Mar 2021 11:34:04 +0800 Subject: [PATCH 35/80] upgrade version to 1.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 73197c2..16708f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.3", + "version": "1.0.4", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 84fe31d57a5033a0c085abc929171548cb6b39f0 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Mon, 15 Mar 2021 11:42:02 +0800 Subject: [PATCH 36/80] upgrade version to 1.0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 16708f1..0cbee3f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.4", + "version": "1.0.5", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From c08fdae52d788fcae5d1bb4bf48106d0b79964d7 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 15 Mar 2021 13:45:35 +0800 Subject: [PATCH 37/80] require chainsql-keypair at least 0.11.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e45f998..2538cc5 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.16", + "chainsql-keypairs": "^0.11.1", "chainsql-lib": "~1.0.0", "co": "^4.6.0", "elliptic": "^5.1.0", From d261f351baae47f986e0b468c655ebebc2b8343c Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 15 Mar 2021 13:47:32 +0800 Subject: [PATCH 38/80] update 1.0.6 version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 040b53a..ddbf64c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.4", + "version": "1.0.6", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 1dadd4df807362e5678a5802100d7abcbce79db8 Mon Sep 17 00:00:00 2001 From: "DESKTOP-IGP0G3D\\Administrator" Date: Thu, 8 Apr 2021 10:19:31 +0800 Subject: [PATCH 39/80] upgrade package versions --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 0cbee3f..ab9ea13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.5", + "version": "1.0.7", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -9,17 +9,17 @@ "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs": "^0.10.16", - "chainsql-lib": "~1.0.0", + "chainsql-lib": "^1.0.3", "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", - "lodash": "^4.17.15", + "lodash": "^4.17.21", "protobufjs": "^6.8.0", "sjcl": "~1.0.3", "web3-core-helpers": "1.0.0-beta.36", "web3-eth-abi": "1.0.0-beta.36", "web3-utils": "1.0.0-beta.36", - "ws": "^7.2.0" + "ws": "^7.4.4" }, "devDependencies": { "mocha": "~2.3.3", From 776423ef43a7c196717a4de5788626a6cb78b73f Mon Sep 17 00:00:00 2001 From: "DESKTOP-IGP0G3D\\Administrator" Date: Tue, 13 Apr 2021 16:04:51 +0800 Subject: [PATCH 40/80] upgrade version 1.08 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99d8a42..afe7f70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.7", + "version": "1.0.8", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 83f2050145dc0cb76ffdc497c0d5782ac208c731 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 29 Apr 2021 15:07:43 +0800 Subject: [PATCH 41/80] update dependencies --- package.json | 4 +-- src/index.js | 1 - test/server-test.js | 51 +++++++++++++++++----------------- test/server.js | 67 ++++++++++++++++++++++----------------------- test/test.js | 1 - test/testSchema.js | 1 - test/testSign.js | 20 +++++++------- 7 files changed, 69 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index afe7f70..eb9d0be 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "bignumber.js": "^2.4.0", "chainsql-keypairs": "^0.11.1", "chainsql-lib": "^1.0.3", - "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", "lodash": "^4.17.21", @@ -18,8 +17,7 @@ "sjcl": "~1.0.3", "web3-core-helpers": "1.0.0-beta.36", "web3-eth-abi": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36", - "ws": "^7.4.4" + "web3-utils": "1.0.0-beta.36" }, "devDependencies": { "mocha": "~2.3.3", diff --git a/src/index.js b/src/index.js index f212f29..6faf74d 100644 --- a/src/index.js +++ b/src/index.js @@ -20,7 +20,6 @@ const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); const { utils } = require('elliptic'); -const co = require('co'); const opType = require('../lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; diff --git a/test/server-test.js b/test/server-test.js index bb56eb6..9cebd0c 100644 --- a/test/server-test.js +++ b/test/server-test.js @@ -1,7 +1,6 @@ 'use strict' -const co = require('co') const ChainsqlAPI = require('../src/index'); const r = new ChainsqlAPI(); var path = require('path'); @@ -27,11 +26,11 @@ describe('server', () => { // //字段级加密 // console.log("multi encrypt test:"); // var listPublic = ["cBP7JPfSVPgqGfGXVJVw168sJU5HhQfPbvDRZyriyKNeYjYLVL8M", "cBPaLRSCwtsJbz4Rq4K2NvoiDZWJyL2RnfdGv5CQ2UFWqyJ7ekHM"]; - // var cip = yield crypto.encryptText("test",listPublic); + // var cip = await crypto.encryptText("test",listPublic); // console.log("cipher:" + cip); - // var text = yield crypto.decryptText(cip,"xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); + // var text = await crypto.decryptText(cip,"xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); // console.log("plain text:" + text); - // var text2 = yield crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); + // var text2 = await crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); // console.log("plain text2:" + text2); // console.log("AesPadding Test"); @@ -41,7 +40,7 @@ describe('server', () => { // console.log(aesDecrypted); // // 创建表 - // let rs = yield r.createTable("abc", [{ + // let rs = await r.createTable("abc", [{ // "field": "id", // "type": "int", // "length": 11, @@ -59,47 +58,47 @@ describe('server', () => { // console.log(rs) // 删除表 - // let rs = yield r.drop(tb); + // let rs = await r.drop(tb); // 重命名 - // let rs = yield r.rename(tb,'users'); + // let rs = await r.rename(tb,'users'); // 授权权限 - // let rs = yield r.assign(tb, 'rETMNdu2UgPhLZzbnDUVRHhB6NEDahj53c', [r.perm.insert],'0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02'); + // let rs = await r.assign(tb, 'rETMNdu2UgPhLZzbnDUVRHhB6NEDahj53c', [r.perm.insert],'0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02'); // console.log(rs) //取消授权 - // let rs = yield r.assignCancle('users', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ['lsfUpdate']); + // let rs = await r.assignCancle('users', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ['lsfUpdate']); // 插入数据 - //let rs = yield r.table(tb).insert({name:'xiaopeng'}).submit(); - // let rs = yield r.table(tb).insert({name:'feipeng1'}).submit(); + //let rs = await r.table(tb).insert({name:'xiaopeng'}).submit(); + // let rs = await r.table(tb).insert({name:'feipeng1'}).submit(); //删除数据 - // let rs = yield r.table(tb).get({id:1}).delete().submit(); + // let rs = await r.table(tb).get({id:1}).delete().submit(); // 获取数据 - //let rs = yield r.table(tb).get(['id','name']).submit(); + //let rs = await r.table(tb).get(['id','name']).submit(); // 测试一个条件的情况 - //let rs = yield r.table(tb).get({id:{$ge:1}}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$ge:1}}).withFields(['id','name']).submit(); // // 测试 or 条件 - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'}).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:{$eq:'feipeng1'}}).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get({$or:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:{$eq:'feipeng1'}}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({$or:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); // 测试 and 条件 - //let rs = yield r.table(tb).get({$and:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get([{id:{$ge:1},name:'feipeng1'}]).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get([{id:{$ge:1},name:{$eq:'feipeng1'}}]).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({$and:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get([{id:{$ge:1},name:'feipeng1'}]).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get([{id:{$ge:1},name:{$eq:'feipeng1'}}]).withFields(['id','name']).submit(); // 测试 limit - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:1}}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:1}}).withFields(['id','name']).submit(); // order by asc - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:1}]}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:1}]}).withFields(['id','name']).submit(); // order by desc - // let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:-1}]}).withFields(['id','name']).submit(); + // let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:-1}]}).withFields(['id','name']).submit(); //更新数据 - // let rs = yield r.table(tb).update({name:'xiaopeng'},{id:2}).submit(); + // let rs = await r.table(tb).update({name:'xiaopeng'},{id:2}).submit(); // 获取所有交易 - // let rs = yield r.getTransactions({limit:10,types:['sqlStatement']}); + // let rs = await r.getTransactions({limit:10,types:['sqlStatement']}); // // console.log(rs) // 事务操作 @@ -127,7 +126,7 @@ describe('server', () => { // }],{confidential:true}); // r.table(tb).insert({id:33,name:'xiaopeng454'}); // r.table(tb).insert({id:34,name:'feipeng14544'}); - // var data = yield r.commit(); + // var data = await r.commit(); // console.log('data',data) } catch (e) { console.log(e) diff --git a/test/server.js b/test/server.js index 9d95924..ac9abb3 100644 --- a/test/server.js +++ b/test/server.js @@ -1,7 +1,7 @@ 'use strict' -const co = require('co') + const ChainsqlAPI = require('../src/index'); const r = new ChainsqlAPI(); var path = require('path'); @@ -10,11 +10,12 @@ var common = require(basePath); var crypto = require('../lib/crypto'); const keypairs = require('chainsql-keypairs-test'); -co(function*() { +main(); +async function main(){ try { - // yield r.connect('ws://127.0.0.1:6007'); - //yield r.connect('ws://139.198.11.189:6006'); - yield r.connect('ws://192.168.0.14:6006'); + // await r.connect('ws://127.0.0.1:6007'); + //await r.connect('ws://139.198.11.189:6006'); + await r.connect('ws://192.168.0.14:6006'); // console.log('连接成功') // var tb = 'test13323333'; @@ -24,7 +25,7 @@ co(function*() { // }); // r.setRestrict(true); - // // var data = yield r.api.getLedger(); + // // var data = await r.api.getLedger(); // // console.log(data); // r.api.getLedger({ledgerVersion:1732000}).then(function(data){ // console.log(data); @@ -41,11 +42,11 @@ co(function*() { //字段级加密 console.log("multi encrypt test:"); var listPublic = ["cBP7JPfSVPgqGfGXVJVw168sJU5HhQfPbvDRZyriyKNeYjYLVL8M", "cBPaLRSCwtsJbz4Rq4K2NvoiDZWJyL2RnfdGv5CQ2UFWqyJ7ekHM"]; - var cip = yield crypto.encryptText("test",listPublic); + var cip = await crypto.encryptText("test",listPublic); console.log("cipher:" + cip); - var text = yield crypto.decryptText(cip,"xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); + var text = await crypto.decryptText(cip,"xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); console.log("plain text:" + text); - var text2 = yield crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); + var text2 = await crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); console.log("plain text2:" + text2); @@ -57,7 +58,7 @@ co(function*() { // 创建表 - let rs = yield r.createTable("abc", [{ + let rs = await r.createTable("abc", [{ "field": "id", "type": "int", "length": 11, @@ -75,47 +76,47 @@ co(function*() { // console.log(rs) // 删除表 - // let rs = yield r.drop(tb); + // let rs = await r.drop(tb); // 重命名 - // let rs = yield r.rename(tb,'users'); + // let rs = await r.rename(tb,'users'); // 授权权限 - // let rs = yield r.assign(tb, 'rETMNdu2UgPhLZzbnDUVRHhB6NEDahj53c', [r.perm.insert],'0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02'); + // let rs = await r.assign(tb, 'rETMNdu2UgPhLZzbnDUVRHhB6NEDahj53c', [r.perm.insert],'0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02'); // console.log(rs) //取消授权 - // let rs = yield r.assignCancle('users', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ['lsfUpdate']); + // let rs = await r.assignCancle('users', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ['lsfUpdate']); // 插入数据 - //let rs = yield r.table(tb).insert({name:'xiaopeng'}).submit(); - // let rs = yield r.table(tb).insert({name:'feipeng1'}).submit(); + //let rs = await r.table(tb).insert({name:'xiaopeng'}).submit(); + // let rs = await r.table(tb).insert({name:'feipeng1'}).submit(); //删除数据 - // let rs = yield r.table(tb).get({id:1}).delete().submit(); + // let rs = await r.table(tb).get({id:1}).delete().submit(); // 获取数据 - //let rs = yield r.table(tb).get(['id','name']).submit(); + //let rs = await r.table(tb).get(['id','name']).submit(); // 测试一个条件的情况 - //let rs = yield r.table(tb).get({id:{$ge:1}}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$ge:1}}).withFields(['id','name']).submit(); // // 测试 or 条件 - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'}).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:{$eq:'feipeng1'}}).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get({$or:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:{$eq:'feipeng1'}}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({$or:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); // 测试 and 条件 - //let rs = yield r.table(tb).get({$and:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get([{id:{$ge:1},name:'feipeng1'}]).withFields(['id','name']).submit(); - //let rs = yield r.table(tb).get([{id:{$ge:1},name:{$eq:'feipeng1'}}]).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({$and:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get([{id:{$ge:1},name:'feipeng1'}]).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get([{id:{$ge:1},name:{$eq:'feipeng1'}}]).withFields(['id','name']).submit(); // 测试 limit - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:1}}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:1}}).withFields(['id','name']).submit(); // order by asc - //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:1}]}).withFields(['id','name']).submit(); + //let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:1}]}).withFields(['id','name']).submit(); // order by desc - // let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:-1}]}).withFields(['id','name']).submit(); + // let rs = await r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:-1}]}).withFields(['id','name']).submit(); //更新数据 - // let rs = yield r.table(tb).update({name:'xiaopeng'},{id:2}).submit(); + // let rs = await r.table(tb).update({name:'xiaopeng'},{id:2}).submit(); // 获取所有交易 - // let rs = yield r.getTransactions({limit:10,types:['sqlStatement']}); + // let rs = await r.getTransactions({limit:10,types:['sqlStatement']}); // // console.log(rs) // 事务操作 @@ -143,11 +144,9 @@ co(function*() { // }],{confidential:true}); // r.table(tb).insert({id:33,name:'xiaopeng454'}); // r.table(tb).insert({id:34,name:'feipeng14544'}); - // var data = yield r.commit(); + // var data = await r.commit(); // console.log('data',data) } catch (e) { console.log(e) } -}) - -console.log("llls") \ No newline at end of file +} diff --git a/test/test.js b/test/test.js index 0fca930..56fdec0 100644 --- a/test/test.js +++ b/test/test.js @@ -1,7 +1,6 @@ 'use strict' const fs = require("fs"); -const co = require('co') const ChainsqlAPI = require('../src/index'); // ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); diff --git a/test/testSchema.js b/test/testSchema.js index 9056d24..a60badf 100644 --- a/test/testSchema.js +++ b/test/testSchema.js @@ -1,7 +1,6 @@ 'use strict' const fs = require("fs"); -const co = require('co') const ChainsqlAPI = require('../src/index'); const c = new ChainsqlAPI(); diff --git a/test/testSign.js b/test/testSign.js index ebbbd4f..c88ed2b 100644 --- a/test/testSign.js +++ b/test/testSign.js @@ -4,7 +4,6 @@ // const api = new RippleAPI({server: ""}); const ChainsqlAPI = require('../src/index'); const c = new ChainsqlAPI(); -const co = require('co') var user = { secret: "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", @@ -12,13 +11,14 @@ var user = { publickKey: "aBQG8RQAzjs1eTKFEAQXr2gS4utcDiEC9wmi7pfUPTi27VCahwgw" }; -co(function*(){ +main(); +async function main(){ - // yield c.connect('ws://139.198.11.189:6006'); - yield c.connect('ws://127.0.0.1:6007'); + // await c.connect('ws://139.198.11.189:6006'); + await c.connect('ws://127.0.0.1:6007'); console.log('连接成功') - let info = yield c.api.getAccountInfo("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); + let info = await c.api.getAccountInfo("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); console.log(info); c.getLedgerVersion(function(err,data){ var payment = { @@ -59,7 +59,7 @@ co(function*(){ // return; -// info = yield c.api.getAccountInfo("rsM2GxUgR6jhEDijLTymqrwKZqtGSKj7RQ"); +// info = await c.api.getAccountInfo("rsM2GxUgR6jhEDijLTymqrwKZqtGSKj7RQ"); // var signerListSet = { // "TransactionType": "SignerListSet", // "Account": "rsM2GxUgR6jhEDijLTymqrwKZqtGSKj7RQ", @@ -91,11 +91,11 @@ co(function*(){ // signedRet = c.sign(signerListSet,"snfAitAq37xgeBMBv8YHNsWiczoBP"); // console.log("SignerListSet:"); // console.log(signedRet); -// subRet = yield c.api.submit(signedRet.signedTransaction); +// subRet = await c.api.submit(signedRet.signedTransaction); // console.log("submit SignerListSet:"); // console.log(subRet); -// info = yield c.api.getAccountInfo("rB8A3mG8ZarktJte6vnHuDPv9bp3N6Jh42"); +// info = await c.api.getAccountInfo("rB8A3mG8ZarktJte6vnHuDPv9bp3N6Jh42"); // var trustSet = { // "TransactionType": "TrustSet", // "Account": "rB8A3mG8ZarktJte6vnHuDPv9bp3N6Jh42", @@ -111,7 +111,7 @@ co(function*(){ // }; // var option = {signAs:"rDsFXt1KRDNNckSh3exyTqkQeBKQCXawb2"}; // let signForRet = c.signFor(trustSet,"saNWbrQwrZa9F24zeYZnnK4dPqWkw",option); -// subRet = yield c.api.submit(signedRet.signedTransaction); +// subRet = await c.api.submit(signedRet.signedTransaction); // console.log("submit multisign:"); // console.log(subRet); -}) +} From 76f5f2903f382a2526ce49b77f685eb4e33eb1cb Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 29 Apr 2021 18:15:57 +0800 Subject: [PATCH 42/80] re-implement setSchema --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 6faf74d..7fcdc07 100644 --- a/src/index.js +++ b/src/index.js @@ -1146,7 +1146,7 @@ ChainsqlAPI.prototype.setSchema = function(schemaID){ if(connection._schema_id === undefined ){ throw new Error("The current version does not support setSchema"); } - connection._schema_id = schemaID; + return connection.schemaChanged(schemaID) } ChainsqlAPI.prototype.getSchemaList = function(options){ From d8592ac642940d26cc7a77b1165d402b9abc84d0 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 30 Apr 2021 13:51:51 +0800 Subject: [PATCH 43/80] upgrade version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb9d0be..6c6ff4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.8", + "version": "1.0.9", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 568619531480c6793472f368a4c3a7b8568069b1 Mon Sep 17 00:00:00 2001 From: lujinglei Date: Fri, 30 Apr 2021 14:39:41 +0800 Subject: [PATCH 44/80] use chainsql npm version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c6ff4a..67a932c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "1.0.9", + "version": "0.70.1", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 675fd9a2b89fd316b24b3be095332e3b56d8bead Mon Sep 17 00:00:00 2001 From: lujinglei Date: Fri, 30 Apr 2021 14:40:07 +0800 Subject: [PATCH 45/80] use chainsql npm package name --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 67a932c..d809b52 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "chainsql-test", + "name": "chainsql", "version": "0.70.1", "description": "An database driver for chainsql ", "main": "src/index.js", From 03e1aa4f326954966e08a8a43cbcf2b4e75e7b46 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 30 Apr 2021 15:02:41 +0800 Subject: [PATCH 46/80] remove useless schemaid related code --- src/connect.js | 4 ---- src/eventManager.js | 8 +------- src/index.js | 34 ---------------------------------- src/ripple.js | 6 ------ test/testRipple.js | 5 +++-- 5 files changed, 4 insertions(+), 53 deletions(-) diff --git a/src/connect.js b/src/connect.js index c5f279c..d0064f2 100644 --- a/src/connect.js +++ b/src/connect.js @@ -17,10 +17,6 @@ Connection.prototype.useCert = function(cert) { this.userCert = cert; } -Connection.prototype.setSchema = function(schemaID) { - this.schemaID = schemaID; -} - Connection.prototype.connect = function() { let that = this; return new Promise(function(resolve, reject) { diff --git a/src/eventManager.js b/src/eventManager.js index 3c7012b..626db61 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -28,16 +28,10 @@ EventManager.prototype.subscribeTable = function(owner, name, cb) { }; EventManager.prototype.subscribeTx = function(id, cb) { var that = this; - - var schema_id = "" - if(that.chainsql.connect.schemaID !=undefined){ - schema_id = that.chainsql.connect.schemaID - } - + var messageTx = { "command": "subscribe", "transaction": id, - schema_id: schema_id, }; if (!that.onMessage) { _onMessage(that); diff --git a/src/index.js b/src/index.js index 7fcdc07..8ef9265 100644 --- a/src/index.js +++ b/src/index.js @@ -1254,21 +1254,6 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ throw new Error("Invalid modifySchema parameter"); } - // var validators = [] - // var i = 0 - // var len = schemaInfo.Validators.length - - // for(; i < len; i++) { - // var hexValidator = convertStringToHex(schemaInfo.Validators[i].Validator.PublicKey) - - // var item = { - // Validator:{ - // PublicKey:hexValidator - // } - // } - // validators.push(item) - // } - var peerlists = [] var i = 0; var len = schemaInfo.PeerList.length @@ -1303,25 +1288,6 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ // 修改子链 this.schemaModifyTx = true; - - // let payment = { - // Account: that.connect.address, - // SchemaID:"595FC1AA0C73D735C3362A0E9976A64E024C86976E08C02D299DB344CF674650", - // OpType: 1, - // Validators:[ - // { - // Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1A"} - // } - // ], - // PeerList:[ - // { - // Peer:{ Endpoint:convertStringToHex("192.168.29.116:7017") } - // } - - // ], - // TransactionType: 'SchemaModify' - // }; - this.payment = schemaModifyTxJson; return this; diff --git a/src/ripple.js b/src/ripple.js index 7fef145..bdf55ff 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -74,12 +74,6 @@ Ripple.prototype.prepareJson = function () { } } - //self.connect - - if(self.ChainsqlAPI.connect.schemaID != undefined){ - self.ChainsqlAPI.api.schemaID = self.ChainsqlAPI.connect.schemaID; - } - self.ChainsqlAPI.api.preparePayment(self.ChainsqlAPI.connect.address, txJson, instructions) .then(function (data) { resolve(data); diff --git a/test/testRipple.js b/test/testRipple.js index d48008e..9b6275d 100644 --- a/test/testRipple.js +++ b/test/testRipple.js @@ -39,12 +39,13 @@ var sCurrency = "aaa" main(); async function main() { // let res = await c.connect('ws://101.201.40.124:5006'); - let res = await c.connect('ws://127.0.0.1:6006'); + let res = await c.connect('ws://192.168.29.69:6305'); + await c.setSchema("8B0BA6D8848C76E19433EE90E2A88210E403339F2C5AC750271EFC862A173894"); c.as(root); c.setRestrict(true); /**************************************/ - let nStep = tagStep.escrow; + let nStep = tagStep.gateWay; switch (nStep) { case tagStep.active: testActive(); break;// 激活若干账户 case tagStep.gateWay: testGateWay(); break;//部署网管,信任,发行币转账 From e623c29dc08edf49850d571ac04f81c84665c642 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 30 Apr 2021 15:03:40 +0800 Subject: [PATCH 47/80] upgrade chainsql version to 0.70.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d809b52..f0d61c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.1", + "version": "0.70.2", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From d33827335cb7199eb81f68f3aad8f6d4588fea38 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Sat, 22 May 2021 11:00:55 +0800 Subject: [PATCH 48/80] add interface getTransactionResult --- package.json | 2 +- src/index.js | 7 +++++++ test/test.js | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f0d61c1..c3deb15 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.2", + "version": "0.70.3", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index 8ef9265..bcace86 100644 --- a/src/index.js +++ b/src/index.js @@ -572,6 +572,13 @@ ChainsqlAPI.prototype.getTransaction = function (hash,meta,meta_chain,cb) { } } +ChainsqlAPI.prototype.getTransactionResult = function (hash) { + return this.api.connection.request({ + command: 'tx_result', + transaction: hash + }); +} + ChainsqlAPI.prototype.getServerInfo = function (cb) { if ((typeof cb) != 'function') { return this.api.getServerInfo(); diff --git a/test/test.js b/test/test.js index 56fdec0..39d845d 100644 --- a/test/test.js +++ b/test/test.js @@ -118,6 +118,12 @@ async function testGetTransaction(){ console.log( "meta:false ; meta_chain false " ,JSON.stringify( rs ) ) ; } +async function testGetTransactionResult(){ + console.time("t2") + let rs = await c.getTransactionResult("3C6A343D64BDEF0E45C38AFCB8D9574391EEEA61397E5FFA2D61C18CDD635032"); + console.log( "tx_result: " , JSON.stringify( rs )) ; + console.timeEnd("t2") +} @@ -187,6 +193,7 @@ async function testRippleAPI(){ // await testGetLedgerVersion(); // await testGetLedger(); + await testGetTransactionResult(); // await testGetAccountTransactions(); await testGetTransaction(); // await testGetServerInfo(); From eda41bb4beb2f5df4528333d305807023e23a2bd Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 3 Jun 2021 18:05:22 +0800 Subject: [PATCH 49/80] fix contract tuple param encode and update version --- package.json | 2 +- src/index.js | 10 ---------- src/smartContract.js | 4 +++- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index c3deb15..d9b72be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.3", + "version": "0.70.4", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index bcace86..2efb936 100644 --- a/src/index.js +++ b/src/index.js @@ -320,10 +320,6 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { var token = generateToken(that.connect.secret); var symKey = decodeToken(that, token); var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ - - - // 原始的大小 - console.log("pre :",payment.raw); if(that.connect.secret === "gmAlg") { payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").toUpperCase(); @@ -333,13 +329,7 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { else { payment.raw = crypto.symEncrypt(symKey, payment.raw).toUpperCase(); } - - // - console.log("after :",payment.raw); - payment.token = token.toUpperCase(); - - console.log("token :",payment.token); } else { payment.raw = convertStringToHex(payment.raw); } diff --git a/src/smartContract.js b/src/smartContract.js index 5ffe469..6b22410 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -362,7 +362,9 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { if (json.type === 'function') { signature = json.signature; } - return _.isArray(json.inputs) ? json.inputs.map(function (input) { return input.type; }) : []; + return _.isArray(json.inputs) ? json.inputs.map(function (input) { + if (input.type === "tuple[]") return input; + return input.type; }) : []; }).map(function (types) { let newArgs = decodeChainsqlAddrParam(types, args); return abi.encodeParameters(types, newArgs).replace('0x',''); From 4f24bfe0dee7a620d3701322f6ded3aee4d479ec Mon Sep 17 00:00:00 2001 From: Mojicode Date: Tue, 8 Jun 2021 18:33:48 +0800 Subject: [PATCH 50/80] add getPastEvent api for search history event with txHash --- package.json | 2 +- src/smartContract.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d9b72be..0a33197 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.4", + "version": "0.70.5", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/smartContract.js b/src/smartContract.js index 6b22410..0b0d8ab 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -542,6 +542,40 @@ Contract.prototype._checkListener = function(type, event){ } }; +Contract.prototype.getPastEvent = function(options, callback) { + let params = {} + if( options.hasOwnProperty("txHash")) + { + params.txHash = options.txHash; + } + let chainsqlObj = this.chainsql; + chainsqlObj.getTransaction(params.txHash).then(data => { + let contractLogs = util.convertHexToString(data.specification.meta.ContractLogs).replace(/\s+/g, ''); + contractLogs = contractLogs.substring(1, contractLogs.length-1).replace(/,{/g, '-{'); + let ctrLogsArray = contractLogs.split('-'); + let newCtrLogs = {}; + for(let i = 0; i < ctrLogsArray.length; i++) + { + let ctrLog = JSON.parse(ctrLogsArray[i]); + let key = ctrLog.contract_topics[0].toLowerCase(); + let ctrLogInfo = {}; + ctrLogInfo.ContractEventInfo = ctrLog.contract_data; + ctrLogInfo.ContractEventTopics = ctrLog.contract_topics; + let currentEvent = this.options.jsonInterface.find(function (json) { + return (json.type === 'event' && json.signature === '0x' + key.replace('0x', '')); + }); + let output = this._decodeEventABI(currentEvent, ctrLogInfo); + newCtrLogs[currentEvent.name] = output; + } + // data.specification.meta.ContractLogs = newCtrLogs; + data.specification.ContractLogs = newCtrLogs; + delete data.specification.meta; + callback(null, data.specification); + }).catch(err => { + callback(err, null); + }) +} + /** * returns the an object with call, send, estimate functions * From 1ba834f32fcc1327eb05695da302fd5fa9592f1e Mon Sep 17 00:00:00 2001 From: fangxiuxiu Date: Fri, 25 Jun 2021 14:36:49 +0800 Subject: [PATCH 51/80] add whitelist --- src/index.js | 11 +++++- src/ripple.js | 10 +++++ test/testRipple.js | 91 +++++++++++++++++++++++++++------------------- 3 files changed, 74 insertions(+), 38 deletions(-) diff --git a/src/index.js b/src/index.js index 2efb936..e5efdb9 100644 --- a/src/index.js +++ b/src/index.js @@ -251,7 +251,16 @@ ChainsqlAPI.prototype.accountSet = function (opt) { let ripple = new Ripple(this); return ripple.accountSet(opt); } - +ChainsqlAPI.prototype.addWhitelistSet = function (whitelists) { + let ripple = new Ripple(this); + var flag = 10; + return ripple.whitelistSet(whitelists, flag); +} +ChainsqlAPI.prototype.delWhitelistSet = function (whitelists) { + let ripple = new Ripple(this); + var flag = 11; + return ripple.whitelistSet(whitelists, flag); +} ChainsqlAPI.prototype.getTransferFee = function (issuerAddr) { let ripple = new Ripple(this); return ripple.getTransferFee(issuerAddr); diff --git a/src/ripple.js b/src/ripple.js index bdf55ff..4870dbc 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -213,6 +213,16 @@ Ripple.prototype.accountSet = function (opt) { this.txJSON = setting; return this; } +Ripple.prototype.whitelistSet = function (whitelists, flag) { + var self = this; + var setting = {}; + setting.whitelists = whitelists; + setting.setFlag = flag; + + this.txType = "AccountSet"; + this.txJSON = setting; + return this; +} Ripple.prototype.getTransferFee = function (issuerAddr) { var self = this; diff --git a/test/testRipple.js b/test/testRipple.js index 9b6275d..1313141 100644 --- a/test/testRipple.js +++ b/test/testRipple.js @@ -35,11 +35,16 @@ var tagStep = { balances: 4, getLedger: 5, getTxs: 6 } var sCurrency = "aaa" +var whiteLists = [ + { + user: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv" + } +] main(); async function main() { // let res = await c.connect('ws://101.201.40.124:5006'); - let res = await c.connect('ws://192.168.29.69:6305'); + let res = await c.connect('ws://localhost:5510'); await c.setSchema("8B0BA6D8848C76E19433EE90E2A88210E403339F2C5AC750271EFC862A173894"); c.as(root); @@ -75,43 +80,55 @@ var testActive = async function () { } var testGateWay = async function () { - let res; - console.log("----------- GateWay >>>>>>>>>>>>>"); - var opt = { - enableRippling: true, - rate: 1.002, - min: 1, - max: 1.5 - } - c.as(issuer); - res = await c.accountSet(opt).submit({ expect: 'validate_success' }); - console.log("\n accountSet issuer", issuer.address, ":", res) - // - var amount = { - value: 20000, - currency: sCurrency, - issuer: issuer.address - } - // - c.as(user); - res = await c.trustSet(amount).submit({ expect: 'validate_success' }); - console.log("\n trustSet user", user.address, ":", res) - c.as(user1); - res = await c.trustSet(amount).submit({ expect: 'validate_success' }); - console.log("\n trustSet user1", user1.address, ":", res) - // - res = await c.api.getTrustlines(issuer.address); - console.log("\n getTrustlines issuer", issuer.address, ":", res) + try { + let res; + console.log("----------- GateWay >>>>>>>>>>>>>"); + var opt = { + enableRippling: true, + rate: 1.002, + min: 1, + max: 1.5 + } + c.as(issuer); + res = await c.accountSet(opt).submit({ expect: 'validate_success' }); + console.log("\n accountSet issuer", issuer.address, ":", res) + // + var amount = { + value: 20000, + currency: sCurrency, + issuer: issuer.address + } + // + c.as(user); + res = await c.trustSet(amount).submit({ expect: 'validate_success' }); + console.log("\n trustSet user", user.address, ":", res) + c.as(user1); + res = await c.trustSet(amount).submit({ expect: 'validate_success' }); + console.log("\n trustSet user1", user1.address, ":", res) + // + res = await c.api.getTrustlines(issuer.address); + console.log("\n getTrustlines issuer", issuer.address, ":", res) + // + c.as(issuer); + res = await c.addWhitelistSet(whiteLists).submit({ expect: 'validate_success' }); + console.log("\n whitelistSet user", user.address, ":", res) - // - c.as(issuer); - res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) - console.log("\n transfer currency(issuer 2 user)", issuer.address, user.address, ":", res) - c.as(user); - amount.value = 10000; - res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) - console.log("\n transfer currency(user 2 user1)", user.address, user1.address, ":", res) - console.log("\n----------- GateWay <<<<<<<<<<<<<"); + // res = await c.delWhitelistSet(whiteLists).submit({ expect: 'validate_success' }); + // console.log("\n whitelistSet user", user.address, ":", res) + + // + c.as(issuer); + res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) + console.log("\n transfer currency(issuer 2 user)", issuer.address, user.address, ":", res) + c.as(user); + amount.value = 10000; + res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) + console.log("\n transfer currency(user 2 user1)", user.address, user1.address, ":", res) + console.log("\n----------- GateWay <<<<<<<<<<<<<"); + } catch (error) { + + } + } var testEscrow = async function () { From 31c76d3df160292024304825d3d8d64f3089f425 Mon Sep 17 00:00:00 2001 From: fangxiuxiu Date: Fri, 25 Jun 2021 14:44:03 +0800 Subject: [PATCH 52/80] modified version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0a33197..853b9d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.5", + "version": "0.70.6", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 59de8c8c7137ab6ebfe25a3ae23121adf963e737 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Tue, 29 Jun 2021 11:24:40 +0800 Subject: [PATCH 53/80] update code for getPastEvent and version number --- package.json | 2 +- src/smartContract.js | 43 +++++++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 853b9d3..cd50d8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.6", + "version": "0.70.7", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/smartContract.js b/src/smartContract.js index 0b0d8ab..d9bbdd4 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -550,27 +550,30 @@ Contract.prototype.getPastEvent = function(options, callback) { } let chainsqlObj = this.chainsql; chainsqlObj.getTransaction(params.txHash).then(data => { - let contractLogs = util.convertHexToString(data.specification.meta.ContractLogs).replace(/\s+/g, ''); - contractLogs = contractLogs.substring(1, contractLogs.length-1).replace(/,{/g, '-{'); - let ctrLogsArray = contractLogs.split('-'); - let newCtrLogs = {}; - for(let i = 0; i < ctrLogsArray.length; i++) + if(data.specification.meta.hasOwnProperty("ContractLogs")) { - let ctrLog = JSON.parse(ctrLogsArray[i]); - let key = ctrLog.contract_topics[0].toLowerCase(); - let ctrLogInfo = {}; - ctrLogInfo.ContractEventInfo = ctrLog.contract_data; - ctrLogInfo.ContractEventTopics = ctrLog.contract_topics; - let currentEvent = this.options.jsonInterface.find(function (json) { - return (json.type === 'event' && json.signature === '0x' + key.replace('0x', '')); - }); - let output = this._decodeEventABI(currentEvent, ctrLogInfo); - newCtrLogs[currentEvent.name] = output; - } - // data.specification.meta.ContractLogs = newCtrLogs; - data.specification.ContractLogs = newCtrLogs; - delete data.specification.meta; - callback(null, data.specification); + let contractLogs = util.convertHexToString(data.specification.meta.ContractLogs).replace(/\s+/g, ''); + contractLogs = contractLogs.substring(1, contractLogs.length-1).replace(/,{/g, '-{'); + let ctrLogsArray = contractLogs.split('-'); + let newCtrLogs = {}; + for(let i = 0; i < ctrLogsArray.length; i++) + { + let ctrLog = JSON.parse(ctrLogsArray[i]); + let key = ctrLog.contract_topics[0].toLowerCase(); + let ctrLogInfo = {}; + ctrLogInfo.ContractEventInfo = ctrLog.contract_data; + ctrLogInfo.ContractEventTopics = ctrLog.contract_topics; + let currentEvent = this.options.jsonInterface.find(function (json) { + return (json.type === 'event' && json.signature === '0x' + key.replace('0x', '')); + }); + let output = this._decodeEventABI(currentEvent, ctrLogInfo); + newCtrLogs[currentEvent.name] = output; + } + // data.specification.meta.ContractLogs = newCtrLogs; + data.specification.ContractLogs = newCtrLogs; + delete data.specification.meta; + callback(null, data.specification); + } else callback(null, {ContractLogs:""}); }).catch(err => { callback(err, null); }) From 776760ef77de9fab1a08fac9b1445cc95b85fec3 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 8 Jul 2021 17:26:30 +0800 Subject: [PATCH 54/80] support db_success for contract deploy --- package.json | 2 +- src/smartContract.js | 1633 +++++++++++++++++++++--------------------- 2 files changed, 820 insertions(+), 815 deletions(-) diff --git a/package.json b/package.json index cd50d8f..851199d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.7", + "version": "0.70.8", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/smartContract.js b/src/smartContract.js index d9bbdd4..04e362b 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -22,161 +22,161 @@ const preDefOptions = ["ContractData", "arguments", "ContractValue", "Gas", "exp * @param {Object} options */ var Contract = function Contract(chainsql, jsonInterface, address, options) { - var _this = this, - args = Array.prototype.slice.call(arguments); - - this.chainsql = chainsql; - this.connect = chainsql.connect; - - if(!(this instanceof Contract)) { - throw chainsqlError('Please use the "new" keyword to instantiate a chainsql contract() object!'); - } - - // sets _requestmanager - //core.packageInit(this, [this.constructor.currentProvider]); - - //this.clearSubscriptions = this._requestManager.clearSubscriptions; - - if(!jsonInterface || !(Array.isArray(jsonInterface))) { - throw chainsqlError('You must provide the json interface of the contract when instantiating a contract object.'); - } - - // create the options object - this.options = {}; - - // var lastArg = args[args.length - 1]; - // if(_.isObject(lastArg) && !_.isArray(lastArg)) { - // options = lastArg; - - // this.options = _.extend(this.options, this._getOrSetDefaultOptions(options)); - // if(_.isObject(address)) { - // address = null; - // } - // } - - // set address - Object.defineProperty(this.options, 'address', { - set: function(value){ - if(value) { - //_this._address = utils.toChecksumAddress(formatters.inputAddressFormatter(value)); - _this._address = value;//may add a addr validation check like above; - } - }, - get: function(){ - return _this._address; - }, - enumerable: true - }); - - // add method and event signatures, when the jsonInterface gets set - Object.defineProperty(this.options, 'jsonInterface', { - set: function(value){ - _this.methods = {}; - _this.events = {}; - - _this._jsonInterface = value.map(function(method) { - var func, - funcName; - - if (method.name) { - funcName = utils._jsonInterfaceMethodToString(method); - } - - // function - if (method.type === 'function') { - method.signature = abi.encodeFunctionSignature(funcName); - func = _this._createTxObject.bind({ - method: method, - parent: _this - }); - - // add method only if not one already exists - if(!_this.methods[method.name]) { - _this.methods[method.name] = func; - } else { - var cascadeFunc = _this._createTxObject.bind({ - method: method, - parent: _this, - nextMethod: _this.methods[method.name] - }); - _this.methods[method.name] = cascadeFunc; - } - - // definitely add the method based on its signature - _this.methods[method.signature] = func; - - // add method by name - _this.methods[funcName] = func; - // event - } else if (method.type === 'event') { - method.signature = abi.encodeEventSignature(funcName); - var event = _this._on.bind(_this, method.signature); - - // add method only if not already exists - if(!_this.events[method.name] || _this.events[method.name].name === 'bound ') - _this.events[method.name] = event; - - // definitely add the method based on its signature - _this.events[method.signature] = event; - - // add event by name - _this.events[funcName] = event; - } - return method; - }); - - // add allEvents - //_this.events.allEvents = _this._on.bind(_this, 'allevents'); - return _this._jsonInterface; - }, - get: function(){ - return _this._jsonInterface; - }, - enumerable: true - }); - - // get default account from the Class - // var defaultAccount = this.constructor.defaultAccount; - // var defaultBlock = this.constructor.defaultBlock || 'latest'; - - // Object.defineProperty(this, 'defaultAccount', { - // get: function () { - // return defaultAccount; - // }, - // set: function (val) { - // if(val) { - // defaultAccount = utils.toChecksumAddress(formatters.inputAddressFormatter(val)); - // } - - // return val; - // }, - // enumerable: true - // }); - // Object.defineProperty(this, 'defaultBlock', { - // get: function () { - // return defaultBlock; - // }, - // set: function (val) { - // defaultBlock = val; - - // return val; - // }, - // enumerable: true - // }); - - // properties - this.methods = {}; - this.events = {}; - - this._address = null; - this._jsonInterface = []; - this.registeredEvent = []; - - // set getter/setter properties - this.options.isDeploy = false; - this.options.isFirstSubscribe = true; - this.options.address = address; - this.options.jsonInterface = jsonInterface; + var _this = this, + args = Array.prototype.slice.call(arguments); + + this.chainsql = chainsql; + this.connect = chainsql.connect; + + if(!(this instanceof Contract)) { + throw chainsqlError('Please use the "new" keyword to instantiate a chainsql contract() object!'); + } + + // sets _requestmanager + //core.packageInit(this, [this.constructor.currentProvider]); + + //this.clearSubscriptions = this._requestManager.clearSubscriptions; + + if(!jsonInterface || !(Array.isArray(jsonInterface))) { + throw chainsqlError('You must provide the json interface of the contract when instantiating a contract object.'); + } + + // create the options object + this.options = {}; + + // var lastArg = args[args.length - 1]; + // if(_.isObject(lastArg) && !_.isArray(lastArg)) { + // options = lastArg; + + // this.options = _.extend(this.options, this._getOrSetDefaultOptions(options)); + // if(_.isObject(address)) { + // address = null; + // } + // } + + // set address + Object.defineProperty(this.options, 'address', { + set: function(value){ + if(value) { + //_this._address = utils.toChecksumAddress(formatters.inputAddressFormatter(value)); + _this._address = value;//may add a addr validation check like above; + } + }, + get: function(){ + return _this._address; + }, + enumerable: true + }); + + // add method and event signatures, when the jsonInterface gets set + Object.defineProperty(this.options, 'jsonInterface', { + set: function(value){ + _this.methods = {}; + _this.events = {}; + + _this._jsonInterface = value.map(function(method) { + var func, + funcName; + + if (method.name) { + funcName = utils._jsonInterfaceMethodToString(method); + } + + // function + if (method.type === 'function') { + method.signature = abi.encodeFunctionSignature(funcName); + func = _this._createTxObject.bind({ + method: method, + parent: _this + }); + + // add method only if not one already exists + if(!_this.methods[method.name]) { + _this.methods[method.name] = func; + } else { + var cascadeFunc = _this._createTxObject.bind({ + method: method, + parent: _this, + nextMethod: _this.methods[method.name] + }); + _this.methods[method.name] = cascadeFunc; + } + + // definitely add the method based on its signature + _this.methods[method.signature] = func; + + // add method by name + _this.methods[funcName] = func; + // event + } else if (method.type === 'event') { + method.signature = abi.encodeEventSignature(funcName); + var event = _this._on.bind(_this, method.signature); + + // add method only if not already exists + if(!_this.events[method.name] || _this.events[method.name].name === 'bound ') + _this.events[method.name] = event; + + // definitely add the method based on its signature + _this.events[method.signature] = event; + + // add event by name + _this.events[funcName] = event; + } + return method; + }); + + // add allEvents + //_this.events.allEvents = _this._on.bind(_this, 'allevents'); + return _this._jsonInterface; + }, + get: function(){ + return _this._jsonInterface; + }, + enumerable: true + }); + + // get default account from the Class + // var defaultAccount = this.constructor.defaultAccount; + // var defaultBlock = this.constructor.defaultBlock || 'latest'; + + // Object.defineProperty(this, 'defaultAccount', { + // get: function () { + // return defaultAccount; + // }, + // set: function (val) { + // if(val) { + // defaultAccount = utils.toChecksumAddress(formatters.inputAddressFormatter(val)); + // } + + // return val; + // }, + // enumerable: true + // }); + // Object.defineProperty(this, 'defaultBlock', { + // get: function () { + // return defaultBlock; + // }, + // set: function (val) { + // defaultBlock = val; + + // return val; + // }, + // enumerable: true + // }); + + // properties + this.methods = {}; + this.events = {}; + + this._address = null; + this._jsonInterface = []; + this.registeredEvent = []; + + // set getter/setter properties + this.options.isDeploy = false; + this.options.isFirstSubscribe = true; + this.options.address = address; + this.options.jsonInterface = jsonInterface; }; /** @@ -187,25 +187,25 @@ var Contract = function Contract(chainsql, jsonInterface, address, options) { * @return {Object} the options with gaps filled by defaults */ Contract.prototype._getOrSetDefaultOptions = function getOrSetDefaultOptions(options) { - for(let key in options) { - if( preDefOptions.indexOf(key) === -1 ) { - let errMsg = "Find a unexpected key in options: " + key; - throw chainsqlError(errMsg); - } - } - var gasPrice = options.gasPrice ? String(options.gasPrice): null; - var from = options.from ? utils.toChecksumAddress(formatters.inputAddressFormatter(options.from)) : null; + for(let key in options) { + if( preDefOptions.indexOf(key) === -1 ) { + let errMsg = "Find a unexpected key in options: " + key; + throw chainsqlError(errMsg); + } + } + var gasPrice = options.gasPrice ? String(options.gasPrice): null; + var from = options.from ? utils.toChecksumAddress(formatters.inputAddressFormatter(options.from)) : null; - options.data = options.data || this.options.data; + options.data = options.data || this.options.data; - options.from = from || this.options.from; - options.gasPrice = gasPrice || this.options.gasPrice; - options.gas = options.gas || options.gasLimit || this.options.gas; + options.from = from || this.options.from; + options.gasPrice = gasPrice || this.options.gasPrice; + options.gas = options.gas || options.gasLimit || this.options.gas; - // TODO replace with only gasLimit? - delete options.gasLimit; + // TODO replace with only gasLimit? + delete options.gasLimit; - return options; + return options; }; /** @@ -217,63 +217,63 @@ Contract.prototype._getOrSetDefaultOptions = function getOrSetDefaultOptions(opt * @return {Object} everything combined together and encoded */ Contract.prototype._encodeEventABI = function (event, options) { - options = options || {}; - var filter = options.filter || {}, - result = {}; - - ['fromBlock', 'toBlock'].filter(function (f) { - return options[f] !== undefined; - }).forEach(function (f) { - result[f] = formatters.inputBlockNumberFormatter(options[f]); - }); - - // use given topics - if(_.isArray(options.topics)) { - result.topics = options.topics; - - // create topics based on filter - } else { - - result.topics = []; - - // add event signature - if (event && !event.anonymous && event.name !== 'ALLEVENTS') { - result.topics.push(event.signature); - } - - // add event topics (indexed arguments) - if (event.name !== 'ALLEVENTS') { - var indexedTopics = event.inputs.filter(function (i) { - return i.indexed === true; - }).map(function (i) { - var value = filter[i.name]; - if (!value) { - return null; - } - - // TODO: https://github.com/ethereum/web3.js/issues/344 - - if (_.isArray(value)) { - return value.map(function (v) { - return abi.encodeParameter(i.type, v); - }); - } - return abi.encodeParameter(i.type, value); - }); - - result.topics = result.topics.concat(indexedTopics); - } - - if(!result.topics.length) - delete result.topics; - } - - if(this.options.address) { - //result.address = this.options.address.toLowerCase(); - result.address = this.options.address; - } - - return result; + options = options || {}; + var filter = options.filter || {}, + result = {}; + + ['fromBlock', 'toBlock'].filter(function (f) { + return options[f] !== undefined; + }).forEach(function (f) { + result[f] = formatters.inputBlockNumberFormatter(options[f]); + }); + + // use given topics + if(_.isArray(options.topics)) { + result.topics = options.topics; + + // create topics based on filter + } else { + + result.topics = []; + + // add event signature + if (event && !event.anonymous && event.name !== 'ALLEVENTS') { + result.topics.push(event.signature); + } + + // add event topics (indexed arguments) + if (event.name !== 'ALLEVENTS') { + var indexedTopics = event.inputs.filter(function (i) { + return i.indexed === true; + }).map(function (i) { + var value = filter[i.name]; + if (!value) { + return null; + } + + // TODO: https://github.com/ethereum/web3.js/issues/344 + + if (_.isArray(value)) { + return value.map(function (v) { + return abi.encodeParameter(i.type, v); + }); + } + return abi.encodeParameter(i.type, value); + }); + + result.topics = result.topics.concat(indexedTopics); + } + + if(!result.topics.length) + delete result.topics; + } + + if(this.options.address) { + //result.address = this.options.address.toLowerCase(); + result.address = this.options.address; + } + + return result; }; /** @@ -284,56 +284,56 @@ Contract.prototype._encodeEventABI = function (event, options) { * @return {Object} result object with decoded indexed && not indexed params */ Contract.prototype._decodeEventABI = function (currentEvent, data) { - //var event = this; - var event = currentEvent; - - data.data = data.ContractEventInfo || ''; - data.topics = data.ContractEventTopics || []; - delete data.ContractEventInfo; - delete data.ContractEventTopics; - //var result = formatters.outputLogFormatter(data); //keep for later-lc - var result = data; - - // if allEvents get the right event - if(event.name === 'ALLEVENTS') { - event = event.jsonInterface.find(function (intf) { - return (intf.signature === data.topics[0]); - }) || {anonymous: true}; - } - - // create empty inputs if none are present (e.g. anonymous events on allEvents) - event.inputs = event.inputs || []; - - var argTopics = event.anonymous ? data.topics : data.topics.slice(1); - - result.returnValues = abi.decodeLog(event.inputs, data.data, argTopics); - delete result.returnValues.__length__; - if(_.isArray(event.inputs)){ - event.inputs.map(function (input, index) { - if(input.type === "address"){ - result.returnValues[index] = chainsqlUtils.encodeChainsqlAddr(result.returnValues[index].slice(2)); - result.returnValues[input.name] = result.returnValues[index]; - } - }); - } - else{ - //not array,what todo? - } - - // add name - result.event = event.name; - // add signature - result.signature = (event.anonymous || !data.topics[0]) ? null : data.topics[0]; - - // move the data and topics to "raw" - result.raw = { - data: result.data, - topics: result.topics - }; - delete result.data; - delete result.topics; - - return result; + //var event = this; + var event = currentEvent; + + data.data = data.ContractEventInfo || ''; + data.topics = data.ContractEventTopics || []; + delete data.ContractEventInfo; + delete data.ContractEventTopics; + //var result = formatters.outputLogFormatter(data); //keep for later-lc + var result = data; + + // if allEvents get the right event + if(event.name === 'ALLEVENTS') { + event = event.jsonInterface.find(function (intf) { + return (intf.signature === data.topics[0]); + }) || {anonymous: true}; + } + + // create empty inputs if none are present (e.g. anonymous events on allEvents) + event.inputs = event.inputs || []; + + var argTopics = event.anonymous ? data.topics : data.topics.slice(1); + + result.returnValues = abi.decodeLog(event.inputs, data.data, argTopics); + delete result.returnValues.__length__; + if(_.isArray(event.inputs)){ + event.inputs.map(function (input, index) { + if(input.type === "address"){ + result.returnValues[index] = chainsqlUtils.encodeChainsqlAddr(result.returnValues[index].slice(2)); + result.returnValues[input.name] = result.returnValues[index]; + } + }); + } + else{ + //not array,what todo? + } + + // add name + result.event = event.name; + // add signature + result.signature = (event.anonymous || !data.topics[0]) ? null : data.topics[0]; + + // move the data and topics to "raw" + result.raw = { + data: result.data, + topics: result.topics + }; + delete result.data; + delete result.topics; + + return result; }; /** @@ -345,47 +345,47 @@ Contract.prototype._decodeEventABI = function (currentEvent, data) { * @param {String} the encoded ABI */ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { - var methodSignature = this._method.signature, - args = this.arguments || []; + var methodSignature = this._method.signature, + args = this.arguments || []; - var signature = false, - paramsABI = this._parent.options.jsonInterface.filter(function (json) { - return ((methodSignature === 'constructor' && json.type === methodSignature) || + var signature = false, + paramsABI = this._parent.options.jsonInterface.filter(function (json) { + return ((methodSignature === 'constructor' && json.type === methodSignature) || ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); - }).map(function (json) { - var inputLength = (_.isArray(json.inputs)) ? json.inputs.length : 0; + }).map(function (json) { + var inputLength = (_.isArray(json.inputs)) ? json.inputs.length : 0; - if (inputLength !== args.length) { - throw chainsqlError('The number of arguments do not match the methods required number. You need to pass '+ inputLength +' arguments.'); - } + if (inputLength !== args.length) { + throw chainsqlError('The number of arguments do not match the methods required number. You need to pass '+ inputLength +' arguments.'); + } - if (json.type === 'function') { - signature = json.signature; - } - return _.isArray(json.inputs) ? json.inputs.map(function (input) { + if (json.type === 'function') { + signature = json.signature; + } + return _.isArray(json.inputs) ? json.inputs.map(function (input) { if (input.type === "tuple[]") return input; return input.type; }) : []; - }).map(function (types) { - let newArgs = decodeChainsqlAddrParam(types, args); - return abi.encodeParameters(types, newArgs).replace('0x',''); - })[0] || ''; - - // return constructor - if(methodSignature === 'constructor') { - if(!this._deployData) - throw chainsqlError('The contract does not set contract data. This is necessary to append the constructor parameters.'); - - return this._deployData + paramsABI; - // return method - } else { - var returnValue = (signature) ? signature + paramsABI : paramsABI; - - if(!returnValue) { - throw chainsqlError('Couldn\'t find a matching contract method named "'+ this._method.name +'".'); - } else { - return returnValue; - } - } + }).map(function (types) { + let newArgs = decodeChainsqlAddrParam(types, args); + return abi.encodeParameters(types, newArgs).replace('0x',''); + })[0] || ''; + + // return constructor + if(methodSignature === 'constructor') { + if(!this._deployData) + throw chainsqlError('The contract does not set contract data. This is necessary to append the constructor parameters.'); + + return this._deployData + paramsABI; + // return method + } else { + var returnValue = (signature) ? signature + paramsABI : paramsABI; + + if(!returnValue) { + throw chainsqlError('Couldn\'t find a matching contract method named "'+ this._method.name +'".'); + } else { + return returnValue; + } + } }; /** @@ -397,21 +397,21 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { * @return {Object} decoded output return values */ Contract.prototype._decodeMethodReturn = function (outputs, returnValues) { - if (!returnValues) { - return null; - } - - returnValues = returnValues.length >= 2 ? returnValues.slice(2) : returnValues; - var result = abi.decodeParameters(outputs, returnValues); - let newOutputs = _.isArray(outputs) ? outputs.map(function (output) { return output.type; }) : []; - encodeChainsqlAddrParam(newOutputs, result); - - if (result.__length__ === 1) { - return result[0]; - } else { - delete result.__length__; - return result; - } + if (!returnValues) { + return null; + } + + returnValues = returnValues.length >= 2 ? returnValues.slice(2) : returnValues; + var result = abi.decodeParameters(outputs, returnValues); + let newOutputs = _.isArray(outputs) ? outputs.map(function (output) { return output.type; }) : []; + encodeChainsqlAddrParam(newOutputs, result); + + if (result.__length__ === 1) { + return result[0]; + } else { + delete result.__length__; + return result; + } }; /** @@ -425,28 +425,28 @@ Contract.prototype._decodeMethodReturn = function (outputs, returnValues) { * @return {Object} EventEmitter possible events are "error", "transactionHash" and "receipt" */ Contract.prototype.deploy = function(options, callback){ - options = options || {}; - - options.arguments = options.arguments || []; - options = this._getOrSetDefaultOptions(options); - + options = options || {}; - // return error, if no "data" is specified - if(!options.ContractData) { - throw chainsqlError('No "ContractData" specified in neither the given options, nor the default options.'); - } - options.data = options.ContractData; + options.arguments = options.arguments || []; + options = this._getOrSetDefaultOptions(options); - var constructor = _.find(this.options.jsonInterface, function (method) { - return (method.type === 'constructor'); - }) || {}; - constructor.signature = 'constructor'; - return this._createTxObject.apply({ - method: constructor, - parent: this, - deployData: options.data, - }, options.arguments); + // return error, if no "data" is specified + if(!options.ContractData) { + throw chainsqlError('No "ContractData" specified in neither the given options, nor the default options.'); + } + options.data = options.ContractData; + + var constructor = _.find(this.options.jsonInterface, function (method) { + return (method.type === 'constructor'); + }) || {}; + constructor.signature = 'constructor'; + + return this._createTxObject.apply({ + method: constructor, + parent: this, + deployData: options.data, + }, options.arguments); }; /** @@ -459,29 +459,29 @@ Contract.prototype.deploy = function(options, callback){ * @return {Object} the event subscription */ Contract.prototype._on = function(){ - var subOptions = this._generateEventOptions.apply(this, arguments); - - // prevent the event "newListener" and "removeListener" from being overwritten - this._checkListener('newListener', subOptions.event.name, subOptions.callback); - this._checkListener('removeListener', subOptions.event.name, subOptions.callback); - - // TODO check if listener already exists? and reuse subscription if options are the same. - - let chainSQL = this.chainsql; - if(this.options.isFirstSubscribe){ - //this._decodeEventABI.bind(subOptions.event), - chainSQL.event.subscribeCtrAddr(this).then(subRes => { - //subscribeCtrAddr success - //console.log("subscribeCtrAddr success"); - }).catch(err => { - chainSQL.event.unsubscribeCtrAddr(this); - this.registeredEvent.splice(0, this.registeredEvent.length); - subOptions.callback(null, err); - }); - this.options.isFirstSubscribe = false; - } - this.registeredEvent.push(subOptions.event.signature); - chainSQL.event.registerCtrEvent(subOptions.event.signature, subOptions.callback); + var subOptions = this._generateEventOptions.apply(this, arguments); + + // prevent the event "newListener" and "removeListener" from being overwritten + this._checkListener('newListener', subOptions.event.name, subOptions.callback); + this._checkListener('removeListener', subOptions.event.name, subOptions.callback); + + // TODO check if listener already exists? and reuse subscription if options are the same. + + let chainSQL = this.chainsql; + if(this.options.isFirstSubscribe){ + //this._decodeEventABI.bind(subOptions.event), + chainSQL.event.subscribeCtrAddr(this).then(subRes => { + //subscribeCtrAddr success + //console.log("subscribeCtrAddr success"); + }).catch(err => { + chainSQL.event.unsubscribeCtrAddr(this); + this.registeredEvent.splice(0, this.registeredEvent.length); + subOptions.callback(null, err); + }); + this.options.isFirstSubscribe = false; + } + this.registeredEvent.push(subOptions.event.signature); + chainSQL.event.registerCtrEvent(subOptions.event.signature, subOptions.callback); }; /** @@ -494,38 +494,38 @@ Contract.prototype._on = function(){ * @return {Object} the event options object */ Contract.prototype._generateEventOptions = function() { - var args = Array.prototype.slice.call(arguments); - - // get the callback - var callback = this._getCallback(args); - - // get the options - var options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; - - var event = (_.isString(args[0])) ? args[0] : 'allevents'; - event = (event.toLowerCase() === 'allevents') ? { - name: 'ALLEVENTS', - jsonInterface: this.options.jsonInterface - } : this.options.jsonInterface.find(function (json) { - return (json.type === 'event' && (json.name === event || json.signature === '0x'+ event.replace('0x',''))); - }); - - if (!event) { - throw chainsqlError('Event "' + event.name + '" doesn\'t exist in this contract.'); - } - - // if (!utils.isAddress(this.options.address)) { - // throw new Error('This contract object doesn\'t have address set yet, please set an address first.'); - // } - if (!this.options.address) { - throw chainsqlError('This contract object doesn\'t have address set yet, please set an address first.'); - } - - return { - params: this._encodeEventABI(event, options), - event: event, - callback: callback - }; + var args = Array.prototype.slice.call(arguments); + + // get the callback + var callback = this._getCallback(args); + + // get the options + var options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; + + var event = (_.isString(args[0])) ? args[0] : 'allevents'; + event = (event.toLowerCase() === 'allevents') ? { + name: 'ALLEVENTS', + jsonInterface: this.options.jsonInterface + } : this.options.jsonInterface.find(function (json) { + return (json.type === 'event' && (json.name === event || json.signature === '0x'+ event.replace('0x',''))); + }); + + if (!event) { + throw chainsqlError('Event "' + event.name + '" doesn\'t exist in this contract.'); + } + + // if (!utils.isAddress(this.options.address)) { + // throw new Error('This contract object doesn\'t have address set yet, please set an address first.'); + // } + if (!this.options.address) { + throw chainsqlError('This contract object doesn\'t have address set yet, please set an address first.'); + } + + return { + params: this._encodeEventABI(event, options), + event: event, + callback: callback + }; }; /** @@ -537,9 +537,9 @@ Contract.prototype._generateEventOptions = function() { * @return {Object} the contract instance */ Contract.prototype._checkListener = function(type, event){ - if(event === type) { - throw chainsqlError('The event "'+ type +'" is a reserved event name, you can\'t use it.'); - } + if(event === type) { + throw chainsqlError('The event "'+ type +'" is a reserved event name, you can\'t use it.'); + } }; Contract.prototype.getPastEvent = function(options, callback) { @@ -586,40 +586,40 @@ Contract.prototype.getPastEvent = function(options, callback) { * @returns {Object} an object with functions to call the methods */ Contract.prototype._createTxObject = function _createTxObject(){ - var args = Array.prototype.slice.call(arguments); - var txObject = {}; - - if(this.method.type === 'function') { - txObject.call = this.parent._executeMethod.bind(txObject, 'call'); - txObject.call.request = this.parent._executeMethod.bind(txObject, 'call', true); // to make batch requests - txObject.auto = this.parent._executeMethod.bind(txObject, 'auto'); - } - - // txObject.send = this.parent._executeMethod.bind(txObject, 'send'); - // txObject.send.request = this.parent._executeMethod.bind(txObject, 'send', true); // to make batch requests - txObject.submit = this.parent._executeMethod.bind(txObject, 'submit'); - txObject.submit.request = this.parent._executeMethod.bind(txObject, 'submit', true); // to make batch requests - txObject.encodeABI = this.parent._encodeMethodABI.bind(txObject); - txObject.estimateGas = this.parent._executeMethod.bind(txObject, 'estimate'); - - if (args && this.method.inputs && args.length !== this.method.inputs.length) { - if (this.nextMethod) { - return this.nextMethod.apply(null, args); - } - //throw errors.InvalidNumberOfParams(args.length, this.method.inputs.length, this.method.name); - throw chainsqlError("Invalid Method Params!"); - } - - txObject.arguments = args || []; - txObject._method = this.method; - txObject._parent = this.parent; - //txObject._ethAccounts = this.parent.constructor._ethAccounts || this._ethAccounts; - - if(this.deployData) { - txObject._deployData = this.deployData; - } - - return txObject; + var args = Array.prototype.slice.call(arguments); + var txObject = {}; + + if(this.method.type === 'function') { + txObject.call = this.parent._executeMethod.bind(txObject, 'call'); + txObject.call.request = this.parent._executeMethod.bind(txObject, 'call', true); // to make batch requests + txObject.auto = this.parent._executeMethod.bind(txObject, 'auto'); + } + + // txObject.send = this.parent._executeMethod.bind(txObject, 'send'); + // txObject.send.request = this.parent._executeMethod.bind(txObject, 'send', true); // to make batch requests + txObject.submit = this.parent._executeMethod.bind(txObject, 'submit'); + txObject.submit.request = this.parent._executeMethod.bind(txObject, 'submit', true); // to make batch requests + txObject.encodeABI = this.parent._encodeMethodABI.bind(txObject); + txObject.estimateGas = this.parent._executeMethod.bind(txObject, 'estimate'); + + if (args && this.method.inputs && args.length !== this.method.inputs.length) { + if (this.nextMethod) { + return this.nextMethod.apply(null, args); + } + //throw errors.InvalidNumberOfParams(args.length, this.method.inputs.length, this.method.name); + throw chainsqlError("Invalid Method Params!"); + } + + txObject.arguments = args || []; + txObject._method = this.method; + txObject._parent = this.parent; + //txObject._ethAccounts = this.parent.constructor._ethAccounts || this._ethAccounts; + + if(this.deployData) { + txObject._deployData = this.deployData; + } + + return txObject; }; /** @@ -630,384 +630,389 @@ Contract.prototype._createTxObject = function _createTxObject(){ * @param {Boolean} makeRequest if true, it simply returns the request parameters, rather than executing it */ Contract.prototype._executeMethod = function _executeMethod(){ - var _this = this; - let argsOrigin = Array.prototype.slice.call(arguments); - let callback = this._parent._getCallback(argsOrigin); - try { - var args = this._parent._processExecuteArguments.call(this, argsOrigin/*, defer*/); - } catch (error) { - return errFuncGlobal(error, callback); - } - args.callback = callback; - //defer = promiEvent((args.type !== 'send')), - //ethAccounts = _this.constructor._ethAccounts || _this._ethAccounts; - - // simple return request for batch requests - if(args.generateRequest) { - var payload = { - params: [formatters.inputCallFormatter.call(this._parent, args.options)], - callback: args.callback - }; - - if(args.type === 'call') { - payload.params.push(formatters.inputDefaultBlockNumberFormatter.call(this._parent, args.defaultBlock)); - payload.method = 'eth_call'; - payload.format = this._parent._decodeMethodReturn.bind(null, this._method.outputs); - } else { - payload.method = 'eth_sendTransaction'; - } - - return payload; - } else { - let errorMsg = ""; - switch (args.type) { - // case 'estimate': - // var estimateGas = (new Method({ - // name: 'estimateGas', - // call: 'eth_estimateGas', - // params: 1, - // inputFormatter: [formatters.inputCallFormatter], - // outputFormatter: utils.hexToNumber, - // requestManager: _this._parent._requestManager, - // accounts: ethAccounts, // is eth.accounts (necessary for wallet signing) - // defaultAccount: _this._parent.defaultAccount, - // defaultBlock: _this._parent.defaultBlock - // })).createFunction(); - - // return estimateGas(args.options, args.callback); - case 'auto': - if(this._method.constant === true){ - //call - this.call.apply(this, Array.prototype.slice.call(arguments)); - } - else{ - //submit - this.submit.apply(this, Array.prototype.slice.call(arguments)); - } - break; - - case 'call': - if ((typeof args.callback) != 'function') { - let this_ = this; - return new Promise(function (resolve, reject) { - handleContractCall(this_, args.options, args.callback, resolve, reject); - }); - } else { - handleContractCall(this, args.options, args.callback, null, null); - } - break; - // TODO check errors: missing "from" should give error on deploy and send, call ? - case 'submit':{ - let contractData = args.options.data.length >= 2 ? args.options.data.slice(2) : args.options.data; - let contractValue = "0"; - if(args.options.hasOwnProperty("ContractValue")){ - contractValue = args.options.ContractValue; - } - let sendTxPayment = { - TransactionType : "Contract", - Account : this._parent.connect.address, - ContractAddress : args.options.to, - Gas : args.options.Gas, - ContractValue : contractValue, - ContractData : contractData.toUpperCase() - }; - - - let txCallbackProperty = {}; - txCallbackProperty.callbackFunc = args.callback; - txCallbackProperty.callbackExpect = "send_success"; - if(args.options.isDeploy) { - sendTxPayment.ContractOpType = 1; - txCallbackProperty.callbackExpect = "validate_success"; - } - else { - sendTxPayment.ContractOpType = 2; - if(args.options.hasOwnProperty("expect")) { - if(chainsqlUtils.checkExpect(args.options)) { - txCallbackProperty.callbackExpect = args.options.expect; - } - else { - errorMsg = "Unknown 'expect' value, please check!"; - return errFuncGlobal(errorMsg, args.callback); - } - } - } - - let contractObj = this._parent; - contractObj.options.isDeploy = args.options.isDeploy; - if ((typeof args.callback) != 'function') { - return new Promise(function (resolve, reject) { - handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, resolve, reject); - }); - } else { - handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, null, null); - } - break; - } - default: - //in fact, if call type is wrong ,it will throw error befor here. - errorMsg = "Error, not defined call type!"; - return errFuncGlobal(errorMsg, args.callback); - } - } + var _this = this; + let argsOrigin = Array.prototype.slice.call(arguments); + let callback = this._parent._getCallback(argsOrigin); + try { + var args = this._parent._processExecuteArguments.call(this, argsOrigin/*, defer*/); + } catch (error) { + return errFuncGlobal(error, callback); + } + args.callback = callback; + //defer = promiEvent((args.type !== 'send')), + //ethAccounts = _this.constructor._ethAccounts || _this._ethAccounts; + + // simple return request for batch requests + if(args.generateRequest) { + var payload = { + params: [formatters.inputCallFormatter.call(this._parent, args.options)], + callback: args.callback + }; + + if(args.type === 'call') { + payload.params.push(formatters.inputDefaultBlockNumberFormatter.call(this._parent, args.defaultBlock)); + payload.method = 'eth_call'; + payload.format = this._parent._decodeMethodReturn.bind(null, this._method.outputs); + } else { + payload.method = 'eth_sendTransaction'; + } + + return payload; + } else { + let errorMsg = ""; + switch (args.type) { + // case 'estimate': + // var estimateGas = (new Method({ + // name: 'estimateGas', + // call: 'eth_estimateGas', + // params: 1, + // inputFormatter: [formatters.inputCallFormatter], + // outputFormatter: utils.hexToNumber, + // requestManager: _this._parent._requestManager, + // accounts: ethAccounts, // is eth.accounts (necessary for wallet signing) + // defaultAccount: _this._parent.defaultAccount, + // defaultBlock: _this._parent.defaultBlock + // })).createFunction(); + + // return estimateGas(args.options, args.callback); + case 'auto': + if(this._method.constant === true){ + //call + this.call.apply(this, Array.prototype.slice.call(arguments)); + } + else{ + //submit + this.submit.apply(this, Array.prototype.slice.call(arguments)); + } + break; + + case 'call': + if ((typeof args.callback) != 'function') { + let this_ = this; + return new Promise(function (resolve, reject) { + handleContractCall(this_, args.options, args.callback, resolve, reject); + }); + } else { + handleContractCall(this, args.options, args.callback, null, null); + } + break; + // TODO check errors: missing "from" should give error on deploy and send, call ? + case 'submit':{ + let contractData = args.options.data.length >= 2 ? args.options.data.slice(2) : args.options.data; + let contractValue = "0"; + if(args.options.hasOwnProperty("ContractValue")){ + contractValue = args.options.ContractValue; + } + let sendTxPayment = { + TransactionType : "Contract", + Account : this._parent.connect.address, + ContractAddress : args.options.to, + Gas : args.options.Gas, + ContractValue : contractValue, + ContractData : contractData.toUpperCase() + }; + + + let txCallbackProperty = {}; + txCallbackProperty.callbackFunc = args.callback; + txCallbackProperty.callbackExpect = "send_success"; + if(args.options.isDeploy) { + sendTxPayment.ContractOpType = 1; + if (args.options.expect === "send_success") + { + errorMsg = "Contract deploy tx expect must be validate_success or db_success"; + return errFuncGlobal(errorMsg, args.callback); + } + txCallbackProperty.callbackExpect = args.options.expect; + } + else { + sendTxPayment.ContractOpType = 2; + if(args.options.hasOwnProperty("expect")) { + if(chainsqlUtils.checkExpect(args.options)) { + txCallbackProperty.callbackExpect = args.options.expect; + } + else { + errorMsg = "Unknown 'expect' value, please check!"; + return errFuncGlobal(errorMsg, args.callback); + } + } + } + + let contractObj = this._parent; + contractObj.options.isDeploy = args.options.isDeploy; + if ((typeof args.callback) != 'function') { + return new Promise(function (resolve, reject) { + handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, resolve, reject); + }); + } else { + handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, null, null); + } + break; + } + default: + //in fact, if call type is wrong ,it will throw error befor here. + errorMsg = "Error, not defined call type!"; + return errFuncGlobal(errorMsg, args.callback); + } + } }; function errFuncGlobal(errMsg, callback){ - if ((typeof callback) != 'function') { - return new Promise(function (resolve, reject) { - reject(errMsg); - }); - } else { - callback(errMsg, null); - } + if ((typeof callback) != 'function') { + return new Promise(function (resolve, reject) { + reject(errMsg); + }); + } else { + callback(errMsg, null); + } } function handleContractCall(curFunObj, callObj, callBack, resolve, reject) { - var isFunction = false; - if ((typeof callBack) === 'function') - isFunction = true; - - var callBackFun = function(error, data) { - if (isFunction) { - callBack(error, data); - } else { - if (error) { - reject(error); - } else { - resolve(data); - } - } - }; - const contractObj = curFunObj._parent; - var connect = contractObj.connect; - const contractData = callObj.data.length >= 2 ? callObj.data.slice(2) : callObj.data; - connect.api.connection.request({ - command: 'contract_call', - account : connect.address, - contract_address : callObj.to, - contract_data : contractData.toUpperCase() - }).then(function(data) { - // if (data.status != 'success'){ - // callBackFun(new Error(data), null); - // } - //begin to decode return value,then get result and set to callBack - var resultStr = data.contract_call_result; - var localcallResult = contractObj._decodeMethodReturn(curFunObj._method.outputs, resultStr); - callBackFun(null, localcallResult); - }).catch(function(err) { - callBackFun(err, null); - }); + var isFunction = false; + if ((typeof callBack) === 'function') + isFunction = true; + + var callBackFun = function(error, data) { + if (isFunction) { + callBack(error, data); + } else { + if (error) { + reject(error); + } else { + resolve(data); + } + } + }; + const contractObj = curFunObj._parent; + var connect = contractObj.connect; + const contractData = callObj.data.length >= 2 ? callObj.data.slice(2) : callObj.data; + connect.api.connection.request({ + command: 'contract_call', + account : connect.address, + contract_address : callObj.to, + contract_data : contractData.toUpperCase() + }).then(function(data) { + // if (data.status != 'success'){ + // callBackFun(new Error(data), null); + // } + //begin to decode return value,then get result and set to callBack + var resultStr = data.contract_call_result; + var localcallResult = contractObj._decodeMethodReturn(curFunObj._method.outputs, resultStr); + callBackFun(null, localcallResult); + }).catch(function(err) { + callBackFun(err, null); + }); } function handleContractPayment(contractObj, contractPaymet, callbackProperty, resolve, reject){ - let chainSQL = contractObj.chainsql; - var callBack = callbackProperty.callbackFunc; - var errFunc = function(error) { - if ((typeof callBack) == 'function') { - callBack(error, null); - } else { - reject(error); - } - }; - prepareContractPayment(chainSQL, contractPaymet).then(data => { - if(chainSQL.connect.userCert != undefined && (typeof(data.txJSON) == "string") ){ - var txJson = JSON.parse(data.txJSON); - txJson.Certificate = util.convertStringToHex (chainSQL.connect.userCert); - - data.txJSON = JSON.stringify(txJson); - } - - let signedRet = chainSQL.api.sign(data.txJSON, chainSQL.connect.secret); - submitContractTx(contractObj, signedRet, callbackProperty, resolve, reject); - }).catch(err => { - errFunc(err); - }); + let chainSQL = contractObj.chainsql; + var callBack = callbackProperty.callbackFunc; + var errFunc = function(error) { + if ((typeof callBack) == 'function') { + callBack(error, null); + } else { + reject(error); + } + }; + prepareContractPayment(chainSQL, contractPaymet).then(data => { + if(chainSQL.connect.userCert != undefined && (typeof(data.txJSON) == "string") ){ + var txJson = JSON.parse(data.txJSON); + txJson.Certificate = util.convertStringToHex (chainSQL.connect.userCert); + + data.txJSON = JSON.stringify(txJson); + } + + let signedRet = chainSQL.api.sign(data.txJSON, chainSQL.connect.secret); + submitContractTx(contractObj, signedRet, callbackProperty, resolve, reject); + }).catch(err => { + errFunc(err); + }); } function prepareContractPayment(chainSQL, contractPayment){ - var instructions = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - const txJSON = createContractPayment(contractPayment); - return chainsqlLibUtils.prepareTransaction(txJSON, chainSQL.api, instructions); + var instructions = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + const txJSON = createContractPayment(contractPayment); + return chainsqlLibUtils.prepareTransaction(txJSON, chainSQL.api, instructions); } function createContractPayment(contractPayment){ - var newContractPayment = _.cloneDeep(contractPayment); - - var txJSON = { - TransactionType : newContractPayment.TransactionType, - ContractOpType : newContractPayment.ContractOpType, - Account : newContractPayment.Account, - ContractData : newContractPayment.ContractData, - ContractValue : newContractPayment.ContractValue, - Gas : newContractPayment.Gas - }; - if(/*!isDeploy && */newContractPayment.hasOwnProperty("ContractAddress")){ - txJSON.ContractAddress = newContractPayment.ContractAddress; - } - return txJSON; + var newContractPayment = _.cloneDeep(contractPayment); + + var txJSON = { + TransactionType : newContractPayment.TransactionType, + ContractOpType : newContractPayment.ContractOpType, + Account : newContractPayment.Account, + ContractData : newContractPayment.ContractData, + ContractValue : newContractPayment.ContractValue, + Gas : newContractPayment.Gas + }; + if(/*!isDeploy && */newContractPayment.hasOwnProperty("ContractAddress")){ + txJSON.ContractAddress = newContractPayment.ContractAddress; + } + return txJSON; } function submitContractTx(contractObj, signedVal, callbackProperty, resolve, reject){ - let chainSQL = contractObj.chainsql; - var callBack = callbackProperty.callbackFunc; - var isFunction = false; - if ((typeof callBack) == 'function') - isFunction = true; - - var errFunc = function(error) { - if (isFunction) { - callBack(error, null); - } else { - reject(error); - } - }; - var sucFunc = function(data){ - if(isFunction){ - callBack(null,data); - }else{ - resolve(data); - } - }; - //according to callbackProperty to subscribe event - if(callbackProperty.callbackExpect !== "send_success"){ - chainSQL.event.subscribeTx(signedVal.id, function(err, data) { - if (err) { - errFunc(err); - } else { - // success - // if 'submit()' called without param, default is validate_success - let resultObj = {}; - resultObj.status = data.status; - resultObj.tx_hash = data.transaction.hash; - - if (callbackProperty.callbackExpect === data.status && data.type === 'singleTransaction') { - if(contractObj.options.isDeploy) { - return getNewDeployCtrAddr(chainSQL, data.transaction.hash).then(contractAddr => { - if (contractAddr === "") { - resultObj.contractAddress = "Can not find CreateNode"; - errFunc(resultObj); - } - else { - contractObj.options.address = contractAddr; - resultObj.contractAddress = contractAddr; - } - sucFunc(resultObj); - }).catch(err => { - errFunc(err); - }); - } - else{ - return sucFunc(resultObj); - } - } - // failure - if (chainsqlUtils.checkSubError(data)) { - if (data.hasOwnProperty("error_message")) { - resultObj.error_message = data.error_message; - } - return errFunc(resultObj); - } - } - }).then(function(data) { - // subscribeTx success - }).catch(function(error) { - // subscribeTx failure - errFunc('subscribeTx exception.' + error); - }); - } - - // submit transaction - chainSQL.api.submit(signedVal.signedTransaction).then(function(result) { - //console.log('submit ', JSON.stringify(result)); - if (result.resultCode !== 'tesSUCCESS') { - if(callbackProperty.callbackExpect !== "send_success"){ - unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); - } - //return error message - errFunc(result); - } else { - // submit successfully - if(callbackProperty.callbackExpect === "send_success"){ - sucFunc({ - status: "send_success", - tx_hash: signedVal.id - }); - } - } - }).catch(function(error) { - unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); - errFunc(error); - }); + let chainSQL = contractObj.chainsql; + var callBack = callbackProperty.callbackFunc; + var isFunction = false; + if ((typeof callBack) == 'function') + isFunction = true; + + var errFunc = function(error) { + if (isFunction) { + callBack(error, null); + } else { + reject(error); + } + }; + var sucFunc = function(data){ + if(isFunction){ + callBack(null,data); + }else{ + resolve(data); + } + }; + //according to callbackProperty to subscribe event + if(callbackProperty.callbackExpect !== "send_success"){ + chainSQL.event.subscribeTx(signedVal.id, function(err, data) { + if (err) { + errFunc(err); + } else { + // success + // if 'submit()' called without param, default is validate_success + let resultObj = {}; + resultObj.status = data.status; + resultObj.tx_hash = data.transaction.hash; + + if (callbackProperty.callbackExpect === data.status && data.type === 'singleTransaction') { + if(contractObj.options.isDeploy) { + return getNewDeployCtrAddr(chainSQL, data.transaction.hash).then(contractAddr => { + if (contractAddr === "") { + resultObj.contractAddress = "Can not find CreateNode"; + errFunc(resultObj); + } + else { + contractObj.options.address = contractAddr; + resultObj.contractAddress = contractAddr; + } + sucFunc(resultObj); + }).catch(err => { + errFunc(err); + }); + } + else{ + return sucFunc(resultObj); + } + } + // failure + if (chainsqlUtils.checkSubError(data)) { + if (data.hasOwnProperty("error_message")) { + resultObj.error_message = data.error_message; + } + return errFunc(resultObj); + } + } + }).then(function(data) { + // subscribeTx success + }).catch(function(error) { + // subscribeTx failure + errFunc('subscribeTx exception.' + error); + }); + } + + // submit transaction + chainSQL.api.submit(signedVal.signedTransaction).then(function(result) { + //console.log('submit ', JSON.stringify(result)); + if (result.resultCode !== 'tesSUCCESS') { + if(callbackProperty.callbackExpect !== "send_success"){ + unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); + } + //return error message + errFunc(result); + } else { + // submit successfully + if(callbackProperty.callbackExpect === "send_success"){ + sucFunc({ + status: "send_success", + tx_hash: signedVal.id + }); + } + } + }).catch(function(error) { + unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); + errFunc(error); + }); } function unsubscribeTx(expectValue, chainsql, signedVal, errFunc){ - if(expectValue !== "send_success"){ - chainsql.event.unsubscribeTx(signedVal.id).then(function(data) { - // unsubscribeTx success - }).catch(function(error) { - // unsubscribeTx failure - errFunc('unsubscribeTx failure.' + error); - }); - } + if(expectValue !== "send_success"){ + chainsql.event.unsubscribeTx(signedVal.id).then(function(data) { + // unsubscribeTx success + }).catch(function(error) { + // unsubscribeTx failure + errFunc('unsubscribeTx failure.' + error); + }); + } } function getNewDeployCtrAddr(chainSQL, txHash){ - return new Promise(function(resolve, reject){ - chainSQL.api.getTransaction(txHash).then(txDetail => { - let isMatch = false; - let calCtrAddr = calculateCtrAddr(txDetail.address, txDetail.sequence); - let affectedNodes = txDetail.specification.meta.AffectedNodes; - let suspectCtrAddr = ""; - for (let node of affectedNodes) { - if (node.hasOwnProperty("CreatedNode") && node.CreatedNode.NewFields.hasOwnProperty("ContractCode")) { - let createdNodeObj = node.CreatedNode; - suspectCtrAddr = createdNodeObj.NewFields.Account; - if(calCtrAddr === suspectCtrAddr){ - isMatch = true; - break; - } - } - // else continue; - } - if(isMatch){ - resolve(calCtrAddr); - } - else reject("Can not find Contract Address"); - }).catch(err => { - reject(err); - }); - }); + return new Promise(function(resolve, reject){ + chainSQL.api.getTransaction(txHash).then(txDetail => { + let isMatch = false; + let calCtrAddr = calculateCtrAddr(txDetail.address, txDetail.sequence); + let affectedNodes = txDetail.specification.meta.AffectedNodes; + let suspectCtrAddr = ""; + for (let node of affectedNodes) { + if (node.hasOwnProperty("CreatedNode") && node.CreatedNode.NewFields.hasOwnProperty("ContractCode")) { + let createdNodeObj = node.CreatedNode; + suspectCtrAddr = createdNodeObj.NewFields.Account; + if(calCtrAddr === suspectCtrAddr){ + isMatch = true; + break; + } + } + // else continue; + } + if(isMatch){ + resolve(calCtrAddr); + } + else reject("Can not find Contract Address"); + }).catch(err => { + reject(err); + }); + }); } function calculateCtrAddr(ctrOwnerAddr, sequence){ - let hexAddrStr = chainsqlUtils.decodeChainsqlAddr(ctrOwnerAddr).toUpperCase(); - let hexSeqStr = dec2FixLenHex(sequence, 2*4); - let hexFinalStr = hexAddrStr + hexSeqStr; - return keypairs.deriveAddress(hexFinalStr); + let hexAddrStr = chainsqlUtils.decodeChainsqlAddr(ctrOwnerAddr).toUpperCase(); + let hexSeqStr = dec2FixLenHex(sequence, 2*4); + let hexFinalStr = hexAddrStr + hexSeqStr; + return keypairs.deriveAddress(hexFinalStr); } function dec2FixLenHex(decVal, fixedLen){ - let hexStr = decVal.toString(16); - let paddingLen = fixedLen - hexStr.length; - for(let i = 0; i < paddingLen; i++){ - hexStr = '0' + hexStr; - } - return hexStr; + let hexStr = decVal.toString(16); + let paddingLen = fixedLen - hexStr.length; + for(let i = 0; i < paddingLen; i++){ + hexStr = '0' + hexStr; + } + return hexStr; } function encodeChainsqlAddrParam(types, result){ - types.map(function(item, index) { - if(item === "address"){ - result[index] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); - } - }); + types.map(function(item, index) { + if(item === "address"){ + result[index] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); + } + }); } function decodeChainsqlAddrParam(types, args){ - let newArgs = args.map(function(item, index) { - if(types[index] === "address"){ - item = chainsqlUtils.decodeChainsqlAddr(item).toUpperCase(); - } - return item; - }); - return newArgs; + let newArgs = args.map(function(item, index) { + if(types[index] === "address"){ + item = chainsqlUtils.decodeChainsqlAddr(item).toUpperCase(); + } + return item; + }); + return newArgs; } /** @@ -1018,9 +1023,9 @@ function decodeChainsqlAddrParam(types, args){ * @return {Function} the callback */ Contract.prototype._getCallback = function getCallback(args) { - if (args && _.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } + if (args && _.isFunction(args[args.length - 1])) { + return args.pop(); // modify the args array! + } }; /** @@ -1031,44 +1036,44 @@ Contract.prototype._getCallback = function getCallback(args) { * @param {Promise} defer */ Contract.prototype._processExecuteArguments = function _processExecuteArguments(args/*, defer*/) { - var processedArgs = {}; + var processedArgs = {}; - processedArgs.type = args.shift(); + processedArgs.type = args.shift(); - // get the callback - // processedArgs.callback = this._parent._getCallback(args); + // get the callback + // processedArgs.callback = this._parent._getCallback(args); - // get block number to use for call - //if(processedArgs.type === 'call' && args[args.length - 1] !== true && (_.isString(args[args.length - 1]) || isFinite(args[args.length - 1]))) - // processedArgs.defaultBlock = args.pop(); + // get block number to use for call + //if(processedArgs.type === 'call' && args[args.length - 1] !== true && (_.isString(args[args.length - 1]) || isFinite(args[args.length - 1]))) + // processedArgs.defaultBlock = args.pop(); - // get the options - processedArgs.options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; + // get the options + processedArgs.options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; - // get the generateRequest argument for batch requests - processedArgs.generateRequest = (args[args.length - 1] === true)? args.pop() : false; + // get the generateRequest argument for batch requests + processedArgs.generateRequest = (args[args.length - 1] === true)? args.pop() : false; - processedArgs.options = this._parent._getOrSetDefaultOptions(processedArgs.options); - processedArgs.options.data = this.encodeABI(); + processedArgs.options = this._parent._getOrSetDefaultOptions(processedArgs.options); + processedArgs.options.data = this.encodeABI(); - // add contract address - //if(!this._deployData && !utils.isAddress(this._parent.options.address)) - if(!this._deployData && !this._parent.options.address) - throw chainsqlError('This contract object doesn\'t have address set yet, please set an address first.'); + // add contract address + //if(!this._deployData && !utils.isAddress(this._parent.options.address)) + if(!this._deployData && !this._parent.options.address) + throw chainsqlError('This contract object doesn\'t have address set yet, please set an address first.'); - if(!this._deployData) { - processedArgs.options.to = this._parent.options.address; - processedArgs.options.isDeploy = false; - } - else { - processedArgs.options.isDeploy = true; - } + if(!this._deployData) { + processedArgs.options.to = this._parent.options.address; + processedArgs.options.isDeploy = false; + } + else { + processedArgs.options.isDeploy = true; + } - // return error, if no "data" is specified - //if(!processedArgs.options.data) - // return utils._fireError(new Error('Couldn\'t find a matching contract method, or the number of parameters is wrong.'), defer.eventEmitter, defer.reject, processedArgs.callback); + // return error, if no "data" is specified + //if(!processedArgs.options.data) + // return utils._fireError(new Error('Couldn\'t find a matching contract method, or the number of parameters is wrong.'), defer.eventEmitter, defer.reject, processedArgs.callback); - return processedArgs; + return processedArgs; }; module.exports = Contract; \ No newline at end of file From de5391c137531522b480a48031807297f01adcc6 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Fri, 9 Jul 2021 17:01:45 +0800 Subject: [PATCH 55/80] add default expect for contract deploy --- package.json | 2 +- src/smartContract.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 851199d..ad44942 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.8", + "version": "0.70.9", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/smartContract.js b/src/smartContract.js index 04e362b..1ee23b1 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -718,12 +718,12 @@ Contract.prototype._executeMethod = function _executeMethod(){ txCallbackProperty.callbackExpect = "send_success"; if(args.options.isDeploy) { sendTxPayment.ContractOpType = 1; - if (args.options.expect === "send_success") + if (args.options.hasOwnProperty("expect") && (args.options.expect === "send_success")) { errorMsg = "Contract deploy tx expect must be validate_success or db_success"; return errFuncGlobal(errorMsg, args.callback); } - txCallbackProperty.callbackExpect = args.options.expect; + txCallbackProperty.callbackExpect = args.options.hasOwnProperty("expect") ? args.options.expect : "validate_success"; } else { sendTxPayment.ContractOpType = 2; From 74258126a27fc22a81f7ab374083f342665966d6 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 12 Jul 2021 16:34:44 +0800 Subject: [PATCH 56/80] uniform error return format --- package.json | 2 +- src/smartContract.js | 3 +++ src/submit.js | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ad44942..73b2662 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.9", + "version": "0.70.10", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/smartContract.js b/src/smartContract.js index 1ee23b1..fd8e829 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -907,6 +907,9 @@ function submitContractTx(contractObj, signedVal, callbackProperty, resolve, rej if (data.hasOwnProperty("error_message")) { resultObj.error_message = data.error_message; } + if(data.hasOwnProperty("error")){ + resultObj.resultCode = data.error; + } return errFunc(resultObj); } } diff --git a/src/submit.js b/src/submit.js index 858e472..5b19ef7 100644 --- a/src/submit.js +++ b/src/submit.js @@ -119,7 +119,7 @@ Submit.prototype.handleSignedTx = function (ChainSQL, signed, expectOpt, resolve error.error_message = data.error_message; } if(data.hasOwnProperty("error")){ - error.error_code = data.error; + error.resultCode = data.error; } reject(error); } From 29c4fcba5408ff597ace312ad86192e6bee737f7 Mon Sep 17 00:00:00 2001 From: fangxiuxiu Date: Tue, 20 Jul 2021 18:59:28 +0800 Subject: [PATCH 57/80] Add pre-compiled contract test cases --- test/testContractTableTxs.js | 24 +- test/testPreCompiledContractTableTxs.js | 419 ++++++++++++++++++++++++ 2 files changed, 428 insertions(+), 15 deletions(-) create mode 100644 test/testPreCompiledContractTableTxs.js diff --git a/test/testContractTableTxs.js b/test/testContractTableTxs.js index 9fd3b82..e428a01 100644 --- a/test/testContractTableTxs.js +++ b/test/testContractTableTxs.js @@ -378,24 +378,18 @@ var table_get = async function () { }); var str = await myContract.methods.get(owner.address, sTableName, "", "name").call(); console.log(" get with field:", str); + //var raw = "[[],{\"id\":\"1\"}]"; + //var raw = "[[],{\"$or\":[{\"email\":\"123\"}, {\"name\": \"zhangsan\"}]}]"; + var raw = "{\"name\": { \"$regex\": \"/wangwu/\" }}"; + var str = await myContract.methods.get(owner.address, sTableName, raw).call(); + console.log(" get with field:", str); + var str = await myContract.methods.get(owner.address, sTableName, raw, "time").call(); + console.log(" get with field:", str); + } catch (error) { console.log(error) } - // myContract.methods.table(sTableName).get().submit(); - // console.log(" all record:", lll); - // myContract.methods.table(sTableName).get({ $or: [{ email: "123" }, { name: "zhangsan" }] }).submit(); - // console.log(" record (or)", lll); - // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).submit(); - // console.log(" regex record:", lll); - // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["COUNT(*) as count"]).submit(); - // console.log(" record count:", lll); - // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields([]).submit(); - // console.log(" record count:", lll); - // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).limit({ index: 0, total: 1 }).withFields([]).submit(); - // console.log(" record count(limit):", lll); - // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["account"]).submit(); - // console.log(" record with fields:", lll); -} + } var table_transaction = async function () { c.as(smUser) c.use(smRoot.address) diff --git a/test/testPreCompiledContractTableTxs.js b/test/testPreCompiledContractTableTxs.js new file mode 100644 index 0000000..e4b7e7f --- /dev/null +++ b/test/testPreCompiledContractTableTxs.js @@ -0,0 +1,419 @@ +'use strict' +const ChainsqlAPI = require('../src/index'); +const c = new ChainsqlAPI(); + +var root = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + +var issuer = { + secret: "xncmqYJG4P9iyaYUf6T81GHs9W1kn", + address: "zU42yDW3fzFjGWosdeVjVasyPsF4YHj224" +} + +var user = { + address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", + secret: "xnnUqirFepEKzVdsoBKkMf577upwT" +} + +var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; + +var sTableName = "n9"; +var sTableNameNew = "n4" +var rawTable = "[ \ + { \"field\": \"id\", \"type\": \"int\" }, \ + { \"field\": \"time\", \"type\": \"datetime\" }, \ + { \"field\": \"txHash\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"name\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"email\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"account\", \"type\": \"varchar\", \"length\": 40 } \ +]"; + +var rawInsert = "[ \ + { \"id\": 1, \"name\": \"zhangsan\", \"email\": \"123\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 2, \"name\": \"lisi\", \"email\": \"124\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 3, \"name\": \"wangwu\", \"email\": \"125\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 4, \"name\": \"zhaoliu\", \"email\": \"126\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" } \ +]"; + +var rawDelete = "{\"id\":1}" +var rawUpdate = "{ \"account\": \"134\" }" +var rawGet = "{\"id\": 2}" +var autoFillField = "dddd"; + +var myContract; + +const abi = '[{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"create","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"createByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"deletex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"deletexByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"}],"name":"drop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"}],"name":"dropByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"get","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"},{"internalType":"string","name":"field","type":"string"}],"name":"get","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"},{"internalType":"string","name":"field","type":"string"}],"name":"getByContract","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"getByContract","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWho","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"grant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWho","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"grantByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"insert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"insertByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"},{"internalType":"string","name":"autoFillField","type":"string"}],"name":"insertHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"},{"internalType":"string","name":"autoFillField","type":"string"}],"name":"insertHashByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"tableNameNew","type":"string"}],"name":"renameByContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"rawUpdate","type":"string"},{"internalType":"string","name":"rawGet","type":"string"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"rawUpdate","type":"string"},{"internalType":"string","name":"rawGet","type":"string"}],"name":"updateByContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]'; +// Bytecode 一定要加0x +const deployBytecode = '0x6080604052604051620016f3380380620016f383398101604081905262000026916200012f565b600080546001600160a01b031916611001908117909155604051636236be8d60e01b8152636236be8d90620000629085908590600401620001c7565b600060405180830381600087803b1580156200007d57600080fd5b505af115801562000092573d6000803e3d6000fd5b50505050505062000242565b600082601f830112620000b057600080fd5b81516001600160401b0380821115620000cd57620000cd6200022c565b604051601f8301601f19908116603f01168101908282118183101715620000f857620000f86200022c565b816040528381528660208588010111156200011257600080fd5b62000125846020830160208901620001f9565b9695505050505050565b600080604083850312156200014357600080fd5b82516001600160401b03808211156200015b57600080fd5b62000169868387016200009e565b935060208501519150808211156200018057600080fd5b506200018f858286016200009e565b9150509250929050565b60008151808452620001b3816020860160208601620001f9565b601f01601f19169290920160200192915050565b604081526000620001dc604083018562000199565b8281036020840152620001f0818562000199565b95945050505050565b60005b8381101562000216578181015183820152602001620001fc565b8381111562000226576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b6114a180620002526000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636c02d692116100b857806391025cb11161007c57806391025cb11461027157806399489c21146102845780639c7c722b14610297578063b24ab465146102aa578063cf22eb59146102bd578063f5ad5c85146102d057600080fd5b80636c02d69214610212578063746ecd69146102255780638b0a4ee1146102385780638d5df8021461024b5780638f44bd6a1461025e57600080fd5b80633a396228116100ff5780633a396228146101b3578063411304cb146101c65780635310b551146101d95780636236be8d146101ec5780636687a78d146101ff57600080fd5b8063023e38c41461013c57806313157a5514610151578063198e2b8a146101645780631ad5321a1461017757806331445f17146101a0575b600080fd5b61014f61014a366004611190565b6102e3565b005b61014f61015f3660046110ba565b61034b565b61014f610172366004611190565b6103b9565b61018a6101853660046110ba565b6103eb565b604051610197919061136e565b60405180910390f35b61014f6101ae3660046110ba565b61054e565b61014f6101c1366004611046565b610584565b61018a6101d4366004611046565b6105ef565b61014f6101e7366004611153565b61078d565b61014f6101fa366004611190565b6107f2565b61014f61020d366004611046565b610824565b61014f610220366004611046565b610858565b61014f610233366004611046565b61088c565b61014f610246366004611046565b6108bf565b61014f6102593660046110ba565b6108f3565b61014f61026c3660046110ba565b610929565b61014f61027f366004611153565b61095f565b61018a610292366004611046565b610c1b565b61014f6102a5366004611190565b610db9565b61014f6102b8366004611046565b610deb565b61018a6102cb3660046110ba565b610e1f565b61014f6102de366004611153565b610f6d565b60005460405163247f351560e01b81526001600160a01b039091169063247f3515906103159085908590600401611388565b600060405180830381600087803b15801561032f57600080fd5b505af1158015610343573d6000803e3d6000fd5b505050505050565b6000546040516313157a5560e01b81526001600160a01b03909116906313157a5590610381908790879087908790600401611319565b600060405180830381600087803b15801561039b57600080fd5b505af11580156103af573d6000803e3d6000fd5b5050505050505050565b60005460405163fc8b4adf60e01b81526001600160a01b039091169063fc8b4adf906103159085908590600401611388565b60008054604051632f4c2ce760e01b8152606092916001600160a01b031690632f4c2ce790610422908990899089906004016112d9565b60206040518083038186803b15801561043a57600080fd5b505afa15801561044e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047291906111f4565b90508061049a5760405162461bcd60e51b8152600401610491906113b6565b60405180910390fd5b600081ca60408051602081019091526000808252919250905b8281101561054257600084828880519060200181818486cf6020018060405190810160405281818585888acc95505050505050905082816040516020016104fb929190611239565b60405160208183030381529060405292508260405160200161051d9190611268565b604051602081830303815290604052925050808061053a9061144d565b9150506104b3565b50979650505050505050565b6000546040516331445f1760e01b81526001600160a01b03909116906331445f1790610381908790879087908790600401611319565b6000546040516307472c4560e31b81526001600160a01b0390911690633a396228906105b8908690869086906004016112d9565b600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b50505050505050565b60008054604051632f4c2ce760e01b8152606092916001600160a01b031690632f4c2ce790610626908890889088906004016112d9565b60206040518083038186803b15801561063e57600080fd5b505afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067691906111f4565b9050806106955760405162461bcd60e51b8152600401610491906113b6565b600081ca9050600082cb60408051602081019091526000808252919250905b838110156105425760005b83811015610757576000868383808284d0602001806040519081016040528181848688cd945050505050905083816040516020016106fe929190611239565b60408051601f19818403018152919052935061071b600186611406565b82146107445783604051602001610732919061128d565b60405160208183030381529060405293505b508061074f8161144d565b9150506106bf565b508160405160200161076991906112b3565b604051602081830303815290604052915080806107859061144d565b9150506106b4565b6000546040516318454c0760e11b81526001600160a01b039091169063308a980e906107bd90849060040161136e565b600060405180830381600087803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050505050565b600054604051636236be8d60e01b81526001600160a01b0390911690636236be8d906103159085908590600401611388565b600054604051630351a46360e61b81526001600160a01b039091169063d46918c0906105b8908690869086906004016112d9565b6000546040516336016b4960e11b81526001600160a01b0390911690636c02d692906105b8908690869086906004016112d9565b600054604051626c6cf160e31b81526001600160a01b03909116906303636788906105b8908690869086906004016112d9565b600054604051638b0a4ee160e01b81526001600160a01b0390911690638b0a4ee1906105b8908690869086906004016112d9565b600054604051631bf4faa160e01b81526001600160a01b0390911690631bf4faa190610381908790879087908790600401611319565b6000546040516312641bad60e31b81526001600160a01b0390911690639320dd6890610381908790879087908790600401611319565bc8336001600160a01b031681805190602001604051610a39907f5b7b226669656c64223a226964222c20227479706522203a2022696e74222c2081527f226c656e67746822203a2031312c2022504b22203a20312c20224e4e22203a2060208201527f312c2022555122203a20317d2c207b20226669656c64223a226163636f756e7460408201527f222c20227479706522203a20227661726368617222207d2c207b20226669656c60608201527f64223a22616765222c20227479706522203a2022696e7422207d5d00000000006080820152609b0190565b604051809103908181016040528181858588c0945050505050158015610a63573d6000803e3d6000d15b50336001600160a01b031681805190602001604051610b10907f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681527f6a566173795073463459486a323234222c20226964223a317d2c207b2261636360208201527f6f756e74223a227a55343279445733667a466a47576f736465566a566173795060408201527573463459486a323234222c202020226964223a327d5d60501b606082015260760190565b604051809103908181016040528181858588c3945050505050158015610b3a573d6000803e3d6000d15b508051604051677b226964223a317d60c01b81523391906020840190600801604051809103908181016040528181858588c4945050505050158015610b83573d6000803e3d6000d15b508051604051727b226163636f756e74223a2269643d3d32227d60681b8152339190602084019060130160405180910390818101604052604051610bd690687b226964223a20327d60b81b815260090190565b604051809103908181016040528181858589898cc59650505050505050158015610c04573d6000803e3d6000d15b50c9158015610c17573d6000803e3d6000d15b5050565b600080546040516355b54bf560e11b8152606092916001600160a01b03169063ab6a97ea90610c52908890889088906004016112d9565b60206040518083038186803b158015610c6a57600080fd5b505afa158015610c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca291906111f4565b905080610cc15760405162461bcd60e51b8152600401610491906113b6565b600081ca9050600082cb60408051602081019091526000808252919250905b838110156105425760005b83811015610d83576000868383808284d0602001806040519081016040528181848688cd94505050505090508381604051602001610d2a929190611239565b60408051601f198184030181529190529350610d47600186611406565b8214610d705783604051602001610d5e919061128d565b60405160208183030381529060405293505b5080610d7b8161144d565b915050610ceb565b5081604051602001610d9591906112b3565b60405160208183030381529060405291508080610db19061144d565b915050610ce0565b600054604051634e8f306d60e11b81526001600160a01b0390911690639d1e60da906103159085908590600401611388565b60005460405163b24ab46560e01b81526001600160a01b039091169063b24ab465906105b8908690869086906004016112d9565b600080546040516355b54bf560e11b8152606092916001600160a01b03169063ab6a97ea90610e56908990899089906004016112d9565b60206040518083038186803b158015610e6e57600080fd5b505afa158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea691906111f4565b905080610ec55760405162461bcd60e51b8152600401610491906113b6565b600081ca60408051602081019091526000808252919250905b8281101561054257600084828880519060200181818486cf6020018060405190810160405281818585888acc9550505050505090508281604051602001610f26929190611239565b604051602081830303815290604052925082604051602001610f489190611268565b6040516020818303038152906040529250508080610f659061144d565b915050610ede565b6000546040516357a78d9f60e11b81526001600160a01b039091169063af4f1b3e906107bd90849060040161136e565b80356001600160a01b0381168114610fb457600080fd5b919050565b600082601f830112610fca57600080fd5b813567ffffffffffffffff80821115610fe557610fe561147e565b604051601f8301601f19908116603f0116810190828211818310171561100d5761100d61147e565b8160405283815286602085880101111561102657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561105b57600080fd5b61106484610f9d565b9250602084013567ffffffffffffffff8082111561108157600080fd5b61108d87838801610fb9565b935060408601359150808211156110a357600080fd5b506110b086828701610fb9565b9150509250925092565b600080600080608085870312156110d057600080fd5b6110d985610f9d565b9350602085013567ffffffffffffffff808211156110f657600080fd5b61110288838901610fb9565b9450604087013591508082111561111857600080fd5b61112488838901610fb9565b9350606087013591508082111561113a57600080fd5b5061114787828801610fb9565b91505092959194509250565b60006020828403121561116557600080fd5b813567ffffffffffffffff81111561117c57600080fd5b61118884828501610fb9565b949350505050565b600080604083850312156111a357600080fd5b823567ffffffffffffffff808211156111bb57600080fd5b6111c786838701610fb9565b935060208501359150808211156111dd57600080fd5b506111ea85828601610fb9565b9150509250929050565b60006020828403121561120657600080fd5b5051919050565b6000815180845261122581602086016020860161141d565b601f01601f19169290920160200192915050565b6000835161124b81846020880161141d565b83519083019061125f81836020880161141d565b01949350505050565b6000825161127a81846020870161141d565b603b60f81b920191825250600101919050565b6000825161129f81846020870161141d565b61016160f51b920191825250600201919050565b600082516112c581846020870161141d565b611d8560f11b920191825250600201919050565b6001600160a01b03841681526060602082018190526000906112fd9083018561120d565b828103604084015261130f818561120d565b9695505050505050565b6001600160a01b038516815260806020820181905260009061133d9083018661120d565b828103604084015261134f818661120d565b90508281036060840152611363818561120d565b979650505050505050565b602081526000611381602083018461120d565b9392505050565b60408152600061139b604083018561120d565b82810360208401526113ad818561120d565b95945050505050565b60208082526030908201527f476574207461626c652064617461206661696c65642c6d61796265207573657260408201526f206e6f7420617574686f72697a65642160801b606082015260800190565b60008282101561141857611418611468565b500390565b60005b83811015611438578181015183820152602001611420565b83811115611447576000848401525b50505050565b600060001982141561146157611461611468565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea164736f6c6343000805000a'; +const contractAddr = "zJ6s4T2zLtFBTjZqnLZfN1cuoCWPqfdEsa"; +//solidity code: + +var tagStep = { + active: 1, table_create: 2, table_create_operationRule: 3, + table_rename: 4, table_grant: 5, table_drop: 6, + table_insert: 7, table_insert_operationRule: 8, table_delete: 9, + table_update: 10, table_get: 11, table_transaction: 12, deployContract: 13, + table_insert_hash: 14 +} + + +main(); +async function main() { + + // var wsAddress = 'ws://localhost:5510'; + var wsAddress = 'ws://10.100.0.78:25510'; + let res = await c.connect(wsAddress); + console.log(" connect successfully.") + c.setRestrict(true); + + let isContract = true; + let nStep = tagStep.table_insert; + + if (nStep != tagStep.deployContract) { + myContract = c.contract(JSON.parse(abi), contractAddr); + } + if(isContract){ + switch (nStep) { + case tagStep.deployContract: deployContract(); break; + case tagStep.table_create: table_create_by_contract(); break; + case tagStep.table_rename: table_rename_by_contract(); break; + case tagStep.table_grant: table_grant_by_contract(); break; + case tagStep.table_drop: drop_by_contract(); break; + case tagStep.table_insert: table_insert_by_contract(); break; + case tagStep.table_insert_hash: table_insert_hash_by_contract(); break; + case tagStep.table_delete: table_delete_by_contract(); break; + case tagStep.table_update: table_update_by_contract(); break; + case tagStep.table_get: table_get_by_contract(); break; + default: break; + } + }else{ + switch (nStep) { + case tagStep.table_create: table_create(); break; + case tagStep.table_rename: table_rename(); break; + case tagStep.table_grant: table_grant(); break; + case tagStep.table_drop: drop(); break; + case tagStep.table_insert: table_insert(); break; + case tagStep.table_insert_hash: table_insert_hash(); break; + case tagStep.table_delete: table_delete(); break; + case tagStep.table_update: table_update(); break; + case tagStep.table_get: table_get(); break; + default: break; + } + } + + /**************************************/ +} + + //合约部署并创建表,同时给合约地址转足够的ZXC,否则部署失败 +async function deployContract() { + c.as(user) + myContract = c.contract(JSON.parse(abi)); + try { + let deployRes = await myContract.deploy( + { + ContractData: deployBytecode, + arguments:[sTableName,rawTable], + }).submit({ + Gas: '3000000', + ContractValue: "90000000", + }); + console.log("deployContract Res:", deployRes); + if (deployRes.contractAddress != "undefined") { + console.log("contractAddress:", deployRes.contractAddress); + } + } catch (error) { + console.log(error); + } +} + +// 给合约地址创建表 +var table_create_by_contract = async function () { + c.as(user) + //发交易调用合约 + try { + myContract.methods.createByContract(sTableNameNew, rawTable).submit({ + Gas: 500000, + expect: "db_success" + }, (err, res) => { + err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); + }); + + } catch (error) { + console.log(error); + } +} + +// 删除合约地址的表 +var drop_by_contract = async function () { + c.as(user) + //发交易调用合约 + try { + myContract.methods.dropByContract(sTableName).submit({ + Gas: 500000, + expect: "db_success" + }, (err, res) => { + err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); + }); + + } catch (error) { + console.log(error); + } +} + +var table_rename_by_contract = async function () { + c.as(user) + try { + myContract.methods.renameByContract(sTableName, sTableNameNew).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log(" renameTable res:", err) : console.log(" renameTable res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_insert_by_contract = async function () { + c.as(user) + try { + myContract.methods.insertByContract(contractAddr, sTableName, rawInsert).submit({ + Gas: 5000000, + expect: "db_success" + }, (err, res) => { + err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_grant_by_contract = async function () { + c.as(user) + try { + myContract.methods.grantByContract(user.address, sTableName, flag).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("grant res:", err) : console.log("grant res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_insert_hash_by_contract = async function () { + c.as(user) + try { + myContract.methods.insertHashByContract(contractAddr, sTableName, rawInsert,autoFillField).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("grant res:", err) : console.log("grant res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_delete_by_contract = async function () { + c.as(user) + try { + myContract.methods.deletexByContract(contractAddr, sTableName, rawDelete).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log(" deletex res:", err) : console.log(" deletex res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_update_by_contract = async function () { + c.as(user) + try { + myContract.methods.updateByContract(contractAddr, sTableName, rawUpdate, rawGet).submit({ + Gas: 500000, + expect: "db_success" + }, (err, res) => { + if (err) { + console.log(" update", err); + } + else { + console.log(" update", res); + } + }); + } catch (error) { + console.log(error); + } +} +var table_get_by_contract = async function () { + c.as(user) + try { + myContract.methods.getByContract(contractAddr, sTableName, "").call((err, str) => { + err ? console.log(" get handle err:", err) : console.log(" get:", str); + }); + var str = await myContract.methods.getByContract(contractAddr, sTableName, "", "name").call(); + console.log(" get with field:", str); + //var raw = "[[],{\"id\":\"2\"}]"; + //var raw = "[[],{\"$or\":[{\"email\":\"126\"}, {\"name\": \"zhangsan\"}]}]"; + var raw = "[[],{\"name\": { \"$regex\": \"/wangwu/\" }}]"; + var str = await myContract.methods.getByContract(contractAddr, sTableName, raw).call((err, str) => { + err ? console.log(" get handle err:", err) : console.log(" get:", str); + }); + var str = await myContract.methods.getByContract(contractAddr, sTableName, raw, "time").call(); + console.log("get with field:", str); + + } catch (error) { + console.log(error) + } + } + +var table_create = async function () { + c.as(user) + //发交易调用合约 + try { + myContract.methods.create(sTableName, rawTable).submit({ + Gas: 300000, + expect: "db_success" + }, (err, res) => { + err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); + }); + + } catch (error) { + console.log(error); + } +} + + +var drop = async function () { + c.as(user) + //发交易调用合约 + try { + myContract.methods.drop(sTableName).submit({ + Gas: 500000, + expect: "db_success" + }, (err, res) => { + err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); + }); + + } catch (error) { + console.log(error); + } +} + +var table_rename = async function () { + c.as(user) + try { + myContract.methods.rename(sTableName, sTableNameNew).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log(" renameTable res:", err) : console.log(" renameTable res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_insert = async function () { + c.as(user) + try { + myContract.methods.insert(user.address, sTableName, rawInsert).submit({ + Gas: 5000000, + expect: "db_success" + }, (err, res) => { + err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_grant = async function () { + c.as(user) + try { + myContract.methods.grant(user.address, sTableName, flag).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("grant res:", err) : console.log("grant res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_insert_hash = async function () { + c.as(user) + try { + myContract.methods.insertHash(user.address, sTableName, rawInsert,autoFillField).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("grant res:", err) : console.log("grant res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_delete = async function () { + c.as(user) + try { + myContract.methods.deletex(user.address, sTableName, rawDelete).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log(" deletex res:", err) : console.log(" deletex res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var table_update = async function () { + c.as(user) + try { + myContract.methods.update(user.address, sTableName, rawUpdate, rawGet).submit({ + Gas: 500000, + expect: "db_success" + }, (err, res) => { + if (err) { + console.log(" update", err); + } + else { + console.log(" update", res); + } + }); + } catch (error) { + console.log(error); + } +} +var table_get = async function () { + c.as(user) + try { + myContract.methods.get(user.address, sTableName, "").call((err, str) => { + err ? console.log(" get handle err:", err) : console.log(" get:", str); + }); + var str = await myContract.methods.get(user.address, sTableName, "", "name").call(); + console.log(" get with field:", str); + //var raw = "[[],{\"id\":\"2\"}]"; + //var raw = "[[],{\"$or\":[{\"email\":\"126\"}, {\"name\": \"zhangsan\"}]}]"; + var raw = "[[],{\"name\": { \"$regex\": \"/wangwu/\" }}]"; + var str = await myContract.methods.get(user.address, sTableName, raw).call((err, str) => { + err ? console.log(" get handle err:", err) : console.log(" get:", str); + }); + var str = await myContract.methods.get(user.address, sTableName, raw, "time").call(); + console.log("get with field:", str); + + } catch (error) { + console.log(error) + } + } + + + From 61cefcacd16ee8bfff87c6d0c0e2eaa0218a44e2 Mon Sep 17 00:00:00 2001 From: fangxiuxiu Date: Fri, 23 Jul 2021 16:09:30 +0800 Subject: [PATCH 58/80] Modify the pre-compiled contract test --- test/testPreCompiledContractTableTxs.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/testPreCompiledContractTableTxs.js b/test/testPreCompiledContractTableTxs.js index e4b7e7f..28d72f0 100644 --- a/test/testPreCompiledContractTableTxs.js +++ b/test/testPreCompiledContractTableTxs.js @@ -40,7 +40,7 @@ var rawInsert = "[ \ var rawDelete = "{\"id\":1}" var rawUpdate = "{ \"account\": \"134\" }" var rawGet = "{\"id\": 2}" -var autoFillField = "dddd"; +var autoFillField = "txHash"; var myContract; @@ -154,7 +154,7 @@ var drop_by_contract = async function () { Gas: 500000, expect: "db_success" }, (err, res) => { - err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); + err ? console.log(" dropTable res:", err) : console.log(" dropTable res:", res); }); } catch (error) { @@ -183,7 +183,7 @@ var table_insert_by_contract = async function () { Gas: 5000000, expect: "db_success" }, (err, res) => { - err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); + err ? console.log(" insert res:", err) : console.log(" insertTable res:", res); }); } catch (error) { console.log(error); @@ -211,7 +211,7 @@ var table_insert_hash_by_contract = async function () { Gas: 500000, expect: "validate_success" }, (err, res) => { - err ? console.log("grant res:", err) : console.log("grant res:", res); + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); }); } catch (error) { console.log(error); @@ -297,7 +297,7 @@ var drop = async function () { Gas: 500000, expect: "db_success" }, (err, res) => { - err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); + err ? console.log(" dropTable res:", err) : console.log(" dropTable res:", res); }); } catch (error) { @@ -326,7 +326,7 @@ var table_insert = async function () { Gas: 5000000, expect: "db_success" }, (err, res) => { - err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); + err ? console.log(" insert res:", err) : console.log(" insertTable res:", res); }); } catch (error) { console.log(error); @@ -354,7 +354,7 @@ var table_insert_hash = async function () { Gas: 500000, expect: "validate_success" }, (err, res) => { - err ? console.log("grant res:", err) : console.log("grant res:", res); + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); }); } catch (error) { console.log(error); From 5fe6039f3bfe19d76e0b84c6a5b5d8313eb42271 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 4 Aug 2021 11:06:01 +0800 Subject: [PATCH 59/80] fix contract param for tuple only --- package.json | 2 +- src/smartContract.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 73b2662..82d4c7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.10", + "version": "0.70.11", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/smartContract.js b/src/smartContract.js index fd8e829..1a0a20e 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -363,7 +363,7 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { signature = json.signature; } return _.isArray(json.inputs) ? json.inputs.map(function (input) { - if (input.type === "tuple[]") return input; + if (input.type === "tuple[]" || input.type === "tuple") return input; return input.type; }) : []; }).map(function (types) { let newArgs = decodeChainsqlAddrParam(types, args); From 63dae26170f27558252dcf2beb0ce49eff516732 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 6 Aug 2021 11:08:51 +0800 Subject: [PATCH 60/80] 1.Change signFromString to signFromHexString 2. Add method signBytes --- src/index.js | 9 ++++++++- test/testSignatureVerify.js | 10 +++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index e5efdb9..f60f239 100644 --- a/src/index.js +++ b/src/index.js @@ -1063,13 +1063,20 @@ ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,include }; -ChainsqlAPI.prototype.signFromString = function (messageHex, secret) { +ChainsqlAPI.prototype.signFromHexString = function (messageHex, secret) { var keypair = keypairs.deriveKeypair(secret); var signatue = keypairs.sign(messageHex,keypair.privateKey); return signatue; }; +ChainsqlAPI.prototype.signBytes = function (bytes, secret) { + + var keypair = keypairs.deriveKeypair(secret); + var signatue = keypairs.signBytes(bytes,keypair.privateKey); + return signatue; +}; + ChainsqlAPI.prototype.verify = function (messageHex, signature, publicKey) { diff --git a/test/testSignatureVerify.js b/test/testSignatureVerify.js index 593f06a..694d039 100644 --- a/test/testSignatureVerify.js +++ b/test/testSignatureVerify.js @@ -3,6 +3,7 @@ const ChainsqlAPI = require('../src/index'); const assert = require('assert'); +const { sign } = require('chainsql-keypairs/distrib/npm'); const c = new ChainsqlAPI(); var user = { @@ -17,10 +18,13 @@ main(); var secret = "xnoz9Le8yENN7U3fWxoeMymnT31XD"; var hexMsg = Buffer.from("hello world").toString('hex'); - var signature = c.signFromString(hexMsg,secret); + var signature = c.signFromHexString(hexMsg,secret); - - assert.equal(signature,"3045022100BDC5E1154B68B6A9FFD7F7CA36CF3B79D0BF0EDF186D09D460E537EAB9BEB31002204F54BCE76918B4F7415319E62B19A2B1F7200234F049FBD524C61EB5DD4965AA"); + var signatureRight = "3045022100BDC5E1154B68B6A9FFD7F7CA36CF3B79D0BF0EDF186D09D460E537EAB9BEB31002204F54BCE76918B4F7415319E62B19A2B1F7200234F049FBD524C61EB5DD4965AA"; + assert.equal(signature,signatureRight); + var bytes = Buffer.from("hello world").toString("ascii"); + signature = c.signBytes(bytes,secret); + assert.equal(signature,signatureRight); } function testVerify(){ From 358056bb52eb3e61f814d37c4c5006002b8eb50e Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 6 Aug 2021 18:01:54 +0800 Subject: [PATCH 61/80] 1. Adjust member name of table 2. Upgrade version number to 0.70.12 --- package.json | 2 +- src/table.js | 38 ++++++++++++++++---------------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 82d4c7a..8836783 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.11", + "version": "0.70.12", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/table.js b/src/table.js index 34adee7..3a64ca4 100644 --- a/src/table.js +++ b/src/table.js @@ -4,13 +4,7 @@ const chainsqlError = require('../lib/error'); var Submit = require('./submit'); const util = require('../lib/util'); const convertStringToHex = util.convertStringToHex; -const getTableSequence = util.getTableSequence; -const getUserToken = util.getUserToken; -const getTxJson = util.getTxJson; -const generateToken = util.generateToken; -const decodeToken = util.decodeToken; const tryEncryptRaw = util.tryEncryptRaw; -const crypto = require('../lib/crypto'); class Table extends Submit { constructor(name, ChainsqlAPI) { @@ -18,12 +12,14 @@ class Table extends Submit { this.tab = name; this.query = []; this.exec = ''; - this.field = null; this.connect = ChainsqlAPI.connect; this.cache = []; this.nameInDB = ''; this.confidential = true; this.txsHashFillField = null; + this.txHashField = null; + this.ledgerSeqField = null; + this.ledgerTimeField = null; } submit (cb) { @@ -68,7 +64,7 @@ Table.prototype.insert = function(raw, autoField ,txsHashFillField) { if (this.exec !== '' && this.exec !== 'r_insert') throw chainsqlError('Object can not hava function insert'); var that = this; if (autoField) { - this.field = autoField; + this.txHashField = autoField; } if (txsHashFillField) { @@ -105,7 +101,7 @@ Table.prototype.update = function(raw,field,txsHashFillField) { this.query.unshift(raw); if (field) { - this.field = field; + this.txHashField = field; } if (txsHashFillField) { @@ -409,7 +405,7 @@ Table.prototype.prepareJson = function() { var connect = this.connect; var that = this; - var payment = { + var tx_json = { address: connect.address, owner: connect.scope, opType: opType[that.exec], @@ -423,20 +419,18 @@ Table.prototype.prepareJson = function() { }], tsType: 'SQLStatement' }; - if ( (that.exec == 'r_insert' || that.exec == 'r_update') ) { - - if(that.field){ - payment.autoFillField = convertStringToHex(that.field); - } - - if ( that.txsHashFillField) { - payment.txsHashFillField = convertStringToHex(that.txsHashFillField); - } - - } return new Promise(function (resolve, reject) { - prepareTable(that, payment, resolve, reject); + if ( (that.exec == 'r_insert' || that.exec == 'r_update') ) { + if(that.txHashField){ + tx_json.autoFillField = convertStringToHex(that.txHashField); + } + + if ( that.txsHashFillField) { + tx_json.txsHashFillField = convertStringToHex(that.txsHashFillField); + } + } + prepareTable(that, tx_json, resolve, reject); }); } From 710fa6f2f4a8349313d05024d6d0f8a80d0645a2 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Sat, 7 Aug 2021 10:08:30 +0800 Subject: [PATCH 62/80] 1. Support ledgerSeqField and ledgerTimeField for insert and update 2. Add example for ledgerTimeField and ledgerSeqField --- src/table.js | 33 ++++++++++++++++++++++++++------- src/tablePayment.js | 2 ++ test/test.js | 34 ++++++++++++++++++++++------------ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/table.js b/src/table.js index 3a64ca4..c04ea23 100644 --- a/src/table.js +++ b/src/table.js @@ -59,17 +59,25 @@ class Table extends Submit { } } -Table.prototype.insert = function(raw, autoField ,txsHashFillField) { + +Table.prototype.insert = function(raw, autoField ,txsHashFillField,optFields) { if (!this.tab) throw chainsqlError('you must appoint the table name'); if (this.exec !== '' && this.exec !== 'r_insert') throw chainsqlError('Object can not hava function insert'); var that = this; if (autoField) { this.txHashField = autoField; } - if (txsHashFillField) { this.txsHashFillField = txsHashFillField; } + if(optFields){ + if(optFields.ledgerSeqField){ + this.ledgerSeqField = optFields.ledgerSeqField; + } + if(optFields.ledgerTimeField){ + this.ledgerTimeField = optFields.ledgerTimeField; + } + } if (Object.prototype.toString.call(raw) === '[object Array]') { raw.forEach(function(item) { @@ -95,7 +103,7 @@ Table.prototype.insert = function(raw, autoField ,txsHashFillField) { } } -Table.prototype.update = function(raw,field,txsHashFillField) { +Table.prototype.update = function(raw,field,txsHashFillField,optFields) { if (!this.tab) throw chainsqlError('you must appoint the table name'); if (this.exec !== 'r_get') throw chainsqlError('Object can not hava function update'); this.query.unshift(raw); @@ -103,11 +111,17 @@ Table.prototype.update = function(raw,field,txsHashFillField) { if (field) { this.txHashField = field; } - if (txsHashFillField) { this.txsHashFillField = txsHashFillField; } - + if(optFields){ + if(optFields.ledgerSeqField){ + this.ledgerSeqField = optFields.ledgerSeqField; + } + if(optFields.ledgerTimeField){ + this.ledgerTimeField = optFields.ledgerTimeField; + } + } this.exec = 'r_update'; if (this.transaction) { this.cache.push({ @@ -425,10 +439,15 @@ Table.prototype.prepareJson = function() { if(that.txHashField){ tx_json.autoFillField = convertStringToHex(that.txHashField); } - - if ( that.txsHashFillField) { + if (that.txsHashFillField) { tx_json.txsHashFillField = convertStringToHex(that.txsHashFillField); } + if(that.ledgerSeqField){ + tx_json.ledgerSeqField = convertStringToHex(that.ledgerSeqField); + } + if(that.ledgerTimeField){ + tx_json.ledgerTimeField = convertStringToHex(that.ledgerTimeField); + } } prepareTable(that, tx_json, resolve, reject); }); diff --git a/src/tablePayment.js b/src/tablePayment.js index 297e5da..be03904 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -63,6 +63,8 @@ function createPaymentTransaction(paymentArgument) { StrictMode: payment.strictMode, OperationRule: payment.operationRule, TxsHashFillField:payment.txsHashFillField, + LedgerSeqField:payment.ledgerSeqField, + LedgerTimeField:payment.ledgerTimeField } return txJSON; } diff --git a/test/test.js b/test/test.js index 39d845d..b616e1c 100644 --- a/test/test.js +++ b/test/test.js @@ -57,7 +57,7 @@ var smUser7 ={ // publicKey: 'pYvhKdDqBnGzXc4Ff1wutzc7z3z2UcN4aPxMPN1pW66…hkDLmoHFRkGmBaz2fzdjZsXW85FCgHFVw3VqeGGVfQt' // } -var sTableName = "jmtable5"; +var sTableName = "jmtable6"; var sTableName2 = "b1"; var sReName = "jmtable2"; var sTableName3 = "hijack12"; @@ -69,7 +69,7 @@ main(); async function main(){ try { - await c.connect('ws://192.168.29.69:46006'); + await c.connect('ws://127.0.0.1:6006'); // let accountInfo = c.generateAddress({algorithm:"softGMAlg",secret:smUser7.secret}); // console.log(JSON.stringify(accountInfo)) @@ -229,8 +229,9 @@ async function testTableSet(){ } async function testChainsql(){ - - await testInsert() + // await testCreateTable(); + await testInsert(); + // await testUpdate(); // await testDelete(); // await testRename(); // await testGet(); @@ -315,11 +316,13 @@ var testCreateTable = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1}, {'field':'name','type':'varchar','length':50,'default':""}, - {'field':'age','type':'int'}, - {'field':'age1','type':'longtext'} + {'field':'txhash','type':'varchar','length':64}, + {'field':'txhashes','type':'varchar','length':640}, + {'field':'createTime','type':'datetime'}, + {'field':'updateTime','type':'datetime'} ] var option = { - confidential: true + confidential: false } // 创建表 let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); @@ -368,12 +371,16 @@ var testCreateTable1 = async function() { var testInsert = async function() { var raw = [ - {'id':7}, - {'id':8}, - {'id':9} + { + 'id':8, + 'name':'hello' + } ]; + var opt = { + ledgerTimeField:"createTime" + } try { - var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + var rs = await c.table(sTableName).insert(raw,'txhash','txhashes',opt).submit({expect:'db_success'}); console.log("testInsert ",rs); } catch (error) { console.error(error); @@ -382,7 +389,10 @@ var testInsert = async function() { var testUpdate = async function(){ try { - var rs = await c.table(sTableName).get({'id': 7}).update({'name':"28"},"name","txnField").submit({expect:'db_success'}); + var opt = { + ledgerTimeField:"updateTime" + } + var rs = await c.table(sTableName).get({'id': 7}).update({'name':"28"},"txhash","txhashes",opt).submit({expect:'db_success'}); console.log("testUpdate",rs); } catch (error) { console.error(error); From db212092d9ce1c04f51213e86b147f064f1ed8c3 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Sat, 7 Aug 2021 10:28:41 +0800 Subject: [PATCH 63/80] Upgrade version to 0.70.13 --- package.json | 2 +- test/test.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8836783..354d46b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.12", + "version": "0.70.13", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/test/test.js b/test/test.js index b616e1c..18ba76f 100644 --- a/test/test.js +++ b/test/test.js @@ -57,7 +57,7 @@ var smUser7 ={ // publicKey: 'pYvhKdDqBnGzXc4Ff1wutzc7z3z2UcN4aPxMPN1pW66…hkDLmoHFRkGmBaz2fzdjZsXW85FCgHFVw3VqeGGVfQt' // } -var sTableName = "jmtable6"; +var sTableName = "jmtable7"; var sTableName2 = "b1"; var sReName = "jmtable2"; var sTableName3 = "hijack12"; @@ -316,6 +316,7 @@ var testCreateTable = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1}, {'field':'name','type':'varchar','length':50,'default':""}, + {'field':'seq','type':'int','length':10}, {'field':'txhash','type':'varchar','length':64}, {'field':'txhashes','type':'varchar','length':640}, {'field':'createTime','type':'datetime'}, @@ -372,12 +373,13 @@ var testCreateTable1 = async function() { var testInsert = async function() { var raw = [ { - 'id':8, + 'id':9, 'name':'hello' } ]; var opt = { - ledgerTimeField:"createTime" + ledgerTimeField:"createTime", + ledgerSeqField:"seq" } try { var rs = await c.table(sTableName).insert(raw,'txhash','txhashes',opt).submit({expect:'db_success'}); From 68f325f375552647ce23bcde53cc3bde57b7e249 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Fri, 20 Aug 2021 17:21:46 +0800 Subject: [PATCH 64/80] auto pad 0 for ecdh value on left --- lib/crypto.js | 32 ++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index 9becf93..5840266 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -50,10 +50,18 @@ function eciesEncrypt(message, publicKey) { //var Z = alice.computeSecret(ecdsaRecipientPublicKey.getPublic('hex'), 'hex'); var Z = ephPrivKey.derive(ecdsaRecipientPublicKey.pub); - //console.log('[Z]: %j', Z); - //console.log('Z computed', Z.length); - // console.log('secret: ', Buffer.from(Z.toArray(), 'hex')); - var kdfOutput = hashjs.sha512().update(Z.toArray()).digest(); + let zArray = Z.toArray(); + if(zArray.length > 32) { + throw new Error('ECDH error!'); + } + else if(zArray.length < 32) { + let padNum = 32 - zArray.length; + for(let num = 0; num < padNum; num ++) + { + zArray.unshift(0); + } + } + var kdfOutput = hashjs.sha512().update(zArray).digest(); //var kdfOutput = hkdf(Z.toArray(), ECIESKDFOutput, null, null); //console.log('[kdfOutput]: ', new Buffer(kdfOutput).toString('hex') +" len="+kdfOutput.length); var aesKey = kdfOutput.slice(0, AESKeyLength); @@ -94,11 +102,19 @@ function eciesDecrypt(messageHex, privateKey) { var ephPubKey = ecdsa.keyFromPublic(Rb.toString('hex'), 'hex'); //var encPrivKey = ecdsa.keyFromPrivate(ecKeypair2.prvKeyObj.prvKeyHex, 'hex'); var privKey = ecdsa.keyFromPrivate(privateKey, 'hex'); - // debug('computing Z...', privKey, ephPubKey); var Z = privKey.derive(ephPubKey.pub); - //console.log('Z computed', Z); - //console.log('secret: ', new Buffer(Z.toArray(), 'hex')); - var kdfOutput = hashjs.sha512().update(Z.toArray()).digest(); + let zArray = Z.toArray(); + if(zArray.length > 32) { + throw new Error('ECDH error!'); + } + else if(zArray.length < 32) { + let padNum = 32 - zArray.length; + for(let num = 0; num < padNum; num ++) + { + zArray.unshift(0); + } + } + var kdfOutput = hashjs.sha512().update(zArray).digest(); //var kdfOutput = hkdf(Z.toArray(), ECIESKDFOutput, null, null); var aesKey = kdfOutput.slice(0, AESKeyLength); var hmacKey = kdfOutput.slice(AESKeyLength, AESKeyLength + HMACKeyLength); diff --git a/package.json b/package.json index 354d46b..2efb645 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.13", + "version": "0.70.14", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From cfa14060fc77ac462be2922921df10afa2a65c8e Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 30 Aug 2021 11:00:49 +0800 Subject: [PATCH 65/80] remove old table tx field --- src/eventManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eventManager.js b/src/eventManager.js index 626db61..923ba44 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -249,7 +249,7 @@ function _decryptData(pass,tx){ if(tx.Raw){ if(pass){ - const algType = tx.publicKey.slice(0,2) === "47" ? "gmAlg" : "aes"; + const algType = tx.SigningPubKey.slice(0,2) === "47" ? "gmAlg" : "aes"; tx.Raw = crypto.symDecrypt(pass, tx.Raw, algType); }else{ tx.Raw = util.convertHexToString(tx.Raw); From 71067a88fe14679fff355103e5b52bd3a12c454e Mon Sep 17 00:00:00 2001 From: luleigreat Date: Mon, 30 Aug 2021 15:13:39 +0800 Subject: [PATCH 66/80] remove invalid ',' in json --- src/eventManager.js | 2 +- src/index.js | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/eventManager.js b/src/eventManager.js index 923ba44..95635ee 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -31,7 +31,7 @@ EventManager.prototype.subscribeTx = function(id, cb) { var messageTx = { "command": "subscribe", - "transaction": id, + "transaction": id }; if (!that.onMessage) { _onMessage(that); diff --git a/src/index.js b/src/index.js index f60f239..0e2b4cf 100644 --- a/src/index.js +++ b/src/index.js @@ -36,13 +36,6 @@ class ChainsqlAPI extends Submit { this.query = {}; this.exec = ''; this.token = ''; - this.perm = { - insert: 'lsfInsert', - delete: 'lsfDelete', - update: 'lsfUpdate', - select: 'lsfSelect', - execute: 'lsfExecute' - }; this.transaction = false; this.schemaCreateTx = false; this.schemaModifyTx = false; @@ -432,7 +425,7 @@ function modifyTable(ChainSQL,optype,name,raw){ } }], raw: JSON.stringify(raw), - tsType: 'TableListSet', + tsType: 'TableListSet' }; return ChainSQL; From a6d8388ef79dafdbd674bd3a1840d56802116e51 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 31 Aug 2021 10:02:13 +0800 Subject: [PATCH 67/80] 1. move all source code to 'src' 2. use protobuf js file instead of .proto directly 3. use es5 syntas when publish 4. upgrade version to 0.70.16 --- .babelrc | 4 + package.json | 36 +- src/eventManager.js | 4 +- src/index.js | 10 +- {lib => src/lib}/config.js | 0 {lib => src/lib}/crypto.js | 93 ++-- {lib => src/lib}/error.js | 0 {lib => src/lib}/floatOperation.js | 0 {lib => src/lib}/util.js | 0 {lib => src/lib}/validate.js | 0 src/proto/MultiEncrypt.js | 512 ++++++++++++++++++ {proto => src/proto}/MultiEncrypt.proto | 0 src/ripple.js | 4 +- src/smartContract.js | 6 +- .../solidity-example}/solidity-TableTxs.sol | 0 .../solidity-example}/solidity-example.sol | 0 src/submit.js | 2 +- src/table.js | 6 +- src/tablePayment.js | 4 +- test/gateway-test.js | 2 +- test/server-test.js | 8 +- test/server.js | 26 +- test/smartContractTest.js | 2 +- test/table-contract-test.js | 2 +- test/testSign.js | 7 +- 25 files changed, 630 insertions(+), 98 deletions(-) create mode 100644 .babelrc rename {lib => src/lib}/config.js (100%) rename {lib => src/lib}/crypto.js (84%) rename {lib => src/lib}/error.js (100%) rename {lib => src/lib}/floatOperation.js (100%) rename {lib => src/lib}/util.js (100%) rename {lib => src/lib}/validate.js (100%) create mode 100644 src/proto/MultiEncrypt.js rename {proto => src/proto}/MultiEncrypt.proto (100%) rename {solidity-example => src/solidity-example}/solidity-TableTxs.sol (100%) rename {solidity-example => src/solidity-example}/solidity-example.sol (100%) diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..03b323e --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["es2015", "stage-1"], + "plugins": ["syntax-flow", "transform-flow-strip-types"] +} diff --git a/package.json b/package.json index 2efb645..01a8568 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,16 @@ { "name": "chainsql", - "version": "0.70.14", + "version": "0.70.16", "description": "An database driver for chainsql ", - "main": "src/index.js", - "scripts": { - "test": "mocha" + "main": "dist/npm/", + "directories": { + "test": "test" }, + "files": [ + "dist/npm/*", + "bin/*", + "test/*" + ], "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs": "^0.11.1", @@ -20,8 +25,27 @@ "web3-utils": "1.0.0-beta.36" }, "devDependencies": { - "mocha": "~2.3.3", - "chai": "^4.2.0" + "assert-diff": "^1.0.1", + "babel-cli": "^6.4.0", + "babel-core": "^6.4.0", + "babel-eslint": "^6.0.4", + "babel-loader": "^6.2.1", + "babel-plugin-syntax-flow": "^6.3.13", + "babel-plugin-transform-flow-strip-types": "^6.4.0", + "babel-preset-es2015": "^6.3.13", + "babel-preset-stage-1": "^6.3.13", + "babel-register": "^6.3.13" + }, + "scripts": { + "build": "gulp", + "doctoc": "doctoc docs/index.md --title '# ChainsqlAPI Reference' --github --maxlevel 2", + "docgen": "node --harmony scripts/build_docs.js", + "clean": "rm -rf dist/npm && rm -rf build/flow", + "typecheck": "babel --optional runtime --blacklist flow -d build/flow/ src/ && flow check", + "compile": "babel -D --optional runtime -d dist/npm/ src/", + "watch": "babel -w -D --optional runtime -d dist/npm/ src/", + "compile-with-source-maps": "babel -D --optional runtime -s -t -d dist/npm/ src/", + "prepublish": "npm run clean && npm run compile" }, "repository": { "type": "git", diff --git a/src/eventManager.js b/src/eventManager.js index 95635ee..1266221 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -1,7 +1,7 @@ 'use strict'; const EventEmitter = require('events'); -const util = require('../lib/util'); -const crypto = require('../lib/crypto'); +const util = require('./lib/util'); +const crypto = require('./lib/crypto'); function EventManager(chainsql) { this.connect = chainsql.connect.api.connection; diff --git a/src/index.js b/src/index.js index 0e2b4cf..be28731 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,5 @@ 'use strict' -const crypto = require('../lib/crypto'); +const crypto = require('./lib/crypto'); const keypairs = require('chainsql-keypairs'); const EventManager = require('./eventManager') const _ = require('lodash'); @@ -7,20 +7,20 @@ const _ = require('lodash'); const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); -const chainsqlError = require('../lib/error'); +const chainsqlError = require('./lib/error'); _.assign(RippleAPI.prototype, { prepareTable: require('./tablePayment'), prepareTx: require('./txPayment') }) const addressCodec = require('chainsql-address-codec'); -const validate = require('../lib/validate') +const validate = require('./lib/validate') const Connection = require('./connect'); const Table = require('./table'); const Contract = require('./smartContract'); -const util = require('../lib/util'); +const util = require('./lib/util'); const { utils } = require('elliptic'); -const opType = require('../lib/config').opType; +const opType = require('./lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; diff --git a/lib/config.js b/src/lib/config.js similarity index 100% rename from lib/config.js rename to src/lib/config.js diff --git a/lib/crypto.js b/src/lib/crypto.js similarity index 84% rename from lib/crypto.js rename to src/lib/crypto.js index 5840266..83c321b 100644 --- a/lib/crypto.js +++ b/src/lib/crypto.js @@ -15,6 +15,7 @@ var ProtoBuf = require("protobufjs") var zlib = require('zlib'); const _ = require('lodash'); +const multiProto = require('../proto/MultiEncrypt') var AESKeyLength = 32; var AESBlockLength = 16; @@ -357,7 +358,7 @@ var encryptText = function(plainText,listPublic){ } //publickey -hash var pubKey = Secp256k1.keyFromPublic(publicKey, 'hex'); - var pubHash = quarterSha512(new Buffer(publicKey, 'hex')); + var pubHash = quarterSha512(Buffer.from(publicKey, 'hex')); listPubHash.push(pubHash); //encrypt @@ -366,30 +367,26 @@ var encryptText = function(plainText,listPublic){ } return new Promise(function(resolve,reject){ - ProtoBuf.load("proto/MultiEncrypt.proto",function(err,root){ - if (err) throw err; - var MultiEncrypt = root.lookup("MultiEncrypt"); - //create a new message - var data = {}; - data.publicOther =Buffer.from(ephPublicKey,'hex'); - data.cipher = Buffer.from(aesCipher,'hex'); - data.hashTokenPair = []; - for(var i=0; i|null} [hashTokenPair] MultiEncrypt hashTokenPair + * @property {Uint8Array} cipher MultiEncrypt cipher + */ + + /** + * Constructs a new MultiEncrypt. + * @exports MultiEncrypt + * @classdesc Represents a MultiEncrypt. + * @implements IMultiEncrypt + * @constructor + * @param {IMultiEncrypt=} [properties] Properties to set + */ + function MultiEncrypt(properties) { + this.hashTokenPair = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MultiEncrypt publicOther. + * @member {Uint8Array} publicOther + * @memberof MultiEncrypt + * @instance + */ + MultiEncrypt.prototype.publicOther = $util.newBuffer([]); + + /** + * MultiEncrypt hashTokenPair. + * @member {Array.} hashTokenPair + * @memberof MultiEncrypt + * @instance + */ + MultiEncrypt.prototype.hashTokenPair = $util.emptyArray; + + /** + * MultiEncrypt cipher. + * @member {Uint8Array} cipher + * @memberof MultiEncrypt + * @instance + */ + MultiEncrypt.prototype.cipher = $util.newBuffer([]); + + /** + * Creates a new MultiEncrypt instance using the specified properties. + * @function create + * @memberof MultiEncrypt + * @static + * @param {IMultiEncrypt=} [properties] Properties to set + * @returns {MultiEncrypt} MultiEncrypt instance + */ + MultiEncrypt.create = function create(properties) { + return new MultiEncrypt(properties); + }; + + /** + * Encodes the specified MultiEncrypt message. Does not implicitly {@link MultiEncrypt.verify|verify} messages. + * @function encode + * @memberof MultiEncrypt + * @static + * @param {IMultiEncrypt} message MultiEncrypt message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MultiEncrypt.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicOther); + if (message.hashTokenPair != null && message.hashTokenPair.length) + for (var i = 0; i < message.hashTokenPair.length; ++i) + $root.MultiEncrypt.HashToken.encode(message.hashTokenPair[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.cipher); + return writer; + }; + + /** + * Encodes the specified MultiEncrypt message, length delimited. Does not implicitly {@link MultiEncrypt.verify|verify} messages. + * @function encodeDelimited + * @memberof MultiEncrypt + * @static + * @param {IMultiEncrypt} message MultiEncrypt message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MultiEncrypt.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MultiEncrypt message from the specified reader or buffer. + * @function decode + * @memberof MultiEncrypt + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {MultiEncrypt} MultiEncrypt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MultiEncrypt.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.MultiEncrypt(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.publicOther = reader.bytes(); + break; + case 2: + if (!(message.hashTokenPair && message.hashTokenPair.length)) + message.hashTokenPair = []; + message.hashTokenPair.push($root.MultiEncrypt.HashToken.decode(reader, reader.uint32())); + break; + case 3: + message.cipher = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("publicOther")) + throw $util.ProtocolError("missing required 'publicOther'", { instance: message }); + if (!message.hasOwnProperty("cipher")) + throw $util.ProtocolError("missing required 'cipher'", { instance: message }); + return message; + }; + + /** + * Decodes a MultiEncrypt message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof MultiEncrypt + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {MultiEncrypt} MultiEncrypt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MultiEncrypt.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MultiEncrypt message. + * @function verify + * @memberof MultiEncrypt + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MultiEncrypt.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!(message.publicOther && typeof message.publicOther.length === "number" || $util.isString(message.publicOther))) + return "publicOther: buffer expected"; + if (message.hashTokenPair != null && message.hasOwnProperty("hashTokenPair")) { + if (!Array.isArray(message.hashTokenPair)) + return "hashTokenPair: array expected"; + for (var i = 0; i < message.hashTokenPair.length; ++i) { + var error = $root.MultiEncrypt.HashToken.verify(message.hashTokenPair[i]); + if (error) + return "hashTokenPair." + error; + } + } + if (!(message.cipher && typeof message.cipher.length === "number" || $util.isString(message.cipher))) + return "cipher: buffer expected"; + return null; + }; + + /** + * Creates a MultiEncrypt message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof MultiEncrypt + * @static + * @param {Object.} object Plain object + * @returns {MultiEncrypt} MultiEncrypt + */ + MultiEncrypt.fromObject = function fromObject(object) { + if (object instanceof $root.MultiEncrypt) + return object; + var message = new $root.MultiEncrypt(); + if (object.publicOther != null) + if (typeof object.publicOther === "string") + $util.base64.decode(object.publicOther, message.publicOther = $util.newBuffer($util.base64.length(object.publicOther)), 0); + else if (object.publicOther.length) + message.publicOther = object.publicOther; + if (object.hashTokenPair) { + if (!Array.isArray(object.hashTokenPair)) + throw TypeError(".MultiEncrypt.hashTokenPair: array expected"); + message.hashTokenPair = []; + for (var i = 0; i < object.hashTokenPair.length; ++i) { + if (typeof object.hashTokenPair[i] !== "object") + throw TypeError(".MultiEncrypt.hashTokenPair: object expected"); + message.hashTokenPair[i] = $root.MultiEncrypt.HashToken.fromObject(object.hashTokenPair[i]); + } + } + if (object.cipher != null) + if (typeof object.cipher === "string") + $util.base64.decode(object.cipher, message.cipher = $util.newBuffer($util.base64.length(object.cipher)), 0); + else if (object.cipher.length) + message.cipher = object.cipher; + return message; + }; + + /** + * Creates a plain object from a MultiEncrypt message. Also converts values to other types if specified. + * @function toObject + * @memberof MultiEncrypt + * @static + * @param {MultiEncrypt} message MultiEncrypt + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MultiEncrypt.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.hashTokenPair = []; + if (options.defaults) { + if (options.bytes === String) + object.publicOther = ""; + else { + object.publicOther = []; + if (options.bytes !== Array) + object.publicOther = $util.newBuffer(object.publicOther); + } + if (options.bytes === String) + object.cipher = ""; + else { + object.cipher = []; + if (options.bytes !== Array) + object.cipher = $util.newBuffer(object.cipher); + } + } + if (message.publicOther != null && message.hasOwnProperty("publicOther")) + object.publicOther = options.bytes === String ? $util.base64.encode(message.publicOther, 0, message.publicOther.length) : options.bytes === Array ? Array.prototype.slice.call(message.publicOther) : message.publicOther; + if (message.hashTokenPair && message.hashTokenPair.length) { + object.hashTokenPair = []; + for (var j = 0; j < message.hashTokenPair.length; ++j) + object.hashTokenPair[j] = $root.MultiEncrypt.HashToken.toObject(message.hashTokenPair[j], options); + } + if (message.cipher != null && message.hasOwnProperty("cipher")) + object.cipher = options.bytes === String ? $util.base64.encode(message.cipher, 0, message.cipher.length) : options.bytes === Array ? Array.prototype.slice.call(message.cipher) : message.cipher; + return object; + }; + + /** + * Converts this MultiEncrypt to JSON. + * @function toJSON + * @memberof MultiEncrypt + * @instance + * @returns {Object.} JSON object + */ + MultiEncrypt.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + MultiEncrypt.HashToken = (function() { + + /** + * Properties of a HashToken. + * @memberof MultiEncrypt + * @interface IHashToken + * @property {Uint8Array} publicHash HashToken publicHash + * @property {Uint8Array} token HashToken token + */ + + /** + * Constructs a new HashToken. + * @memberof MultiEncrypt + * @classdesc Represents a HashToken. + * @implements IHashToken + * @constructor + * @param {MultiEncrypt.IHashToken=} [properties] Properties to set + */ + function HashToken(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HashToken publicHash. + * @member {Uint8Array} publicHash + * @memberof MultiEncrypt.HashToken + * @instance + */ + HashToken.prototype.publicHash = $util.newBuffer([]); + + /** + * HashToken token. + * @member {Uint8Array} token + * @memberof MultiEncrypt.HashToken + * @instance + */ + HashToken.prototype.token = $util.newBuffer([]); + + /** + * Creates a new HashToken instance using the specified properties. + * @function create + * @memberof MultiEncrypt.HashToken + * @static + * @param {MultiEncrypt.IHashToken=} [properties] Properties to set + * @returns {MultiEncrypt.HashToken} HashToken instance + */ + HashToken.create = function create(properties) { + return new HashToken(properties); + }; + + /** + * Encodes the specified HashToken message. Does not implicitly {@link MultiEncrypt.HashToken.verify|verify} messages. + * @function encode + * @memberof MultiEncrypt.HashToken + * @static + * @param {MultiEncrypt.IHashToken} message HashToken message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HashToken.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicHash); + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.token); + return writer; + }; + + /** + * Encodes the specified HashToken message, length delimited. Does not implicitly {@link MultiEncrypt.HashToken.verify|verify} messages. + * @function encodeDelimited + * @memberof MultiEncrypt.HashToken + * @static + * @param {MultiEncrypt.IHashToken} message HashToken message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HashToken.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HashToken message from the specified reader or buffer. + * @function decode + * @memberof MultiEncrypt.HashToken + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {MultiEncrypt.HashToken} HashToken + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HashToken.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.MultiEncrypt.HashToken(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.publicHash = reader.bytes(); + break; + case 2: + message.token = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("publicHash")) + throw $util.ProtocolError("missing required 'publicHash'", { instance: message }); + if (!message.hasOwnProperty("token")) + throw $util.ProtocolError("missing required 'token'", { instance: message }); + return message; + }; + + /** + * Decodes a HashToken message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof MultiEncrypt.HashToken + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {MultiEncrypt.HashToken} HashToken + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HashToken.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HashToken message. + * @function verify + * @memberof MultiEncrypt.HashToken + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HashToken.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!(message.publicHash && typeof message.publicHash.length === "number" || $util.isString(message.publicHash))) + return "publicHash: buffer expected"; + if (!(message.token && typeof message.token.length === "number" || $util.isString(message.token))) + return "token: buffer expected"; + return null; + }; + + /** + * Creates a HashToken message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof MultiEncrypt.HashToken + * @static + * @param {Object.} object Plain object + * @returns {MultiEncrypt.HashToken} HashToken + */ + HashToken.fromObject = function fromObject(object) { + if (object instanceof $root.MultiEncrypt.HashToken) + return object; + var message = new $root.MultiEncrypt.HashToken(); + if (object.publicHash != null) + if (typeof object.publicHash === "string") + $util.base64.decode(object.publicHash, message.publicHash = $util.newBuffer($util.base64.length(object.publicHash)), 0); + else if (object.publicHash.length) + message.publicHash = object.publicHash; + if (object.token != null) + if (typeof object.token === "string") + $util.base64.decode(object.token, message.token = $util.newBuffer($util.base64.length(object.token)), 0); + else if (object.token.length) + message.token = object.token; + return message; + }; + + /** + * Creates a plain object from a HashToken message. Also converts values to other types if specified. + * @function toObject + * @memberof MultiEncrypt.HashToken + * @static + * @param {MultiEncrypt.HashToken} message HashToken + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HashToken.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.publicHash = ""; + else { + object.publicHash = []; + if (options.bytes !== Array) + object.publicHash = $util.newBuffer(object.publicHash); + } + if (options.bytes === String) + object.token = ""; + else { + object.token = []; + if (options.bytes !== Array) + object.token = $util.newBuffer(object.token); + } + } + if (message.publicHash != null && message.hasOwnProperty("publicHash")) + object.publicHash = options.bytes === String ? $util.base64.encode(message.publicHash, 0, message.publicHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.publicHash) : message.publicHash; + if (message.token != null && message.hasOwnProperty("token")) + object.token = options.bytes === String ? $util.base64.encode(message.token, 0, message.token.length) : options.bytes === Array ? Array.prototype.slice.call(message.token) : message.token; + return object; + }; + + /** + * Converts this HashToken to JSON. + * @function toJSON + * @memberof MultiEncrypt.HashToken + * @instance + * @returns {Object.} JSON object + */ + HashToken.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HashToken; + })(); + + return MultiEncrypt; +})(); + +module.exports = $root; diff --git a/proto/MultiEncrypt.proto b/src/proto/MultiEncrypt.proto similarity index 100% rename from proto/MultiEncrypt.proto rename to src/proto/MultiEncrypt.proto diff --git a/src/ripple.js b/src/ripple.js index 4870dbc..ca9dde5 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -1,7 +1,7 @@ 'use strict' -var util = require('../lib/util'); +var util = require('./lib/util'); var Submit = require('./submit'); -const FloatOperation = require('../lib/floatOperation'); +const FloatOperation = require('./lib/floatOperation'); var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; class Ripple extends Submit { diff --git a/src/smartContract.js b/src/smartContract.js index 1a0a20e..956d29a 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -1,12 +1,12 @@ "use strict"; -var util = require('../lib/util'); +var util = require('./lib/util'); const _ = require('lodash'); var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; const keypairs = require('chainsql-keypairs'); -const chainsqlUtils = require('../lib/util'); -const chainsqlError = require('../lib/error'); +const chainsqlUtils = require('./lib/util'); +const chainsqlError = require('./lib/error'); var abi = require('web3-eth-abi'); var utils = require('web3-utils'); var formatters = require('web3-core-helpers').formatters; diff --git a/solidity-example/solidity-TableTxs.sol b/src/solidity-example/solidity-TableTxs.sol similarity index 100% rename from solidity-example/solidity-TableTxs.sol rename to src/solidity-example/solidity-TableTxs.sol diff --git a/solidity-example/solidity-example.sol b/src/solidity-example/solidity-example.sol similarity index 100% rename from solidity-example/solidity-example.sol rename to src/solidity-example/solidity-example.sol diff --git a/src/submit.js b/src/submit.js index 5b19ef7..0df3aa3 100644 --- a/src/submit.js +++ b/src/submit.js @@ -1,5 +1,5 @@ 'use strict' -var util = require('../lib/util'); +var util = require('./lib/util'); const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Connection = require('./connect'); diff --git a/src/table.js b/src/table.js index c04ea23..172a91c 100644 --- a/src/table.js +++ b/src/table.js @@ -1,8 +1,8 @@ 'use strict' -const opType = require('../lib/config').opType; -const chainsqlError = require('../lib/error'); +const opType = require('./lib/config').opType; +const chainsqlError = require('./lib/error'); var Submit = require('./submit'); -const util = require('../lib/util'); +const util = require('./lib/util'); const convertStringToHex = util.convertStringToHex; const tryEncryptRaw = util.tryEncryptRaw; diff --git a/src/tablePayment.js b/src/tablePayment.js index be03904..2f1b91a 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -2,8 +2,8 @@ var _ = require('lodash'); const path = require('path'); -const getTxJson = require('../lib/util').getTxJson; -const calcFee = require('../lib/util').calcFee; +const getTxJson = require('./lib/util').getTxJson; +const calcFee = require('./lib/util').calcFee; var utils = require('chainsql-lib').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; diff --git a/test/gateway-test.js b/test/gateway-test.js index 68be548..cc5d47c 100644 --- a/test/gateway-test.js +++ b/test/gateway-test.js @@ -90,7 +90,7 @@ describe('gateway', () => { // 'use strict' -// const ChainsqlAPI = require('chainsql'); +// const ChainsqlAPI = require('../src/index'); // const c = new ChainsqlAPI(); // var root = { diff --git a/test/server-test.js b/test/server-test.js index 9cebd0c..b78d0ac 100644 --- a/test/server-test.js +++ b/test/server-test.js @@ -3,10 +3,10 @@ const ChainsqlAPI = require('../src/index'); const r = new ChainsqlAPI(); -var path = require('path'); -var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); -var common = require(basePath); -var crypto = require('../lib/crypto'); +// var path = require('path'); +// var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); +// var common = require(basePath); +var crypto = require('../src/lib/crypto'); const keypairs = require('chainsql-keypairs-test'); diff --git a/test/server.js b/test/server.js index ac9abb3..efed3e0 100644 --- a/test/server.js +++ b/test/server.js @@ -1,21 +1,19 @@ 'use strict' - - const ChainsqlAPI = require('../src/index'); const r = new ChainsqlAPI(); -var path = require('path'); -var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); -var common = require(basePath); -var crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs-test'); +// var path = require('path'); +// var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); +// var common = require(basePath); +var crypto = require('../src/lib/crypto'); +const keypairs = require('chainsql-keypairs'); main(); async function main(){ try { // await r.connect('ws://127.0.0.1:6007'); //await r.connect('ws://139.198.11.189:6006'); - await r.connect('ws://192.168.0.14:6006'); + // await r.connect('ws://192.168.0.14:6006'); // console.log('连接成功') // var tb = 'test13323333'; @@ -34,10 +32,10 @@ async function main(){ // }); - var cipher = crypto.eciesEncrypt("hello","03B7FBF1AC149B0D297B7407CAB9636792333B8D8B8A4036B2D4DE2E6D69D435B5"); - var keypair = keypairs.deriveKeypair("xxHgHoRAHdGZxy5gWUdMeUK7hWrgr"); - var plain = crypto.eciesDecrypt(cipher,keypair.privateKey); - console.log(plain); + // var cipher = crypto.eciesEncrypt("hello","03B7FBF1AC149B0D297B7407CAB9636792333B8D8B8A4036B2D4DE2E6D69D435B5"); + // var keypair = keypairs.deriveKeypair("xxHgHoRAHdGZxy5gWUdMeUK7hWrgr"); + // var plain = crypto.eciesDecrypt(cipher,keypair.privateKey); + // console.log(plain); //字段级加密 console.log("multi encrypt test:"); @@ -51,9 +49,9 @@ async function main(){ console.log("AesPadding Test"); - var aesCipher = crypto.aesEncrypt("abcdefg","hello,world"); + var aesCipher = crypto.symEncrypt("abcdefg","hello,world"); console.log(aesCipher); - var aesDecrypted = crypto.aesDecrypt("abcdefg",aesCipher); + var aesDecrypted = crypto.symDecrypt("abcdefg",aesCipher); console.log(aesDecrypted); diff --git a/test/smartContractTest.js b/test/smartContractTest.js index 931627c..98ce9b8 100644 --- a/test/smartContractTest.js +++ b/test/smartContractTest.js @@ -2,7 +2,7 @@ //const fs = require ('fs'); //const solc = require('solc'); -const ChainsqlAPI = require("../src/index"); +const ChainsqlAPI = require("chainsql"); const chainsql = new ChainsqlAPI(); const RootUser = { diff --git a/test/table-contract-test.js b/test/table-contract-test.js index 6b221e6..3e52d8c 100644 --- a/test/table-contract-test.js +++ b/test/table-contract-test.js @@ -2,7 +2,7 @@ //const fs = require ('fs'); //const solc = require('solc'); -const ChainsqlAPI = require("../src/index"); +const ChainsqlAPI = require("chainsql"); const c = new ChainsqlAPI(); const RootUser = { diff --git a/test/testSign.js b/test/testSign.js index c88ed2b..8e11933 100644 --- a/test/testSign.js +++ b/test/testSign.js @@ -1,7 +1,6 @@ "use strict"; -// const RippleAPI = new require('ripple-lib').RippleAPI; -// const api = new RippleAPI({server: ""}); +const binary = require('chainsql-binary-codec') const ChainsqlAPI = require('../src/index'); const c = new ChainsqlAPI(); @@ -56,7 +55,9 @@ async function main(){ }); - + var signed = "1200002400000006201B0000001061400000003B9ACA0068400000000000003273210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02074473045022100E684319763A47F8E4AA590ECBB4F16D4392E4DAB312A19ACC7E69F273DCD5FE702204DBBF8CB14FA8B723E35FB2659936DF6635BA4C80616B2563885AF5D91610B848114B5F762798A53D543A014CAF8B297CFF8F2F937E8831493CAB3CA5AA1B46E5A2A55BB8AA934A720ECD7A5"; + var decoded = binary.decode(signed); + console.log(decoded); // return; // info = await c.api.getAccountInfo("rsM2GxUgR6jhEDijLTymqrwKZqtGSKj7RQ"); From 8181de6674b495c6c5f7eb29717e47866d4c22c0 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 31 Aug 2021 10:28:33 +0800 Subject: [PATCH 68/80] signFromHexString to signFromString --- src/index.js | 2 +- test/testSignatureVerify.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index be28731..813ba39 100644 --- a/src/index.js +++ b/src/index.js @@ -1056,7 +1056,7 @@ ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,include }; -ChainsqlAPI.prototype.signFromHexString = function (messageHex, secret) { +ChainsqlAPI.prototype.signFromString = function (messageHex, secret) { var keypair = keypairs.deriveKeypair(secret); var signatue = keypairs.sign(messageHex,keypair.privateKey); diff --git a/test/testSignatureVerify.js b/test/testSignatureVerify.js index 694d039..8b49b52 100644 --- a/test/testSignatureVerify.js +++ b/test/testSignatureVerify.js @@ -18,7 +18,7 @@ main(); var secret = "xnoz9Le8yENN7U3fWxoeMymnT31XD"; var hexMsg = Buffer.from("hello world").toString('hex'); - var signature = c.signFromHexString(hexMsg,secret); + var signature = c.signFromString(hexMsg,secret); var signatureRight = "3045022100BDC5E1154B68B6A9FFD7F7CA36CF3B79D0BF0EDF186D09D460E537EAB9BEB31002204F54BCE76918B4F7415319E62B19A2B1F7200234F049FBD524C61EB5DD4965AA"; assert.equal(signature,signatureRight); From 3d7cf4db4c0685815e7fb033f46e8a421ad43484 Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Wed, 1 Sep 2021 15:16:00 +0800 Subject: [PATCH 69/80] Add encryption and decryption test method --- src/lib/crypto.js | 44 +++++++++++++++++++++++++++++++++++++++++--- test/server.js | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/src/lib/crypto.js b/src/lib/crypto.js index 83c321b..a452ebb 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -6,7 +6,7 @@ const hashjs = require('hash.js'); const elliptic = require('elliptic'); const Secp256k1 = elliptic.ec('secp256k1'); const addressCodec = require('chainsql-address-codec'); - +const utils = require('chainsql-keypairs/distrib/npm/utils'); //var debug = require('debug')('crypto'); var crypto = require('crypto'); var sjcl = require('sjcl'); @@ -238,6 +238,23 @@ var symEncrypt = function(symKey, plaintext, algType = 'aes') { } }; +/** + * 非对称加密方法 + * @param plaintext 明文 + * @param publicKey 公钥 + * @returns string 加密后的十六进制格式 + */ + var asymEncrypt = function(plaintext, publicKey, algType = 'ecies') { + if ( algType === "gmAlg" ) { + token = keypairs.gmAlgSm2Enc(publicKey, plaintext); + }else if(algType === "softGMAlg") { + var plaintextHex = Buffer.from(plaintext, 'utf8').toString("hex"); + return keypairs.softGMAlgSm2Enc(plaintextHex,publicKey); + }else { + return eciesEncrypt(plaintext, publicKey); + } +}; + var aesEncrypt = function(secret, plaintext) { var secretPadded = paddingPass(secret,AESKeyLength); var aesKey =Buffer.from(secretPadded, 'utf8'); @@ -259,12 +276,31 @@ var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { if(algType === "gmAlg") { return keypairs.gmAlgSymDec(symKey, encryptedHex); } else if(algType === "softGMAlg"){ - return keypairs.softGMAlgSymDec(symKey, encryptedHex); + return keypairs.softGMAlgSymDec(symKey, encryptedHex); }else { return aesDecrypt(symKey, encryptedHex); } }; +/** + * 解密方法 + * @param encryptedHex 密文十六进制格式 + * @param privateKey 私钥 + * @returns string 解密后的明文 + */ + var asymDecrypt = function(encryptedHex, privateKey, algType = 'ecies') { + + if(algType === "gmAlg") { + return symKey = keypairs.gmAlgSm2Dec(privateKey, encryptedHex); + }else if(algType === "softGMAlg"){ + var plainhex = keypairs.softGMAlgSm2Dec(privateKey, encryptedHex); + return Buffer.from(plainhex, 'hex'); + }else { + return eciesDecrypt(encryptedHex, privateKey); + } +}; + + var aesDecrypt = function(secret, encryptedHex) { var secretPadded = paddingPass(secret,AESKeyLength); var aesKey =Buffer.from(secretPadded, 'utf8'); @@ -431,5 +467,7 @@ module.exports = { symEncrypt, symDecrypt, encryptText, - decryptText + decryptText, + asymEncrypt, + asymDecrypt }; \ No newline at end of file diff --git a/test/server.js b/test/server.js index efed3e0..5f52123 100644 --- a/test/server.js +++ b/test/server.js @@ -7,7 +7,7 @@ const r = new ChainsqlAPI(); // var common = require(basePath); var crypto = require('../src/lib/crypto'); const keypairs = require('chainsql-keypairs'); - +const utils = require('chainsql-keypairs/distrib/npm/utils'); main(); async function main(){ try { @@ -32,10 +32,10 @@ async function main(){ // }); - // var cipher = crypto.eciesEncrypt("hello","03B7FBF1AC149B0D297B7407CAB9636792333B8D8B8A4036B2D4DE2E6D69D435B5"); - // var keypair = keypairs.deriveKeypair("xxHgHoRAHdGZxy5gWUdMeUK7hWrgr"); - // var plain = crypto.eciesDecrypt(cipher,keypair.privateKey); - // console.log(plain); + var cipher = crypto.eciesEncrypt("hello","03B7FBF1AC149B0D297B7407CAB9636792333B8D8B8A4036B2D4DE2E6D69D435B5"); + var keypair = keypairs.deriveKeypair("xxHgHoRAHdGZxy5gWUdMeUK7hWrgr"); + var plain = crypto.eciesDecrypt(cipher,keypair.privateKey); + console.log(plain.toString()); //字段级加密 console.log("multi encrypt test:"); @@ -47,6 +47,32 @@ async function main(){ var text2 = await crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); console.log("plain text2:" + text2); + console.log("Symmetric encryption Test"); + var symCipher = crypto.symEncrypt("abcdefghqwertyui","hello,world", "softGMAlg"); + console.log(symCipher); + var plainhex = crypto.symDecrypt("abcdefghqwertyui",symCipher, "softGMAlg"); + var symDecrypted = utils.arrayToUtf8(utils.hexToArray(plainhex)); + console.log(symDecrypted); + + var symCipher = crypto.symEncrypt("abcdefghqwertyui","hello,world", "aes"); + console.log(symCipher); + var symDecrypted = crypto.symDecrypt("abcdefghqwertyui",symCipher, "aes"); + console.log(symDecrypted); + + + console.log("Asymmetry encryption Test"); + var symCipher = crypto.asymEncrypt("hello,world","pYvXDbsUUr5dpumrojYApjG8nLfFMXhu3aDvxq5oxEa4ZSeyjrMzisdPsYjfxyg9eN3ZJsNjtNENbzXPL89st39oiSp5yucU", "softGMAlg"); + console.log(symCipher); + var symDecrypted = crypto.asymDecrypt(symCipher,"pwRdHmA4cSUKKtFyo4m2vhiiz5g6ym58Noo9dTsUU97mARNjevj", "softGMAlg"); + console.log(symDecrypted.toString()); + + + console.log("Asymmetry encryption Test"); + var keypair = keypairs.deriveKeypair("xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); + var symCipher = crypto.asymEncrypt("hello,world",keypair.publicKey, "ecies"); + console.log(symCipher); + var symDecrypted = crypto.asymDecrypt(symCipher,keypair.privateKey, "ecies"); + console.log(symDecrypted.toString()); console.log("AesPadding Test"); var aesCipher = crypto.symEncrypt("abcdefg","hello,world"); From 5404fe945a65e9fd01e32e1f19bd942a3c1a13be Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Fri, 10 Sep 2021 10:06:12 +0800 Subject: [PATCH 70/80] Add error code db_acctSecretError --- src/lib/util.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/util.js b/src/lib/util.js index 338856f..55ae475 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -344,7 +344,8 @@ function checkSubError(data){ || data.status == 'db_noDbConfig' || data.status == 'db_noSyncConfig' || data.status == 'db_noAutoSync' - || data.status == 'db_noTableExistInDB'){ + || data.status == 'db_noTableExistInDB' + || data.status == 'db_acctSecretError'){ return true; }else{ return false; From 758c402a2050737c47f41f74132985190e1924f2 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 22 Sep 2021 17:41:53 +0800 Subject: [PATCH 71/80] add decodeMethodParams and replace rm for crossplatform --- package.json | 7 ++++--- src/smartContract.js | 35 +++++++++++++++++++++++++++++++++++ test/smartContractTest.js | 9 ++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 01a8568..daf3cea 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "chainsql", "version": "0.70.16", - "description": "An database driver for chainsql ", + "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { "test": "test" @@ -22,7 +22,8 @@ "sjcl": "~1.0.3", "web3-core-helpers": "1.0.0-beta.36", "web3-eth-abi": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "web3-utils": "1.0.0-beta.36", + "rimraf": "^3.0.0" }, "devDependencies": { "assert-diff": "^1.0.1", @@ -40,7 +41,7 @@ "build": "gulp", "doctoc": "doctoc docs/index.md --title '# ChainsqlAPI Reference' --github --maxlevel 2", "docgen": "node --harmony scripts/build_docs.js", - "clean": "rm -rf dist/npm && rm -rf build/flow", + "clean": "rimraf dist/npm && rimraf build/flow", "typecheck": "babel --optional runtime --blacklist flow -d build/flow/ src/ && flow check", "compile": "babel -D --optional runtime -d dist/npm/ src/", "watch": "babel -w -D --optional runtime -d dist/npm/ src/", diff --git a/src/smartContract.js b/src/smartContract.js index 956d29a..1fdc8ee 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -388,6 +388,41 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { } }; +/** + * Decodes an contractData for a method, including signature or the method. + * + * @method decodeMethodABI + * @param {String} contractData encoded params + */ +Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData) { + let methodSignature = contractData.slice(0,10); + let actualEncodeParams = contractData.slice(10); + + let paramsABIJson = this.options.jsonInterface.filter(function (json) { + return ((methodSignature === '60806040' /*&& json.type === methodSignature*/) || + ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); + })[0]; + + let paramsTypes = _.isArray(paramsABIJson.inputs) ? paramsABIJson.inputs.map(function (input) { + if (input.type === "tuple[]" || input.type === "tuple") return input; + return input.type; }) : []; + + let result = abi.decodeParameters(paramsTypes, actualEncodeParams); + let returnJson = {}; + returnJson["funName"] = paramsABIJson.name; + if(_.isArray(paramsABIJson.inputs)){ + paramsABIJson.inputs.map(function (input, index) { + returnJson[input.type] = input.name; + if(input.type === "address"){ + returnJson[input.name] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); + } else { + returnJson[input.name] = result[index]; + } + }); + } + return returnJson; +}; + /** * Decode method return values * diff --git a/test/smartContractTest.js b/test/smartContractTest.js index 98ce9b8..58fbf6a 100644 --- a/test/smartContractTest.js +++ b/test/smartContractTest.js @@ -2,7 +2,7 @@ //const fs = require ('fs'); //const solc = require('solc'); -const ChainsqlAPI = require("chainsql"); +const ChainsqlAPI = require("../src/index"); const chainsql = new ChainsqlAPI(); const RootUser = { @@ -56,6 +56,8 @@ function callContract(){ /*get function encodeABI*/ // getFuncEncodeABI(myContract); + + getFuncActualParams(myContract); /*methods.function.auto*/ // contractAuto(myContract); @@ -119,6 +121,11 @@ function getFuncEncodeABI(contractObj){ let funInputData = contractObj.methods.setMem(16).encodeABI(); console.log(funInputData); } +function getFuncActualParams(contractObj){ + let contractData = "0xa9059cbb00000000000000000000000046ced18b2a3814f134378efd144cea58709a68c1000000000000000000000000000000000000000000000000000000000000007b"; + let actualParams = contractObj.decodeMethodParams(contractData); + console.log(actualParams); +} function deployContract(){ const myContract = chainsql.contract(JSON.parse(abi)); From 5ca0694180b66c41f7bba29f37010b3e1180569c Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 22 Sep 2021 17:50:30 +0800 Subject: [PATCH 72/80] support deploy func data decode --- src/smartContract.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/smartContract.js b/src/smartContract.js index 1fdc8ee..2b924aa 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -396,10 +396,10 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { */ Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData) { let methodSignature = contractData.slice(0,10); - let actualEncodeParams = contractData.slice(10); + let actualEncodeParams = methodSignature === "0x60806040" ? contractData.slice(contractData.length - 64) : contractData.slice(10); let paramsABIJson = this.options.jsonInterface.filter(function (json) { - return ((methodSignature === '60806040' /*&& json.type === methodSignature*/) || + return ((methodSignature === '0x60806040' /*&& json.type === methodSignature*/) || ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); })[0]; From e67e48100044f48d86b9b40531abdc79f6c4101d Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 23 Sep 2021 19:38:26 +0800 Subject: [PATCH 73/80] add monitor apis --- src/index.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ test/test.js | 24 +++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 813ba39..b9fa3af 100644 --- a/src/index.js +++ b/src/index.js @@ -1299,7 +1299,55 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ }; +ChainsqlAPI.prototype.getContractList = function(){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'contract_list'; + + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + + +ChainsqlAPI.prototype.getLedgerSize = function(option){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'ledger_size'; + + if(option != undefined && option.ledger_index != undefined){ + params.ledger_index = option.ledger_index; + } + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + + +ChainsqlAPI.prototype.monitorStatis = function(){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'monitor_statis'; + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; function callback(data, callback) { diff --git a/test/test.js b/test/test.js index 18ba76f..7f4fd56 100644 --- a/test/test.js +++ b/test/test.js @@ -79,6 +79,9 @@ async function main(){ // console.log(accountInfo) console.log('连接成功'); c.as(owner); + // await testContractList(); + await testMonitorStatis(); + await testGetLedgerSize(); // 读取证书文件 // var data = fs.readFileSync('C:\\ca\\userCert.cert'); @@ -95,7 +98,7 @@ async function main(){ //await testRippleAPI(); // await testAccount(); - await testChainsql(); + // await testChainsql(); //await c.disconnect(); console.log('运行结束'); @@ -207,7 +210,26 @@ async function testAccount(){ await activateAccount(account.address); } +async function testContractList(){ + let ret = await c.getContractList(); + console.log("contract list:" , JSON.stringify(ret)) +} + +async function testMonitorStatis(){ + let ret = await c.monitorStatis(); + console.log("monitor param:" , JSON.stringify(ret)) +} + +async function testGetLedgerSize(){ + let ret = await c.getLedgerSize(); + console.log("ledger size mb:" , ret) + var option = { + ledger_index:4 + } + ret = await c.getLedgerSize(option) + console.log("ledger size:" , ret) +} async function testTableSet(){ From c3010e474e48630342b62753ff5f27b453e1beab Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 27 Sep 2021 15:35:59 +0800 Subject: [PATCH 74/80] fix code for parse deploy tx --- src/smartContract.js | 8 ++++---- test/smartContractTest.js | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/smartContract.js b/src/smartContract.js index 2b924aa..d7b5635 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -394,12 +394,12 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { * @method decodeMethodABI * @param {String} contractData encoded params */ -Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData) { - let methodSignature = contractData.slice(0,10); - let actualEncodeParams = methodSignature === "0x60806040" ? contractData.slice(contractData.length - 64) : contractData.slice(10); +Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData, bytecode = "") { + let methodSignature = contractData.slice(0,10).toLowerCase(); + let actualEncodeParams = methodSignature === "0x60806040" ? contractData.slice(bytecode.length) : contractData.slice(10); let paramsABIJson = this.options.jsonInterface.filter(function (json) { - return ((methodSignature === '0x60806040' /*&& json.type === methodSignature*/) || + return ((methodSignature === '0x60806040' && json.type === "constructor") || ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); })[0]; diff --git a/test/smartContractTest.js b/test/smartContractTest.js index 58fbf6a..e1fffd5 100644 --- a/test/smartContractTest.js +++ b/test/smartContractTest.js @@ -122,8 +122,9 @@ function getFuncEncodeABI(contractObj){ console.log(funInputData); } function getFuncActualParams(contractObj){ - let contractData = "0xa9059cbb00000000000000000000000046ced18b2a3814f134378efd144cea58709a68c1000000000000000000000000000000000000000000000000000000000000007b"; - let actualParams = contractObj.decodeMethodParams(contractData); + let bytecode = "0x608060405260405162000b6a38038062000b6a8339818101604052810190620000299190620001b7565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600190805190602001906200008192919062000089565b50506200038c565b82805462000097906200029d565b90600052602060002090601f016020900481019282620000bb576000855562000107565b82601f10620000d657805160ff191683800117855562000107565b8280016001018555821562000107579182015b8281111562000106578251825591602001919060010190620000e9565b5b5090506200011691906200011a565b5090565b5b80821115620001355760008160009055506001016200011b565b5090565b6000620001506200014a8462000231565b62000208565b9050828152602081018484840111156200016f576200016e6200036c565b5b6200017c84828562000267565b509392505050565b600082601f8301126200019c576200019b62000367565b5b8151620001ae84826020860162000139565b91505092915050565b600060208284031215620001d057620001cf62000376565b5b600082015167ffffffffffffffff811115620001f157620001f062000371565b5b620001ff8482850162000184565b91505092915050565b60006200021462000227565b9050620002228282620002d3565b919050565b6000604051905090565b600067ffffffffffffffff8211156200024f576200024e62000338565b5b6200025a826200037b565b9050602081019050919050565b60005b83811015620002875780820151818401526020810190506200026a565b8381111562000297576000848401525b50505050565b60006002820490506001821680620002b657607f821691505b60208210811415620002cd57620002cc62000309565b5b50919050565b620002de826200037b565b810181811067ffffffffffffffff821117156200030057620002ff62000338565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6107ce806200039c6000396000f3fe6080604052600436106100435760003560e01c806341c0e1b5146100465780634ac0d66e1461005d57806380cc6ac114610086578063cfae3217146100b157610044565b5b005b34801561005257600080fd5b5061005b6100dc565b005b34801561006957600080fd5b50610084600480360381019061007f91906103ce565b61016b565b005b34801561009257600080fd5b5061009b6101ec565b6040516100a891906105ae565b60405180910390f35b3480156100bd57600080fd5b506100c6610229565b6040516100d391906105ae565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101695760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b806040516101799190610580565b604051809103902060016040516101909190610597565b60405180910390207f047dcd1aa8b77b0b943642129c767533eeacd700c7c1eab092b8ce05d2b2faf56001846040516101ca9291906105d0565b60405180910390a380600190805190602001906101e89291906102bb565b5050565b60606040518060400160405280600581526020017f68656c6c6f000000000000000000000000000000000000000000000000000000815250905090565b606060018054610238906106db565b80601f0160208091040260200160405190810160405280929190818152602001828054610264906106db565b80156102b15780601f10610286576101008083540402835291602001916102b1565b820191906000526020600020905b81548152906001019060200180831161029457829003601f168201915b5050505050905090565b8280546102c7906106db565b90600052602060002090601f0160209004810192826102e95760008555610330565b82601f1061030257805160ff1916838001178555610330565b82800160010185558215610330579182015b8281111561032f578251825591602001919060010190610314565b5b50905061033d9190610341565b5090565b5b8082111561035a576000816000905550600101610342565b5090565b600061037161036c8461062c565b610607565b90508281526020810184848401111561038d5761038c6107a1565b5b610398848285610699565b509392505050565b600082601f8301126103b5576103b461079c565b5b81356103c584826020860161035e565b91505092915050565b6000602082840312156103e4576103e36107ab565b5b600082013567ffffffffffffffff811115610402576104016107a6565b5b61040e848285016103a0565b91505092915050565b600061042282610672565b61042c818561067d565b935061043c8185602086016106a8565b610445816107b0565b840191505092915050565b600061045b82610672565b610465818561068e565b93506104758185602086016106a8565b80840191505092915050565b6000815461048e816106db565b610498818661067d565b945060018216600081146104b357600181146104c5576104f8565b60ff19831686526020860193506104f8565b6104ce8561065d565b60005b838110156104f0578154818901526001820191506020810190506104d1565b808801955050505b50505092915050565b6000815461050e816106db565b610518818661068e565b94506001821660008114610533576001811461054457610577565b60ff19831686528186019350610577565b61054d8561065d565b60005b8381101561056f57815481890152600182019150602081019050610550565b838801955050505b50505092915050565b600061058c8284610450565b915081905092915050565b60006105a38284610501565b915081905092915050565b600060208201905081810360008301526105c88184610417565b905092915050565b600060408201905081810360008301526105ea8185610481565b905081810360208301526105fe8184610417565b90509392505050565b6000610611610622565b905061061d828261070d565b919050565b6000604051905090565b600067ffffffffffffffff8211156106475761064661076d565b5b610650826107b0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b82818337600083830152505050565b60005b838110156106c65780820151818401526020810190506106ab565b838111156106d5576000848401525b50505050565b600060028204905060018216806106f357607f821691505b602082108114156107075761070661073e565b5b50919050565b610716826107b0565b810181811067ffffffffffffffff821117156107355761073461076d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f830116905091905056fea164736f6c6343000805000a"; + let contractData = "0x6057361D000000000000000000000000000000000000000000000000000000000000007B"; + let actualParams = contractObj.decodeMethodParams(contractData, bytecode); console.log(actualParams); } From c6366e7ccaaeca4971c959671fdca9507ff3cc3a Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 28 Sep 2021 15:11:47 +0800 Subject: [PATCH 75/80] modify getContractList api add option --- src/index.js | 9 ++++++++- test/test.js | 8 ++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index b9fa3af..3a95011 100644 --- a/src/index.js +++ b/src/index.js @@ -1299,13 +1299,20 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ }; -ChainsqlAPI.prototype.getContractList = function(){ +ChainsqlAPI.prototype.getContractList = function(option){ var connection = this.api ? this.api.connection : this.connect.api.connection; return new Promise(function(resolve, reject){ var params = {}; params.command = 'contract_list'; + if(option != undefined && option.limit != undefined){ + params.limit = option.limit; + } + if(option != undefined && option.marker != undefined){ + params.marker = option.marker; + } + connection.request(params).then(function(data){ resolve(data); }).catch(function(err){ diff --git a/test/test.js b/test/test.js index 7f4fd56..bb18dff 100644 --- a/test/test.js +++ b/test/test.js @@ -79,7 +79,7 @@ async function main(){ // console.log(accountInfo) console.log('连接成功'); c.as(owner); - // await testContractList(); + await testContractList(); await testMonitorStatis(); await testGetLedgerSize(); @@ -211,7 +211,11 @@ async function testAccount(){ } async function testContractList(){ - let ret = await c.getContractList(); + var option = { + limit : 10, + marker:"zBYt5uW62XvWCwEWsLsR78oP89DmTBNp8f" + } + let ret = await c.getContractList(option); console.log("contract list:" , JSON.stringify(ret)) } From ee5492398ccd5af24b2964130e49ce9deccc1ee7 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 28 Sep 2021 15:12:16 +0800 Subject: [PATCH 76/80] use chainsql-test package name,and update version to 0.70.19 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index daf3cea..451580a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql", - "version": "0.70.16", + "name": "chainsql-test", + "version": "0.70.19", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From 42f44c892995b45a777e50864efd7c22be196469 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 29 Sep 2021 15:49:16 +0800 Subject: [PATCH 77/80] update code for parse contractData --- package.json | 2 +- src/smartContract.js | 50 +++++++++++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 451580a..af31204 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "0.70.19", + "version": "0.70.20", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/smartContract.js b/src/smartContract.js index d7b5635..52b647a 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -397,29 +397,55 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData, bytecode = "") { let methodSignature = contractData.slice(0,10).toLowerCase(); let actualEncodeParams = methodSignature === "0x60806040" ? contractData.slice(bytecode.length) : contractData.slice(10); + let returnJson = {}; + returnJson.status = false; let paramsABIJson = this.options.jsonInterface.filter(function (json) { return ((methodSignature === '0x60806040' && json.type === "constructor") || ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); })[0]; + if(undefined == paramsABIJson) + { + returnJson.status = true; + returnJson["funName"] = "Can not find corresponding SmartContract function" + return returnJson; + } let paramsTypes = _.isArray(paramsABIJson.inputs) ? paramsABIJson.inputs.map(function (input) { if (input.type === "tuple[]" || input.type === "tuple") return input; return input.type; }) : []; - - let result = abi.decodeParameters(paramsTypes, actualEncodeParams); - let returnJson = {}; - returnJson["funName"] = paramsABIJson.name; - if(_.isArray(paramsABIJson.inputs)){ - paramsABIJson.inputs.map(function (input, index) { - returnJson[input.type] = input.name; - if(input.type === "address"){ - returnJson[input.name] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); - } else { - returnJson[input.name] = result[index]; + + returnJson["funName"] = methodSignature === "0x60806040" ? "constructor" : paramsABIJson.name; + if(0 === paramsTypes.length && "" === actualEncodeParams) + { + returnJson.status = true; + return returnJson; + } + else if(0 !== paramsTypes.length && "" !== actualEncodeParams) + { + try { + let result = abi.decodeParameters(paramsTypes, actualEncodeParams); + + if(_.isArray(paramsABIJson.inputs)){ + paramsABIJson.inputs.map(function (input, index) { + returnJson[input.type] = input.name; + if(input.type === "address"){ + returnJson[input.name] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); + } else { + returnJson[input.name] = result[index]; + } + }); } - }); + returnJson.status = true; + } catch (error) { + returnJson["errMsg"] = error.message; + } + } + else + { + returnJson["errMsg"] = "Function info don't match contactData"; } + return returnJson; }; From c6edb845a57cbe98d9f5b8d54585aca3ead77c8b Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 29 Sep 2021 16:09:52 +0800 Subject: [PATCH 78/80] update git ignore --- .gitignore | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d35d381..7d5baf8 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ coverage # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release +dist # Dependency directories node_modules @@ -32,6 +33,7 @@ jspm_packages # Optional npm cache directory .npm +package-lock.json # Optional REPL history .node_repl_history diff --git a/package.json b/package.json index af31204..b7125ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "0.70.20", + "version": "0.70.21", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From b099854f89cfcfd6604a4dce118a27394642887c Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 15 Oct 2021 17:31:36 +0800 Subject: [PATCH 79/80] upgrade verion to 0.70.20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 451580a..af31204 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "0.70.19", + "version": "0.70.20", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From 489486f696de84a2605f015a4dba2be91a3f3cd1 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Sat, 13 Nov 2021 16:44:26 +0800 Subject: [PATCH 80/80] add interface getAccountList and upgrade version to 0.70.22 --- package.json | 2 +- src/index.js | 15 +++++++++++++++ test/test.js | 8 +++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b7125ca..cc70777 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "0.70.21", + "version": "0.70.22", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/index.js b/src/index.js index 3a95011..ded8056 100644 --- a/src/index.js +++ b/src/index.js @@ -1321,6 +1321,21 @@ ChainsqlAPI.prototype.getContractList = function(option){ }); }; +ChainsqlAPI.prototype.getAccountList = function(option){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'account_list'; + + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + ChainsqlAPI.prototype.getLedgerSize = function(option){ var connection = this.api ? this.api.connection : this.connect.api.connection; diff --git a/test/test.js b/test/test.js index bb18dff..20d8e8c 100644 --- a/test/test.js +++ b/test/test.js @@ -79,6 +79,7 @@ async function main(){ // console.log(accountInfo) console.log('连接成功'); c.as(owner); + await testAccountList(); await testContractList(); await testMonitorStatis(); await testGetLedgerSize(); @@ -210,10 +211,15 @@ async function testAccount(){ await activateAccount(account.address); } +async function testAccountList(){ + let ret = await c.getAccountList(); + console.log("account list:" , JSON.stringify(ret)) +} + async function testContractList(){ var option = { limit : 10, - marker:"zBYt5uW62XvWCwEWsLsR78oP89DmTBNp8f" + marker: 9 } let ret = await c.getContractList(option); console.log("contract list:" , JSON.stringify(ret))