From c3e8ddce1c03b6cc71ad9de0bdf404e89c154a8c Mon Sep 17 00:00:00 2001 From: Mojicode Date: Tue, 14 Jul 2020 16:34:08 +0800 Subject: [PATCH 001/101] 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 002/101] 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 003/101] 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 004/101] 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 005/101] 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 006/101] 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 007/101] 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 008/101] 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 009/101] 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 010/101] 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 011/101] 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 012/101] 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 013/101] 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 014/101] 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 015/101] 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 016/101] 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 017/101] 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 018/101] 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 019/101] 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 020/101] 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 021/101] 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 022/101] 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 023/101] 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 024/101] 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 025/101] 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 026/101] 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 027/101] 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 028/101] 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 029/101] 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 030/101] 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 031/101] 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 032/101] 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 033/101] 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 034/101] 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 035/101] 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 036/101] 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 037/101] 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 038/101] 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 039/101] 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 040/101] 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 041/101] 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 042/101] 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 043/101] 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 044/101] 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 045/101] 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 046/101] 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 047/101] 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 048/101] 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 049/101] 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 050/101] 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 051/101] 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 052/101] 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 053/101] 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 054/101] 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 055/101] 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 056/101] 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 057/101] 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 058/101] 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 059/101] 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 060/101] 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 061/101] 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 062/101] 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 063/101] 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 064/101] 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 065/101] 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 066/101] 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 067/101] 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 068/101] 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 069/101] 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 070/101] 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 071/101] 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 072/101] 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 0711d5a2892d1e8e8717274ed2d8cd9e6ec36234 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 29 Sep 2021 16:14:47 +0800 Subject: [PATCH 073/101] update code for contractData parse and gitignore --- .gitignore | 2 ++ src/smartContract.js | 58 ++++++++++++++++++++++++++++----------- test/smartContractTest.js | 7 +++-- 3 files changed, 48 insertions(+), 19 deletions(-) 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/src/smartContract.js b/src/smartContract.js index 2b924aa..52b647a 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -394,32 +394,58 @@ 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 returnJson = {}; + returnJson.status = false; 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]; + 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; }; diff --git a/test/smartContractTest.js b/test/smartContractTest.js index 58fbf6a..6387da8 100644 --- a/test/smartContractTest.js +++ b/test/smartContractTest.js @@ -50,7 +50,7 @@ function callContract(){ // contractEvent(myContract); /*use contract submit way*/ - contractSubmit(myContract); + // contractSubmit(myContract); // callContractWithMsgValue(myContract); @@ -122,8 +122,9 @@ function getFuncEncodeABI(contractObj){ console.log(funInputData); } function getFuncActualParams(contractObj){ - let contractData = "0xa9059cbb00000000000000000000000046ced18b2a3814f134378efd144cea58709a68c1000000000000000000000000000000000000000000000000000000000000007b"; - let actualParams = contractObj.decodeMethodParams(contractData); + let bytecode = "0x608060405260405162000c2d38038062000c2d8339818101604052810190620000299190620001b7565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600190805190602001906200008192919062000089565b50506200038c565b82805462000097906200029d565b90600052602060002090601f016020900481019282620000bb576000855562000107565b82601f10620000d657805160ff191683800117855562000107565b8280016001018555821562000107579182015b8281111562000106578251825591602001919060010190620000e9565b5b5090506200011691906200011a565b5090565b5b80821115620001355760008160009055506001016200011b565b5090565b6000620001506200014a8462000231565b62000208565b9050828152602081018484840111156200016f576200016e6200036c565b5b6200017c84828562000267565b509392505050565b600082601f8301126200019c576200019b62000367565b5b8151620001ae84826020860162000139565b91505092915050565b600060208284031215620001d057620001cf62000376565b5b600082015167ffffffffffffffff811115620001f157620001f062000371565b5b620001ff8482850162000184565b91505092915050565b60006200021462000227565b9050620002228282620002d3565b919050565b6000604051905090565b600067ffffffffffffffff8211156200024f576200024e62000338565b5b6200025a826200037b565b9050602081019050919050565b60005b83811015620002875780820151818401526020810190506200026a565b8381111562000297576000848401525b50505050565b60006002820490506001821680620002b657607f821691505b60208210811415620002cd57620002cc62000309565b5b50919050565b620002de826200037b565b810181811067ffffffffffffffff821117156200030057620002ff62000338565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b610891806200039c6000396000f3fe60806040526004361061004e5760003560e01c806341c0e1b5146100515780634ac0d66e1461006857806380cc6ac114610091578063cfae3217146100bc578063fe50cc72146100e75761004f565b5b005b34801561005d57600080fd5b506100666100fe565b005b34801561007457600080fd5b5061008f600480360381019061008a919061045a565b61018d565b005b34801561009d57600080fd5b506100a661020e565b6040516100b3919061063a565b60405180910390f35b3480156100c857600080fd5b506100d161024b565b6040516100de919061063a565b60405180910390f35b3480156100f357600080fd5b506100fc6102dd565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561018b5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b8060405161019b919061060c565b604051809103902060016040516101b29190610623565b60405180910390207f047dcd1aa8b77b0b943642129c767533eeacd700c7c1eab092b8ce05d2b2faf56001846040516101ec92919061065c565b60405180910390a3806001908051906020019061020a929190610347565b5050565b60606040518060400160405280600581526020017f68656c6c6f000000000000000000000000000000000000000000000000000000815250905090565b60606001805461025a9061079e565b80601f01602080910402602001604051908101604052809291908181526020018280546102869061079e565b80156102d35780601f106102a8576101008083540402835291602001916102d3565b820191906000526020600020905b8154815290600101906020018083116102b657829003601f168201915b5050505050905090565b60016040516102ec9190610623565b604051809103902060016040516103039190610623565b60405180910390207f047dcd1aa8b77b0b943642129c767533eeacd700c7c1eab092b8ce05d2b2faf560018060405161033d929190610693565b60405180910390a3565b8280546103539061079e565b90600052602060002090601f01602090048101928261037557600085556103bc565b82601f1061038e57805160ff19168380011785556103bc565b828001600101855582156103bc579182015b828111156103bb5782518255916020019190600101906103a0565b5b5090506103c991906103cd565b5090565b5b808211156103e65760008160009055506001016103ce565b5090565b60006103fd6103f8846106ef565b6106ca565b90508281526020810184848401111561041957610418610864565b5b61042484828561075c565b509392505050565b600082601f8301126104415761044061085f565b5b81356104518482602086016103ea565b91505092915050565b6000602082840312156104705761046f61086e565b5b600082013567ffffffffffffffff81111561048e5761048d610869565b5b61049a8482850161042c565b91505092915050565b60006104ae82610735565b6104b88185610740565b93506104c881856020860161076b565b6104d181610873565b840191505092915050565b60006104e782610735565b6104f18185610751565b935061050181856020860161076b565b80840191505092915050565b6000815461051a8161079e565b6105248186610740565b9450600182166000811461053f576001811461055157610584565b60ff1983168652602086019350610584565b61055a85610720565b60005b8381101561057c5781548189015260018201915060208101905061055d565b808801955050505b50505092915050565b6000815461059a8161079e565b6105a48186610751565b945060018216600081146105bf57600181146105d057610603565b60ff19831686528186019350610603565b6105d985610720565b60005b838110156105fb578154818901526001820191506020810190506105dc565b838801955050505b50505092915050565b600061061882846104dc565b915081905092915050565b600061062f828461058d565b915081905092915050565b6000602082019050818103600083015261065481846104a3565b905092915050565b60006040820190508181036000830152610676818561050d565b9050818103602083015261068a81846104a3565b90509392505050565b600060408201905081810360008301526106ad818561050d565b905081810360208301526106c1818461050d565b90509392505050565b60006106d46106e5565b90506106e082826107d0565b919050565b6000604051905090565b600067ffffffffffffffff82111561070a57610709610830565b5b61071382610873565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b82818337600083830152505050565b60005b8381101561078957808201518184015260208101905061076e565b83811115610798576000848401525b50505050565b600060028204905060018216806107b657607f821691505b602082108114156107ca576107c9610801565b5b50919050565b6107d982610873565b810181811067ffffffffffffffff821117156107f8576107f7610830565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f830116905091905056fea164736f6c6343000805000a"; + let contractData = "0x608060405260405162000C2D38038062000C2D8339818101604052810190620000299190620001B7565B336000806101000A81548173FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF021916908373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16021790555080600190805190602001906200008192919062000089565B50506200038C565B82805462000097906200029D565B90600052602060002090601F016020900481019282620000BB576000855562000107565B82601F10620000D657805160FF191683800117855562000107565B8280016001018555821562000107579182015B8281111562000106578251825591602001919060010190620000E9565B5B5090506200011691906200011A565B5090565B5B80821115620001355760008160009055506001016200011B565B5090565B6000620001506200014A8462000231565B62000208565B9050828152602081018484840111156200016F576200016E6200036C565B5B6200017C84828562000267565B509392505050565B600082601F8301126200019C576200019B62000367565B5B8151620001AE84826020860162000139565B91505092915050565B600060208284031215620001D057620001CF62000376565B5B600082015167FFFFFFFFFFFFFFFF811115620001F157620001F062000371565B5B620001FF8482850162000184565B91505092915050565B60006200021462000227565B9050620002228282620002D3565B919050565B6000604051905090565B600067FFFFFFFFFFFFFFFF8211156200024F576200024E62000338565B5B6200025A826200037B565B9050602081019050919050565B60005B83811015620002875780820151818401526020810190506200026A565B8381111562000297576000848401525B50505050565B60006002820490506001821680620002B657607F821691505B60208210811415620002CD57620002CC62000309565B5B50919050565B620002DE826200037B565B810181811067FFFFFFFFFFFFFFFF821117156200030057620002FF62000338565B5B80604052505050565B7F4E487B7100000000000000000000000000000000000000000000000000000000600052602260045260246000FD5B7F4E487B7100000000000000000000000000000000000000000000000000000000600052604160045260246000FD5B600080FD5B600080FD5B600080FD5B600080FD5B6000601F19601F8301169050919050565B610891806200039C6000396000F3FE60806040526004361061004E5760003560E01C806341C0E1B5146100515780634AC0D66E1461006857806380CC6AC114610091578063CFAE3217146100BC578063FE50CC72146100E75761004F565B5B005B34801561005D57600080FD5B506100666100FE565B005B34801561007457600080FD5B5061008F600480360381019061008A919061045A565B61018D565B005B34801561009D57600080FD5B506100A661020E565B6040516100B3919061063A565B60405180910390F35B3480156100C857600080FD5B506100D161024B565B6040516100DE919061063A565B60405180910390F35B3480156100F357600080FD5B506100FC6102DD565B005B60008054906101000A900473FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1673FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF163373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16141561018B5760008054906101000A900473FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1673FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16FF5B565B8060405161019B919061060C565B604051809103902060016040516101B29190610623565B60405180910390207F047DCD1AA8B77B0B943642129C767533EEACD700C7C1EAB092B8CE05D2B2FAF56001846040516101EC92919061065C565B60405180910390A3806001908051906020019061020A929190610347565B5050565B60606040518060400160405280600581526020017F68656C6C6F000000000000000000000000000000000000000000000000000000815250905090565B60606001805461025A9061079E565B80601F01602080910402602001604051908101604052809291908181526020018280546102869061079E565B80156102D35780601F106102A8576101008083540402835291602001916102D3565B820191906000526020600020905B8154815290600101906020018083116102B657829003601F168201915B5050505050905090565B60016040516102EC9190610623565B604051809103902060016040516103039190610623565B60405180910390207F047DCD1AA8B77B0B943642129C767533EEACD700C7C1EAB092B8CE05D2B2FAF560018060405161033D929190610693565B60405180910390A3565B8280546103539061079E565B90600052602060002090601F01602090048101928261037557600085556103BC565B82601F1061038E57805160FF19168380011785556103BC565B828001600101855582156103BC579182015B828111156103BB5782518255916020019190600101906103A0565B5B5090506103C991906103CD565B5090565B5B808211156103E65760008160009055506001016103CE565B5090565B60006103FD6103F8846106EF565B6106CA565B90508281526020810184848401111561041957610418610864565B5B61042484828561075C565B509392505050565B600082601F8301126104415761044061085F565B5B81356104518482602086016103EA565B91505092915050565B6000602082840312156104705761046F61086E565B5B600082013567FFFFFFFFFFFFFFFF81111561048E5761048D610869565B5B61049A8482850161042C565B91505092915050565B60006104AE82610735565B6104B88185610740565B93506104C881856020860161076B565B6104D181610873565B840191505092915050565B60006104E782610735565B6104F18185610751565B935061050181856020860161076B565B80840191505092915050565B6000815461051A8161079E565B6105248186610740565B9450600182166000811461053F576001811461055157610584565B60FF1983168652602086019350610584565B61055A85610720565B60005B8381101561057C5781548189015260018201915060208101905061055D565B808801955050505B50505092915050565B6000815461059A8161079E565B6105A48186610751565B945060018216600081146105BF57600181146105D057610603565B60FF19831686528186019350610603565B6105D985610720565B60005B838110156105FB578154818901526001820191506020810190506105DC565B838801955050505B50505092915050565B600061061882846104DC565B915081905092915050565B600061062F828461058D565B915081905092915050565B6000602082019050818103600083015261065481846104A3565B905092915050565B60006040820190508181036000830152610676818561050D565B9050818103602083015261068A81846104A3565B90509392505050565B600060408201905081810360008301526106AD818561050D565B905081810360208301526106C1818461050D565B90509392505050565B60006106D46106E5565B90506106E082826107D0565B919050565B6000604051905090565B600067FFFFFFFFFFFFFFFF82111561070A57610709610830565B5B61071382610873565B9050602081019050919050565B60008190508160005260206000209050919050565B600081519050919050565B600082825260208201905092915050565B600081905092915050565B82818337600083830152505050565B60005B8381101561078957808201518184015260208101905061076E565B83811115610798576000848401525B50505050565B600060028204905060018216806107B657607F821691505B602082108114156107CA576107C9610801565B5B50919050565B6107D982610873565B810181811067FFFFFFFFFFFFFFFF821117156107F8576107F7610830565B5B80604052505050565B7F4E487B7100000000000000000000000000000000000000000000000000000000600052602260045260246000FD5B7F4E487B7100000000000000000000000000000000000000000000000000000000600052604160045260246000FD5B600080FD5B600080FD5B600080FD5B600080FD5B6000601F19601F830116905091905056FEA164736F6C6343000805000A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000056473666167000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000056473666167000000000000000000000000000000000000000000000000000000"; + let actualParams = contractObj.decodeMethodParams(contractData, bytecode); console.log(actualParams); } From 660979e474e7b71bdeb8804b9ea3c731af685620 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Fri, 8 Oct 2021 18:42:44 +0800 Subject: [PATCH 074/101] support chainsql base58 address type in contract struct --- package.json | 2 +- src/smartContract.js | 83 +++++++++++++++++++++++++++++++++----------- 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index daf3cea..14d3f4f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.16", + "version": "0.70.17", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/smartContract.js b/src/smartContract.js index 52b647a..e14d6eb 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -309,12 +309,7 @@ Contract.prototype._decodeEventABI = function (currentEvent, data) { 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]; - } - }); + encodeChainsqlAddrParam(event.inputs, result.returnValues); } else{ //not array,what todo? @@ -411,9 +406,7 @@ Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData 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 paramsTypes = paramsABIJson.inputs; returnJson["funName"] = methodSignature === "0x60806040" ? "constructor" : paramsABIJson.name; if(0 === paramsTypes.length && "" === actualEncodeParams) @@ -426,16 +419,10 @@ Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData 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]; - } - }); + if(_.isArray(paramsTypes)){ + encodeChainsqlAddrParam(paramsTypes, result); } + returnJson["detail"] = result; returnJson.status = true; } catch (error) { returnJson["errMsg"] = error.message; @@ -464,7 +451,7 @@ Contract.prototype._decodeMethodReturn = function (outputs, returnValues) { 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; }) : []; + let newOutputs = _.isArray(outputs) ? outputs : []; encodeChainsqlAddrParam(newOutputs, result); if (result.__length__ === 1) { @@ -1063,17 +1050,71 @@ function dec2FixLenHex(decVal, fixedLen){ function encodeChainsqlAddrParam(types, result){ types.map(function(item, index) { - if(item === "address"){ + if(item.type === "address"){ result[index] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); + result[item.name] = result[index]; + } + else if(typeof(item) === "object" && + (item.type === "tuple" || item.type === "tuple[]")) { + let tupleTypes = item.components; + let tupleRet = result[index]; + if(item.type === "tuple") + { + tupleTypes.map((tupleItem, tupleIndex) => { + if(tupleItem.type === "address"){ + tupleRet[tupleIndex] = chainsqlUtils.encodeChainsqlAddr(tupleRet[tupleIndex].slice(2)); + tupleRet[tupleItem.name] = tupleRet[tupleIndex]; + } + }); + } + else if(item.type === "tuple[]") + { + tupleTypes.map((tupleItem, tupleIndex) => { + if(tupleItem.type === "address"){ + tupleRet = tupleRet.map((tupleRetItem, innerIndex) => { + tupleRetItem[tupleIndex] = chainsqlUtils.encodeChainsqlAddr(tupleRetItem[tupleIndex].slice(2)); + tupleRetItem[tupleItem.name] = tupleRetItem[tupleIndex]; + return tupleRetItem; + }) + } + }); + } + result[index] = tupleRet; + if(item.name) result[item.name] = result[index]; } }); } function decodeChainsqlAddrParam(types, args){ - let newArgs = args.map(function(item, index) { + let newArgs = args.map(function(item, index) { if(types[index] === "address"){ item = chainsqlUtils.decodeChainsqlAddr(item).toUpperCase(); } + else if(typeof(types[index]) === "object" && + (types[index].type === "tuple" || types[index].type === "tuple[]")) { + let tupleTypes = types[index].components; + if(types[index].type === "tuple") + { + item = item.map((tupleItem, index) => { + if(tupleTypes[index].type === "address"){ + tupleItem = chainsqlUtils.decodeChainsqlAddr(tupleItem).toUpperCase(); + } + return tupleItem; + }); + } + else if(types[index].type === "tuple[]") + { + item = item.map((tupleItem, index) => { + let newTupleItem = tupleItem.map((innerItem, innerIndex) => { + if(tupleTypes[innerIndex].type === "address"){ + innerItem = chainsqlUtils.decodeChainsqlAddr(innerItem).toUpperCase(); + } + return innerItem; + }); + return newTupleItem; + }); + } + } return item; }); return newArgs; From 34a12b25b03723d991562e9aad71a5c54e0f2f05 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 15 Oct 2021 17:39:04 +0800 Subject: [PATCH 075/101] remove check for db_ errors --- src/lib/util.js | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/lib/util.js b/src/lib/util.js index 55ae475..809acee 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -337,19 +337,21 @@ function checkExpect(opt) { } function checkSubError(data){ - if (data.status == 'db_error' - || data.status == 'validate_error' - || data.status == 'db_timeout' - || data.status == 'validate_timeout' - || data.status == 'db_noDbConfig' - || data.status == 'db_noSyncConfig' - || data.status == 'db_noAutoSync' - || data.status == 'db_noTableExistInDB' - || data.status == 'db_acctSecretError'){ - return true; - }else{ - return false; - } + // if (data.status == 'db_error' + // || data.status == 'validate_error' + // || data.status == 'db_timeout' + // || data.status == 'validate_timeout' + // || data.status == 'db_noDbConfig' + // || data.status == 'db_noSyncConfig' + // || data.status == 'db_noAutoSync' + // || data.status == 'db_noTableExistInDB' + // || data.status == 'db_acctSecretError' + // || data.status == 'db_notInSync'){ + // return true; + // }else{ + // return false; + // } + return true; } function isMeaningful(variable){ From fdfbb418f92251281fd2351617f2736ec774c94c Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 15 Oct 2021 17:39:21 +0800 Subject: [PATCH 076/101] Upgrade version to 0.70.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 14d3f4f..137d2f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.17", + "version": "0.70.18", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From 1057d7bd62f2df9f2001230b36c7af0c43259176 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Fri, 15 Oct 2021 17:45:53 +0800 Subject: [PATCH 077/101] 1. Modify db_ judgement 2. Upgrade version to 0.70.19 --- package.json | 2 +- src/lib/util.js | 22 +++++++--------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 137d2f6..124fe6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.18", + "version": "0.70.19", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/lib/util.js b/src/lib/util.js index 809acee..b73ca26 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -337,21 +337,13 @@ function checkExpect(opt) { } function checkSubError(data){ - // if (data.status == 'db_error' - // || data.status == 'validate_error' - // || data.status == 'db_timeout' - // || data.status == 'validate_timeout' - // || data.status == 'db_noDbConfig' - // || data.status == 'db_noSyncConfig' - // || data.status == 'db_noAutoSync' - // || data.status == 'db_noTableExistInDB' - // || data.status == 'db_acctSecretError' - // || data.status == 'db_notInSync'){ - // return true; - // }else{ - // return false; - // } - return true; + if (data.status == 'validate_error' + || data.status == 'validate_timeout' + || data.status.substring(0,3) == 'db_'){ + return true; + }else{ + return false; + } } function isMeaningful(variable){ From a85c50b37e0c82a90d8ed19431e4913b6452e908 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 25 Oct 2021 11:17:22 +0800 Subject: [PATCH 078/101] fix contract params for chainsql address array --- package.json | 2 +- src/smartContract.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 14d3f4f..974acbb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.17", + "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 e14d6eb..fd1fd56 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -1054,6 +1054,11 @@ function encodeChainsqlAddrParam(types, result){ result[index] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); result[item.name] = result[index]; } + else if(item.type === "address[]") { + result[index] = result[index].map((retItem, index) => { + return chainsqlUtils.encodeChainsqlAddr(retItem.slice(2)); + }) + } else if(typeof(item) === "object" && (item.type === "tuple" || item.type === "tuple[]")) { let tupleTypes = item.components; @@ -1090,6 +1095,11 @@ function decodeChainsqlAddrParam(types, args){ if(types[index] === "address"){ item = chainsqlUtils.decodeChainsqlAddr(item).toUpperCase(); } + else if(types[index] === "address[]") { + item = item.map((subItem, index) => { + return chainsqlUtils.decodeChainsqlAddr(subItem).toUpperCase(); + }) + } else if(typeof(types[index]) === "object" && (types[index].type === "tuple" || types[index].type === "tuple[]")) { let tupleTypes = types[index].components; From 8a515ec9307a616bfca45437ff8ccc70eba81490 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 25 Nov 2021 16:01:27 +0800 Subject: [PATCH 079/101] Encrypt raw bug for modify table field --- src/index.js | 5 ++++- src/lib/util.js | 7 ++++--- src/table.js | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index 813ba39..28ad5ec 100644 --- a/src/index.js +++ b/src/index.js @@ -1130,7 +1130,10 @@ ChainsqlAPI.prototype.prepareJson = function(){ 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) { + //default:confidential + that.confidential = true; + var tableName = util.convertHexToString(that.payment.tables[0].Table.TableName) + util.tryEncryptRaw(that,that.payment,tableName).then(function (raw) { that.payment.raw = raw; that.api.prepareTable(that, that.payment, resolve, reject); }).catch(function(error) { diff --git a/src/lib/util.js b/src/lib/util.js index b73ca26..7179f15 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -430,10 +430,11 @@ function getCryptAlgTypeFromAccout(account){ return cryptoAlg; } -function tryEncryptRaw(ChainSQL, payment) { +function tryEncryptRaw(ChainSQL, payment, tableName) { var that = ChainSQL; var raw = payment.raw; + var name = tableName; return new Promise(function (resolve, reject) { if(! that.confidential){ @@ -444,8 +445,8 @@ function tryEncryptRaw(ChainSQL, payment) { // 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]; + getUserToken(connect.api.connection, connect.scope, connect.address, name).then(function (token) { + token = token[that.connect.scope + name]; var ciperRaw; if (token && token != '') { diff --git a/src/table.js b/src/table.js index 172a91c..b0fdefc 100644 --- a/src/table.js +++ b/src/table.js @@ -456,7 +456,7 @@ Table.prototype.prepareJson = function() { function prepareTable(ChainSQL, payment, resolve, reject) { var connect = ChainSQL.connect; - tryEncryptRaw(ChainSQL,payment).then(function (raw) { + tryEncryptRaw(ChainSQL,payment,ChainSQL.tab).then(function (raw) { payment.raw = raw; connect.api.prepareTable(connect, payment, resolve, reject); }).catch(function(error) { From b3d29a9075a5d9ffa14ddb55072e5549dd58772f Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 25 Nov 2021 16:03:59 +0800 Subject: [PATCH 080/101] Upgrade version to 0.70.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 974acbb..ddd972a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.20", + "version": "0.70.21", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From d16114a6cf0962d8524e85e10342c1437a7fd91d Mon Sep 17 00:00:00 2001 From: luleigreat Date: Mon, 27 Dec 2021 16:23:21 +0800 Subject: [PATCH 081/101] Tale and Ripple use instructions in Chainsql --- src/ripple.js | 1 + src/table.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/ripple.js b/src/ripple.js index ca9dde5..a5e896b 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -7,6 +7,7 @@ var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { super().ChainsqlAPI = ChainsqlAPI; + this.instructions = ChainsqlAPI.instructions; } submit(cb) { diff --git a/src/table.js b/src/table.js index b0fdefc..f944055 100644 --- a/src/table.js +++ b/src/table.js @@ -20,6 +20,7 @@ class Table extends Submit { this.txHashField = null; this.ledgerSeqField = null; this.ledgerTimeField = null; + this.instructions = ChainsqlAPI.instructions; } submit (cb) { From 348626d922c61cf362a5c8aabdca20260396d0bb Mon Sep 17 00:00:00 2001 From: Mojicode Date: Mon, 27 Dec 2021 17:00:14 +0800 Subject: [PATCH 082/101] support txSign for contract --- package.json | 2 +- src/smartContract.js | 62 ++++++++++++++++++++------------------- test/smartContractTest.js | 7 +++++ 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index ddd972a..f1cf35e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.21", + "version": "0.70.22", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/smartContract.js b/src/smartContract.js index fd1fd56..21b92c2 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -647,6 +647,7 @@ Contract.prototype._createTxObject = function _createTxObject(){ // 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.txSign = this.parent._executeMethod.bind(txObject, 'txSign'); txObject.encodeABI = this.parent._encodeMethodABI.bind(txObject); txObject.estimateGas = this.parent._executeMethod.bind(txObject, 'estimate'); @@ -708,6 +709,7 @@ Contract.prototype._executeMethod = function _executeMethod(){ return payload; } else { let errorMsg = ""; + let onlyTxSign = false; switch (args.type) { // case 'estimate': // var estimateGas = (new Method({ @@ -745,6 +747,8 @@ Contract.prototype._executeMethod = function _executeMethod(){ } break; // TODO check errors: missing "from" should give error on deploy and send, call ? + case 'txSign': + onlyTxSign = true; case 'submit':{ let contractData = args.options.data.length >= 2 ? args.options.data.slice(2) : args.options.data; let contractValue = "0"; @@ -790,10 +794,10 @@ Contract.prototype._executeMethod = function _executeMethod(){ contractObj.options.isDeploy = args.options.isDeploy; if ((typeof args.callback) != 'function') { return new Promise(function (resolve, reject) { - handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, resolve, reject); + handleContractPayment(contractObj, sendTxPayment, onlyTxSign, txCallbackProperty, resolve, reject); }); } else { - handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, null, null); + handleContractPayment(contractObj, sendTxPayment, onlyTxSign, txCallbackProperty, null, null); } break; } @@ -852,16 +856,28 @@ function handleContractCall(curFunObj, callObj, callBack, resolve, reject) { }); } -function handleContractPayment(contractObj, contractPaymet, callbackProperty, resolve, reject){ +function handleContractPayment(contractObj, contractPaymet, onlyTxSign = false, 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 ((typeof callBack) == 'function') { + if (isFunction) { callBack(error, null); } else { reject(error); } }; + var sucFunc = function(data){ + if(isFunction){ + callBack(null,data); + }else{ + resolve(data); + } + }; + prepareContractPayment(chainSQL, contractPaymet).then(data => { if(chainSQL.connect.userCert != undefined && (typeof(data.txJSON) == "string") ){ var txJson = JSON.parse(data.txJSON); @@ -871,7 +887,11 @@ function handleContractPayment(contractObj, contractPaymet, callbackProperty, re } let signedRet = chainSQL.api.sign(data.txJSON, chainSQL.connect.secret); - submitContractTx(contractObj, signedRet, callbackProperty, resolve, reject); + if(onlyTxSign === true) { + sucFunc(signedRet); + } else { + submitContractTx(contractObj, signedRet, callbackProperty.callbackExpect, errFunc, sucFunc); + } }).catch(err => { errFunc(err); }); @@ -897,29 +917,11 @@ function createContractPayment(contractPayment){ } return txJSON; } -function submitContractTx(contractObj, signedVal, callbackProperty, resolve, reject){ +function submitContractTx(contractObj, signedVal, callbackExpect, errFunc, sucFunc){ 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"){ + if(callbackExpect !== "send_success"){ chainSQL.event.subscribeTx(signedVal.id, function(err, data) { if (err) { errFunc(err); @@ -930,7 +932,7 @@ function submitContractTx(contractObj, signedVal, callbackProperty, resolve, rej resultObj.status = data.status; resultObj.tx_hash = data.transaction.hash; - if (callbackProperty.callbackExpect === data.status && data.type === 'singleTransaction') { + if (callbackExpect === data.status && data.type === 'singleTransaction') { if(contractObj.options.isDeploy) { return getNewDeployCtrAddr(chainSQL, data.transaction.hash).then(contractAddr => { if (contractAddr === "") { @@ -973,14 +975,14 @@ function submitContractTx(contractObj, signedVal, callbackProperty, resolve, rej 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); + if(callbackExpect !== "send_success"){ + unsubscribeTx(callbackExpect, chainSQL, signedVal, errFunc); } //return error message errFunc(result); } else { // submit successfully - if(callbackProperty.callbackExpect === "send_success"){ + if(callbackExpect === "send_success"){ sucFunc({ status: "send_success", tx_hash: signedVal.id @@ -988,7 +990,7 @@ function submitContractTx(contractObj, signedVal, callbackProperty, resolve, rej } } }).catch(function(error) { - unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); + unsubscribeTx(callbackExpect, chainSQL, signedVal, errFunc); errFunc(error); }); } diff --git a/test/smartContractTest.js b/test/smartContractTest.js index 6387da8..c59457a 100644 --- a/test/smartContractTest.js +++ b/test/smartContractTest.js @@ -51,6 +51,8 @@ function callContract(){ /*use contract submit way*/ // contractSubmit(myContract); + + getTxSign(myContract); // callContractWithMsgValue(myContract); @@ -62,6 +64,11 @@ function callContract(){ /*methods.function.auto*/ // contractAuto(myContract); } +function getTxSign(myContract) { + myContract.methods.set(123).txSign((err, res) => { + err ? console.log(err) : console.log(res); + }) +} function contractSubmit(myContract){ /*methods.function.submit*/ From e8e6cb9e2340879ae2d85c1e025373a480293f6f Mon Sep 17 00:00:00 2001 From: dbliu Date: Fri, 7 Jan 2022 11:34:55 +0800 Subject: [PATCH 083/101] support to recover keypairs with mnemonic --- package.json | 3 ++- src/index.js | 70 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index f1cf35e..ff7ed6b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "web3-core-helpers": "1.0.0-beta.36", "web3-eth-abi": "1.0.0-beta.36", "web3-utils": "1.0.0-beta.36", - "rimraf": "^3.0.0" + "rimraf": "^3.0.0", + "rfc1751.js": "^1.0.0" }, "devDependencies": { "assert-diff": "^1.0.1", diff --git a/src/index.js b/src/index.js index 28ad5ec..b7fe29f 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,8 @@ const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); const chainsqlError = require('./lib/error'); +const rfc1751 = require('rfc1751.js'); +const brorand = require('brorand'); _.assign(RippleAPI.prototype, { prepareTable: require('./tablePayment'), @@ -151,39 +153,65 @@ ChainsqlAPI.prototype.contract = function(jsonInterface, address, options) { } ChainsqlAPI.prototype.generateAddress = function () { + let createAccount = function (options) { + let account = {} + let keypair + if (typeof (options) === "object") { + if (options.mnemonic && options.mnemonic.length >= 16) { + options.entropy = rfc1751.etob(options.mnemonic) + } + let seed = keypairs.generateSeed(options); + keypair = keypairs.deriveKeypair(seed); - var account = {secret:"",address:""}; - var keypair; - let ripple = new RippleAPI(); - if (arguments.length == 0) { - account = ripple.generateAddress(); - keypair = keypairs.deriveKeypair(account.secret); - } else { - if(typeof(arguments[0]) === "object" ) { - let seed = keypairs.generateSeed(arguments[0]); - keypair = keypairs.deriveKeypair(seed); - - if(typeof(seed) !== "object"){ + if (typeof (seed) !== "object") { // ed25519 account.secret = seed; - }else{ + account.mnemonic = rfc1751.btoe(options.entropy) + } else { // softGMAlg account.secret = util.encodeChainsqlAccountSecret(keypair.privateKey) } - } else { keypair = keypairs.deriveKeypair(arguments[0]) - account.secret =arguments[0] + account.secret = arguments[0] } - account.address = keypairs.deriveAddress(keypair.publicKey); + + var opt = { + version: 35 + } + var buf = Buffer.from(keypair.publicKey, 'hex'); + account.publicKey = addressCodec.encode(buf, opt); + account.publicKey_hex = keypair.publicKey + return account } - var opt = { - version: 35 + + let randomValues = function(length) { + let array = []; + if (global.wx) { + for (var i = 0, l = length; i < l; i++) { + array[i] = Math.floor(Math.random() * 256); + } + } else { + array = brorand(length) + } + return array; + } + + let options + if (arguments.length == 0) { + options = { + entropy: randomValues(16) + } + } else { + options = arguments[0] + if (typeof (options) === "object") { + if (!options.mnemonic && !options.entropy) { + options.entropy = randomValues(16) + } + } } - var buf = Buffer.from(keypair.publicKey, 'hex'); - account.publicKey = addressCodec.encode(buf, opt); - return account; + return createAccount(options) } // active account From 3c634c58005c7ab58cf335736073c03fd1150899 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 11 Jan 2022 14:43:45 +0800 Subject: [PATCH 084/101] Fix bug table tx support instructions set --- src/table.js | 5 +---- src/tablePayment.js | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/table.js b/src/table.js index f944055..28c903f 100644 --- a/src/table.js +++ b/src/table.js @@ -20,7 +20,6 @@ class Table extends Submit { this.txHashField = null; this.ledgerSeqField = null; this.ledgerTimeField = null; - this.instructions = ChainsqlAPI.instructions; } submit (cb) { @@ -455,11 +454,9 @@ Table.prototype.prepareJson = function() { } function prepareTable(ChainSQL, payment, resolve, reject) { - - var connect = ChainSQL.connect; tryEncryptRaw(ChainSQL,payment,ChainSQL.tab).then(function (raw) { payment.raw = raw; - connect.api.prepareTable(connect, payment, resolve, reject); + ChainSQL.connect.api.prepareTable(ChainSQL.ChainsqlAPI, payment, resolve, reject); }).catch(function(error) { reject(error); }); diff --git a/src/tablePayment.js b/src/tablePayment.js index 2f1b91a..4feeb2d 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -74,9 +74,7 @@ function checkTablePayment(payment) if(payment.address === undefined) return "account is null, please use the function 'as' first."; return ""; } -function prepareTablePayment(payment, chainsqlApi) { - var instructions = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - //validate.preparePayment({ address: address, payment: payment, instructions: instructions }); +function prepareTablePayment(payment, chainsqlApi,instructions) { let err = checkTablePayment(payment) if( err != "") return Promise.reject(err); var txJSON = createPaymentTransaction(payment); @@ -86,7 +84,7 @@ function prepareTablePayment(payment, chainsqlApi) { function prepareTable(ChainSQL, payment, resolve, reject) { - prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { + prepareTablePayment(payment, ChainSQL.api,ChainSQL.instructions).then(function (tx_json) { var dropsPerByte = Math.ceil(1000000.0 / 1024);; From b6976055bdf55bbb0756a53b2ed8e43395993c46 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 11 Jan 2022 14:44:06 +0800 Subject: [PATCH 085/101] upgrade version to 0.70.25 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f1cf35e..307ed5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.22", + "version": "0.70.25", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From 6fb3ec3d95955902854341e83b1df10c95b928b7 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Tue, 11 Jan 2022 15:04:34 +0800 Subject: [PATCH 086/101] smartContract support instructions set --- package.json | 2 +- src/smartContract.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 54809e9..09544b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.25", + "version": "0.70.26", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/smartContract.js b/src/smartContract.js index 21b92c2..411cbc3 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -897,7 +897,7 @@ function handleContractPayment(contractObj, contractPaymet, onlyTxSign = false, }); } function prepareContractPayment(chainSQL, contractPayment){ - var instructions = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var instructions = chainSQL.instructions; const txJSON = createContractPayment(contractPayment); return chainsqlLibUtils.prepareTransaction(txJSON, chainSQL.api, instructions); } From e492030997336dac68adcac4442bc4f3471d69f3 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 12 Jan 2022 15:26:22 +0800 Subject: [PATCH 087/101] update asym&sym enc&dec code --- package.json | 2 +- src/index.js | 43 +++++++++++++++++++------------------------ src/lib/crypto.js | 22 +++++++++++----------- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index ff7ed6b..54809e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.22", + "version": "0.70.25", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/index.js b/src/index.js index b7fe29f..0ae9d9f 100644 --- a/src/index.js +++ b/src/index.js @@ -891,21 +891,11 @@ ChainsqlAPI.prototype.sign = function (json, secret, option) { return ripple.sign(JSON.stringify(json), secret, option); }; -ChainsqlAPI.prototype.eciesEncrypt = function (plainText, publicKey) { - return crypto.eciesEncrypt(plainText,publicKey); -} - -ChainsqlAPI.prototype.eciesDecrypt = function (cipher, secret) { - var keypair = keypairs.deriveKeypair(secret); - return crypto.eciesDecrypt(cipher,keypair.privateKey); -} - - - /** * 对称加密 - * @param {*} plainText - * @param {*} publicKey + * @param {*} symKey + * @param {*} plaintext + * @param {*} algType */ ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') { return crypto.symEncrypt(symKey,plaintext,algType); @@ -913,11 +903,11 @@ ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') /** * 对称解密 - * @param {*} cipher - * @param {*} privateKey + * @param {*} symKey + * @param {*} encryptedHex + * @param {*} algType */ ChainsqlAPI.prototype.symDecrypt = function (symKey, encryptedHex, algType = 'aes') { - return crypto.symDecrypt(symKey, encryptedHex, algType); } @@ -925,21 +915,29 @@ ChainsqlAPI.prototype.symDecrypt = function (symKey, encryptedHex, algType = 'ae * 非对称加密 * @param {*} plainText * @param {*} publicKey + * @param {*} algType */ -ChainsqlAPI.prototype.asymEncrypt = function (plainText, publicKey) { - return keypairs.asymEncrypt(plainText,publicKey); +ChainsqlAPI.prototype.asymEncrypt = function (plainText, publicKey, algType = 'ecies') { + return crypto.asymEncrypt(plainText, publicKey, algType); } /** * 非对称解密 * @param {*} cipher * @param {*} privateKey + * @param {*} algType */ -ChainsqlAPI.prototype.asymDecrypt = function (cipher, privateKey) { +ChainsqlAPI.prototype.asymDecrypt = function (cipher, privateKey, algType = 'ecies') { + return crypto.asymDecrypt(cipher,privateKey, algType); +} - return keypairs.asymDecrypt(cipher,privateKey); +ChainsqlAPI.prototype.encryptText = function(plainText,listPublic) { + return crypto.encryptText(plainText,listPublic); } +ChainsqlAPI.prototype.decryptText = function(cipherText,secret) { + return crypto.decryptText(cipherText,secret); +} ChainsqlAPI.prototype.getAccountTables = function(address, bGetDetailInfo=false){ var connection = this.api ? this.api.connection : this.connect.api.connection; @@ -1290,7 +1288,7 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ if(!bValid){ throw new Error("Invalid modifySchema parameter"); } - + var peerlists = [] var i = 0; var len = schemaInfo.PeerList.length @@ -1327,11 +1325,8 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ this.schemaModifyTx = true; this.payment = schemaModifyTxJson; return this; - }; - - function callback(data, callback) { } diff --git a/src/lib/crypto.js b/src/lib/crypto.js index a452ebb..348ccfc 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -246,12 +246,12 @@ var symEncrypt = function(symKey, plaintext, algType = 'aes') { */ 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); + 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); } }; @@ -273,13 +273,13 @@ var aesEncrypt = function(secret, plaintext) { * @returns string 解密后的明文 */ var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { - if(algType === "gmAlg") { - return keypairs.gmAlgSymDec(symKey, encryptedHex); + if(algType === "gmAlg") { + return keypairs.gmAlgSymDec(symKey, encryptedHex); } else if(algType === "softGMAlg"){ return keypairs.softGMAlgSymDec(symKey, encryptedHex); - }else { - return aesDecrypt(symKey, encryptedHex); - } + }else { + return aesDecrypt(symKey, encryptedHex); + } }; /** From 6ed1a52d35993d6871d40b64ca9e9a3c7c918815 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 12 Jan 2022 15:53:21 +0800 Subject: [PATCH 088/101] update version to 0.70.29 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 707c601..41308c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.27", + "version": "0.70.29", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From b9175264e30531f78f50c4359e03897838b7b115 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 12 Jan 2022 18:05:27 +0800 Subject: [PATCH 089/101] update asym enc&dec --- package.json | 2 +- src/lib/crypto.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 41308c6..3dbc252 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.29", + "version": "0.70.30", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/lib/crypto.js b/src/lib/crypto.js index 348ccfc..dcfd0ed 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -289,14 +289,14 @@ var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { * @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); + const keypair = keypairs.deriveKeypair(privateKey); + return eciesDecrypt(encryptedHex, keypair.privateKey); } }; From 8190e33f9051731d83eca6fb5f3b2060554a51b1 Mon Sep 17 00:00:00 2001 From: wufeipeng Date: Mon, 17 Jan 2022 15:25:24 +0800 Subject: [PATCH 090/101] change the calculate way for float number. form 1.006 - 1 to decimal(1.006).sub(decimal(1) due to the presion will change using the old way. --- src/ripple.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ripple.js b/src/ripple.js index a5e896b..e4e87b0 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -2,7 +2,9 @@ var util = require('./lib/util'); var Submit = require('./submit'); const FloatOperation = require('./lib/floatOperation'); +var Decimal = require('decimal.js'); var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +const { intersection } = require('lodash'); class Ripple extends Submit { constructor(ChainsqlAPI) { @@ -59,7 +61,7 @@ Ripple.prototype.prepareJson = function () { fee = parseFloat(data.min); } else if (data.rate) { //Only TransferRate or with TranferFeeMin < TransferFeeMax - fee = FloatOperation.accMul(parseFloat(value), data.rate - 1); + fee = FloatOperation.accMul(parseFloat(value), new Decimal(data.rate).sub(new Decimal(1)).toNumber()); if (data.min) { fee = Math.max(fee, parseFloat(data.min)); } From 42b98668480cebca6243dd940875c6780e8aaaf9 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Wed, 19 Jan 2022 18:11:09 +0800 Subject: [PATCH 091/101] Upgrade version to 0.70.31 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3dbc252..1db0ada 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.30", + "version": "0.70.31", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From 8ca7af1a7c2c113edc4fcc3d78b8d509056b0dc8 Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Thu, 24 Feb 2022 11:51:56 +0800 Subject: [PATCH 092/101] Add account authorization --- src/index.js | 7 ++++++- src/ripple.js | 18 ++++++++++++++++++ test/testRipple.js | 19 ++++++++++++++++--- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index 0ae9d9f..8a4b8df 100644 --- a/src/index.js +++ b/src/index.js @@ -90,7 +90,7 @@ ChainsqlAPI.prototype.connect = function (url, cb) { this.event = new EventManager(this); if ((typeof cb) != 'function') { return con.connect(); - } else { + } else { con.connect().then(function (data) { cb(null, data) }).catch(function (err) { @@ -292,6 +292,11 @@ ChainsqlAPI.prototype.trustSet = function (amount) { return ripple.trustSet(amount); } +ChainsqlAPI.prototype.accountAuthorize = function (nFlag, bSet, account) { + let ripple = new Ripple(this); + return ripple.accountAuthorize(nFlag, bSet, account); +} + ChainsqlAPI.prototype.escrowCreate = function (sDestAddr, amount, opt) { let ripple = new Ripple(this); return ripple.escrowCreate(sDestAddr, amount, opt); diff --git a/src/ripple.js b/src/ripple.js index e4e87b0..c942d6a 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -108,6 +108,9 @@ Ripple.prototype.prepareJson = function () { else if (transactionType === "PayToContract") { return chainsqlLibUtils.prepareTransaction(txJson, this.ChainsqlAPI.api, {}); } + else if (transactionType === "Authorize") { + return chainsqlLibUtils.prepareTransaction(txJson, this.ChainsqlAPI.api, {}); + } } Ripple.prototype.preparePayment = function (account, amount, memos) { @@ -273,6 +276,21 @@ Ripple.prototype.trustSet = function (amount) { return this; } +Ripple.prototype.accountAuthorize = function (nFlag, bSet, account) { + var self = this; + var setting = {}; + setting.Account = this.ChainsqlAPI.connect.address; + if(bSet) + setting.SetFlag = nFlag; + else + setting.ClearFlag = nFlag; + setting.TransactionType = "Authorize"; + setting.Destination = account; + this.txType = "Authorize"; + this.txJSON = setting; + return this; +} + Ripple.prototype.escrowCreate = function (sDestAddr, amount, opt) { var _amount = { value: 0 } var type = typeof(amount); diff --git a/test/testRipple.js b/test/testRipple.js index 1313141..771570b 100644 --- a/test/testRipple.js +++ b/test/testRipple.js @@ -32,7 +32,7 @@ var user3 = { var tagStep = { active: 1, gateWay: 2, escrow: 3, - balances: 4, getLedger: 5, getTxs: 6 + balances: 4, getLedger: 5, getTxs: 6,authorize:7, } var sCurrency = "aaa" var whiteLists = [ @@ -45,12 +45,12 @@ main(); async function main() { // let res = await c.connect('ws://101.201.40.124:5006'); let res = await c.connect('ws://localhost:5510'); - await c.setSchema("8B0BA6D8848C76E19433EE90E2A88210E403339F2C5AC750271EFC862A173894"); + // await c.setSchema("8B0BA6D8848C76E19433EE90E2A88210E403339F2C5AC750271EFC862A173894"); c.as(root); c.setRestrict(true); /**************************************/ - let nStep = tagStep.gateWay; + let nStep = tagStep.authorize; switch (nStep) { case tagStep.active: testActive(); break;// 激活若干账户 case tagStep.gateWay: testGateWay(); break;//部署网管,信任,发行币转账 @@ -58,6 +58,7 @@ async function main() { case tagStep.balances: testBalances(); break;//账户余额 case tagStep.getTxs: testTransactions(); break; case tagStep.getLedger: testGetLedger(); break; + case tagStep.authorize: testAuthorize();break; default: break; } /**************************************/ @@ -251,3 +252,15 @@ var testGetLedger = async function () { console.log("err:", err); }); } + +var testAuthorize = async function(){ + try { + //参数: 授权/取消授权哪个权限、是否是授权、给谁授权 + // 12 转账的权限, 13 部署合约的权限, 14 创建表的权限, 15发行数字资产的权限, 16 admin权限 + var ret = await c.accountAuthorize(12, true, user2.address).submit({ expect: 'validate_success' }); + console.log("accountAuthorize ", ret); + } catch (error) { + console.error("accountAuthorize ", error); + } + +} \ No newline at end of file From 209e6ed2133826f322d6134a1bebbd88e8c37bae Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Thu, 24 Feb 2022 13:50:51 +0800 Subject: [PATCH 093/101] Modify version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1db0ada..919de00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.31", + "version": "0.70.32", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { From af9735655e3fbd591ccbb12474905ce295c7dc5a Mon Sep 17 00:00:00 2001 From: lascion Date: Thu, 24 Feb 2022 13:56:09 +0800 Subject: [PATCH 094/101] modify connect function --- package.json | 2 +- src/index.js | 18 +++++------------- src/lib/crypto.js | 3 --- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 1db0ada..53c3af8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.70.31", + "version": "3.0.0", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/index.js b/src/index.js index 0ae9d9f..361376e 100644 --- a/src/index.js +++ b/src/index.js @@ -78,25 +78,17 @@ class ChainsqlAPI extends Submit { } }; -ChainsqlAPI.prototype.connect = function (url, cb) { - let ra = new RippleAPI({ - server: url - }); +ChainsqlAPI.prototype.connect = function (url, opt) { + let conOpt = opt === undefined ? {} : opt; + conOpt.server =url; + let ra = new RippleAPI(conOpt); let con = new Connection(); con.api = ra; this.api = ra; this.ChainsqlAPI = this; this.connect = con; this.event = new EventManager(this); - if ((typeof cb) != 'function') { - return con.connect(); - } else { - con.connect().then(function (data) { - cb(null, data) - }).catch(function (err) { - cb(err); - }); - } + return con.connect(); } ChainsqlAPI.prototype.disconnect = function (cb) { if ((typeof cb) != 'function') { diff --git a/src/lib/crypto.js b/src/lib/crypto.js index dcfd0ed..b1d960b 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -138,9 +138,6 @@ function eciesDecrypt(messageHex, privateKey) { //console.log("plainMsg: ",plainMsgBuf.toString()); return plainMsgBuf; } - - - function hmac(key, bytes) { //debug('key: ', JSON.stringify(key)); //debug('bytes: ', JSON.stringify(bytes)); From e544bef88eb2bc32a777f816c9c43825bca7da56 Mon Sep 17 00:00:00 2001 From: luleigreat Date: Thu, 3 Mar 2022 10:14:59 +0800 Subject: [PATCH 095/101] Support submitSigned and support multisign case --- package.json | 2 +- src/submit.js | 15 ++++++++ test/test-multi-sign.js | 85 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 test/test-multi-sign.js diff --git a/package.json b/package.json index 95aeca5..8165a68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "3.0.1", + "version": "3.0.2", "description": "A database driver for chainsql ", "main": "dist/npm/", "directories": { diff --git a/src/submit.js b/src/submit.js index 0df3aa3..2436c13 100644 --- a/src/submit.js +++ b/src/submit.js @@ -32,6 +32,21 @@ Submit.prototype.submit = function (expectOpt) { }); }; +Submit.prototype.submitSigned = function (signedRet,expectOpt) { + if(!expectOpt){ + expectOpt = { expect:"send_success"} + } + let self = this; + return new Promise(function (resolve, reject) { + try { + self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); + } catch (error) { + reject(error); + } + }); +}; + + /** * @return {JsonObject} diff --git a/test/test-multi-sign.js b/test/test-multi-sign.js new file mode 100644 index 0000000..7504190 --- /dev/null +++ b/test/test-multi-sign.js @@ -0,0 +1,85 @@ +'use strict' +const ChainsqlAPI = require('../src/index'); +const c = new ChainsqlAPI(); + +var root = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + +var dest = { + address:"zNwzhavZ8RKwVQXrgWEHA7D1ECMxSbhkqh", + secret:"xhPSwyuj8CXxsWAVWhCkQ7goYwrfS" +} + +var delegate1 = { + secret: "xxtRnGpMidGqnPHScAyqi8HPaVjP6", + address: "z9ngquq2N3cM3d2QgkpJyxyDTeKTEEQjJu" +} + +var delegate2 = { + secret: "xxVyTszchsQSd8NHwqsQw5seaLm2D", + address: "zKF62SGrX8VDvDBH1s4XryUpaXVEBNCb24" +} + +var delegate3 = { + secret: "xnC8sDgEWWFX4aQ1593G9KN5U69so", + address: "zKvTeQfUa6NqxrfomQi4vKv8Q4aiS7dR2z" +} + +main(); +async function main() { + await c.connect('ws://127.0.0.1:6006'); + console.log("connect successfully."); + + var signRet,res; + // 1. 设置多方签名列表 + var signerListSet = getSignerListSetJson(root.address,[delegate1.address,delegate2.address,delegate3.address]) + await c.api.prepareTx(signerListSet); + signRet = c.sign(signerListSet,root.secret); + res = await c.submitSigned(signRet) + console.log("submit signerListSet result:"+ JSON.stringify(res)); + + // 2. 通过多方签名转账 + var payment = getPaymentJson(root.address,dest.address,"100000000"); + await c.api.prepareTx(payment,null,{signersCount:3}); + signRet = c.sign(payment,delegate1.secret,{signAs:delegate1.address}); + console.log(signRet); + signRet = c.sign(signRet.tx_json,delegate2.secret,{signAs:delegate2.address}); + console.log(signRet); + signRet = c.sign(signRet.tx_json,delegate3.secret,{signAs:delegate3.address}); + console.log(signRet); + res = await c.submitSigned(signRet,{expect:'validate_success'}) + console.log("submit signerListSet result:"+ JSON.stringify(res)); + +} + +function getSignerListSetJson(source,list){ + var signerList = { + Flags: 0, + TransactionType: "SignerListSet", + Account: source, + Fee: "12", + SignerQuorum: list.length, + SignerEntries: [] + } + for(var i in list){ + signerList.SignerEntries.push({ + "SignerEntry": { + "Account": list[i], + "SignerWeight": 1 + } + }); + } + + return signerList +} + +function getPaymentJson(from,dest,amount){ + return { + "TransactionType": "Payment", + "Account": from, + "Destination": dest, + "Amount": amount + } +} \ No newline at end of file From ba13fe6a5089e3d7f6892d685869cf811c51752c Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Tue, 22 Mar 2022 15:01:23 +0800 Subject: [PATCH 096/101] Modify the precompiled contract test case --- test/testPreCompiledContractTableTxs.js | 184 ++++++++++++++++++++++-- test/testSign.js | 49 ++++--- 2 files changed, 199 insertions(+), 34 deletions(-) diff --git a/test/testPreCompiledContractTableTxs.js b/test/testPreCompiledContractTableTxs.js index 28d72f0..ebeb386 100644 --- a/test/testPreCompiledContractTableTxs.js +++ b/test/testPreCompiledContractTableTxs.js @@ -17,7 +17,7 @@ var user = { secret: "xnnUqirFepEKzVdsoBKkMf577upwT" } -var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; +var flag = "[{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}]"; var sTableName = "n9"; var sTableNameNew = "n4" @@ -37,16 +37,22 @@ var rawInsert = "[ \ { \"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 rawDelete = "[{\"id\":1}]" +var rawUpdate = "[{ \"account\": \"134\" },{\"id\": 2}]" var autoFillField = "txHash"; +var rawAddFeild = "[{\"field\":\"age\",\"type\":\"int\"}]"; +var rawDeleteFeild = "[{\"field\":\"age\"}]"; +var rawModifyFeild = "[{\"field\":\"age\",\"type\":\"varchar\",\"length\":10}]"; +var rawCreateIndex = "[{\"index\":\"AcctLgrIndex\"},{\"field\":\"email\"},{\"field\":\"Account\"}]"; +var rawDeleteIndex = "[{\"index\":\"AcctLgrIndex\"}]"; + + 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"}]'; +const abi = '[{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"addFields","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x76d878ee"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"addFieldsByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0xde5c3865"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"create","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x198e2b8a"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"createByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x6236be8d"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"createIndex","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0xff1cc4c6"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"createIndexByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x04e850a7"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"deleteFields","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0xe6920507"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"deleteFieldsByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x8d0f1a80"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"deleteIndex","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0xc52a8734"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"deleteIndexByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x6219f697"},{"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","signature":"0x746ecd69"},{"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","signature":"0x6687a78d"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"}],"name":"drop","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x5310b551"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"}],"name":"dropByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0xf5ad5c85"},{"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","signature":"0x99489c21"},{"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","signature":"0xcf22eb59"},{"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","signature":"0x1ad5321a"},{"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","signature":"0x411304cb"},{"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","signature":"0x8b0a4ee1"},{"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","signature":"0x3a396228"},{"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","signature":"0x6c02d692"},{"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","signature":"0xb24ab465"},{"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","signature":"0x8d5df802"},{"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","signature":"0x8f44bd6a"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"modifyFields","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0xd618613a"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"modifyFieldsByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x6d63892c"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x9c7c722b"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"tableNameNew","type":"string"}],"name":"renameByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x023e38c4"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x91025cb1"},{"inputs":[{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"stateMutability":"payable","type":"constructor","signature":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x30945443"},{"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","signature":"0x31445f17"},{"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","signature":"0x13157a55"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tableName","type":"string"},{"internalType":"string","name":"raw","type":"string"}],"name":"updateByContract","outputs":[],"stateMutability":"nonpayable","type":"function","signature":"0x2a0aaaac"},{"stateMutability":"payable","type":"receive"}]'; // Bytecode 一定要加0x -const deployBytecode = '0x6080604052604051620016f3380380620016f383398101604081905262000026916200012f565b600080546001600160a01b031916611001908117909155604051636236be8d60e01b8152636236be8d90620000629085908590600401620001c7565b600060405180830381600087803b1580156200007d57600080fd5b505af115801562000092573d6000803e3d6000fd5b50505050505062000242565b600082601f830112620000b057600080fd5b81516001600160401b0380821115620000cd57620000cd6200022c565b604051601f8301601f19908116603f01168101908282118183101715620000f857620000f86200022c565b816040528381528660208588010111156200011257600080fd5b62000125846020830160208901620001f9565b9695505050505050565b600080604083850312156200014357600080fd5b82516001600160401b03808211156200015b57600080fd5b62000169868387016200009e565b935060208501519150808211156200018057600080fd5b506200018f858286016200009e565b9150509250929050565b60008151808452620001b3816020860160208601620001f9565b601f01601f19169290920160200192915050565b604081526000620001dc604083018562000199565b8281036020840152620001f0818562000199565b95945050505050565b60005b8381101562000216578181015183820152602001620001fc565b8381111562000226576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b6114a180620002526000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636c02d692116100b857806391025cb11161007c57806391025cb11461027157806399489c21146102845780639c7c722b14610297578063b24ab465146102aa578063cf22eb59146102bd578063f5ad5c85146102d057600080fd5b80636c02d69214610212578063746ecd69146102255780638b0a4ee1146102385780638d5df8021461024b5780638f44bd6a1461025e57600080fd5b80633a396228116100ff5780633a396228146101b3578063411304cb146101c65780635310b551146101d95780636236be8d146101ec5780636687a78d146101ff57600080fd5b8063023e38c41461013c57806313157a5514610151578063198e2b8a146101645780631ad5321a1461017757806331445f17146101a0575b600080fd5b61014f61014a366004611190565b6102e3565b005b61014f61015f3660046110ba565b61034b565b61014f610172366004611190565b6103b9565b61018a6101853660046110ba565b6103eb565b604051610197919061136e565b60405180910390f35b61014f6101ae3660046110ba565b61054e565b61014f6101c1366004611046565b610584565b61018a6101d4366004611046565b6105ef565b61014f6101e7366004611153565b61078d565b61014f6101fa366004611190565b6107f2565b61014f61020d366004611046565b610824565b61014f610220366004611046565b610858565b61014f610233366004611046565b61088c565b61014f610246366004611046565b6108bf565b61014f6102593660046110ba565b6108f3565b61014f61026c3660046110ba565b610929565b61014f61027f366004611153565b61095f565b61018a610292366004611046565b610c1b565b61014f6102a5366004611190565b610db9565b61014f6102b8366004611046565b610deb565b61018a6102cb3660046110ba565b610e1f565b61014f6102de366004611153565b610f6d565b60005460405163247f351560e01b81526001600160a01b039091169063247f3515906103159085908590600401611388565b600060405180830381600087803b15801561032f57600080fd5b505af1158015610343573d6000803e3d6000fd5b505050505050565b6000546040516313157a5560e01b81526001600160a01b03909116906313157a5590610381908790879087908790600401611319565b600060405180830381600087803b15801561039b57600080fd5b505af11580156103af573d6000803e3d6000fd5b5050505050505050565b60005460405163fc8b4adf60e01b81526001600160a01b039091169063fc8b4adf906103159085908590600401611388565b60008054604051632f4c2ce760e01b8152606092916001600160a01b031690632f4c2ce790610422908990899089906004016112d9565b60206040518083038186803b15801561043a57600080fd5b505afa15801561044e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047291906111f4565b90508061049a5760405162461bcd60e51b8152600401610491906113b6565b60405180910390fd5b600081ca60408051602081019091526000808252919250905b8281101561054257600084828880519060200181818486cf6020018060405190810160405281818585888acc95505050505050905082816040516020016104fb929190611239565b60405160208183030381529060405292508260405160200161051d9190611268565b604051602081830303815290604052925050808061053a9061144d565b9150506104b3565b50979650505050505050565b6000546040516331445f1760e01b81526001600160a01b03909116906331445f1790610381908790879087908790600401611319565b6000546040516307472c4560e31b81526001600160a01b0390911690633a396228906105b8908690869086906004016112d9565b600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b50505050505050565b60008054604051632f4c2ce760e01b8152606092916001600160a01b031690632f4c2ce790610626908890889088906004016112d9565b60206040518083038186803b15801561063e57600080fd5b505afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067691906111f4565b9050806106955760405162461bcd60e51b8152600401610491906113b6565b600081ca9050600082cb60408051602081019091526000808252919250905b838110156105425760005b83811015610757576000868383808284d0602001806040519081016040528181848688cd945050505050905083816040516020016106fe929190611239565b60408051601f19818403018152919052935061071b600186611406565b82146107445783604051602001610732919061128d565b60405160208183030381529060405293505b508061074f8161144d565b9150506106bf565b508160405160200161076991906112b3565b604051602081830303815290604052915080806107859061144d565b9150506106b4565b6000546040516318454c0760e11b81526001600160a01b039091169063308a980e906107bd90849060040161136e565b600060405180830381600087803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050505050565b600054604051636236be8d60e01b81526001600160a01b0390911690636236be8d906103159085908590600401611388565b600054604051630351a46360e61b81526001600160a01b039091169063d46918c0906105b8908690869086906004016112d9565b6000546040516336016b4960e11b81526001600160a01b0390911690636c02d692906105b8908690869086906004016112d9565b600054604051626c6cf160e31b81526001600160a01b03909116906303636788906105b8908690869086906004016112d9565b600054604051638b0a4ee160e01b81526001600160a01b0390911690638b0a4ee1906105b8908690869086906004016112d9565b600054604051631bf4faa160e01b81526001600160a01b0390911690631bf4faa190610381908790879087908790600401611319565b6000546040516312641bad60e31b81526001600160a01b0390911690639320dd6890610381908790879087908790600401611319565bc8336001600160a01b031681805190602001604051610a39907f5b7b226669656c64223a226964222c20227479706522203a2022696e74222c2081527f226c656e67746822203a2031312c2022504b22203a20312c20224e4e22203a2060208201527f312c2022555122203a20317d2c207b20226669656c64223a226163636f756e7460408201527f222c20227479706522203a20227661726368617222207d2c207b20226669656c60608201527f64223a22616765222c20227479706522203a2022696e7422207d5d00000000006080820152609b0190565b604051809103908181016040528181858588c0945050505050158015610a63573d6000803e3d6000d15b50336001600160a01b031681805190602001604051610b10907f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681527f6a566173795073463459486a323234222c20226964223a317d2c207b2261636360208201527f6f756e74223a227a55343279445733667a466a47576f736465566a566173795060408201527573463459486a323234222c202020226964223a327d5d60501b606082015260760190565b604051809103908181016040528181858588c3945050505050158015610b3a573d6000803e3d6000d15b508051604051677b226964223a317d60c01b81523391906020840190600801604051809103908181016040528181858588c4945050505050158015610b83573d6000803e3d6000d15b508051604051727b226163636f756e74223a2269643d3d32227d60681b8152339190602084019060130160405180910390818101604052604051610bd690687b226964223a20327d60b81b815260090190565b604051809103908181016040528181858589898cc59650505050505050158015610c04573d6000803e3d6000d15b50c9158015610c17573d6000803e3d6000d15b5050565b600080546040516355b54bf560e11b8152606092916001600160a01b03169063ab6a97ea90610c52908890889088906004016112d9565b60206040518083038186803b158015610c6a57600080fd5b505afa158015610c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca291906111f4565b905080610cc15760405162461bcd60e51b8152600401610491906113b6565b600081ca9050600082cb60408051602081019091526000808252919250905b838110156105425760005b83811015610d83576000868383808284d0602001806040519081016040528181848688cd94505050505090508381604051602001610d2a929190611239565b60408051601f198184030181529190529350610d47600186611406565b8214610d705783604051602001610d5e919061128d565b60405160208183030381529060405293505b5080610d7b8161144d565b915050610ceb565b5081604051602001610d9591906112b3565b60405160208183030381529060405291508080610db19061144d565b915050610ce0565b600054604051634e8f306d60e11b81526001600160a01b0390911690639d1e60da906103159085908590600401611388565b60005460405163b24ab46560e01b81526001600160a01b039091169063b24ab465906105b8908690869086906004016112d9565b600080546040516355b54bf560e11b8152606092916001600160a01b03169063ab6a97ea90610e56908990899089906004016112d9565b60206040518083038186803b158015610e6e57600080fd5b505afa158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea691906111f4565b905080610ec55760405162461bcd60e51b8152600401610491906113b6565b600081ca60408051602081019091526000808252919250905b8281101561054257600084828880519060200181818486cf6020018060405190810160405281818585888acc9550505050505090508281604051602001610f26929190611239565b604051602081830303815290604052925082604051602001610f489190611268565b6040516020818303038152906040529250508080610f659061144d565b915050610ede565b6000546040516357a78d9f60e11b81526001600160a01b039091169063af4f1b3e906107bd90849060040161136e565b80356001600160a01b0381168114610fb457600080fd5b919050565b600082601f830112610fca57600080fd5b813567ffffffffffffffff80821115610fe557610fe561147e565b604051601f8301601f19908116603f0116810190828211818310171561100d5761100d61147e565b8160405283815286602085880101111561102657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561105b57600080fd5b61106484610f9d565b9250602084013567ffffffffffffffff8082111561108157600080fd5b61108d87838801610fb9565b935060408601359150808211156110a357600080fd5b506110b086828701610fb9565b9150509250925092565b600080600080608085870312156110d057600080fd5b6110d985610f9d565b9350602085013567ffffffffffffffff808211156110f657600080fd5b61110288838901610fb9565b9450604087013591508082111561111857600080fd5b61112488838901610fb9565b9350606087013591508082111561113a57600080fd5b5061114787828801610fb9565b91505092959194509250565b60006020828403121561116557600080fd5b813567ffffffffffffffff81111561117c57600080fd5b61118884828501610fb9565b949350505050565b600080604083850312156111a357600080fd5b823567ffffffffffffffff808211156111bb57600080fd5b6111c786838701610fb9565b935060208501359150808211156111dd57600080fd5b506111ea85828601610fb9565b9150509250929050565b60006020828403121561120657600080fd5b5051919050565b6000815180845261122581602086016020860161141d565b601f01601f19169290920160200192915050565b6000835161124b81846020880161141d565b83519083019061125f81836020880161141d565b01949350505050565b6000825161127a81846020870161141d565b603b60f81b920191825250600101919050565b6000825161129f81846020870161141d565b61016160f51b920191825250600201919050565b600082516112c581846020870161141d565b611d8560f11b920191825250600201919050565b6001600160a01b03841681526060602082018190526000906112fd9083018561120d565b828103604084015261130f818561120d565b9695505050505050565b6001600160a01b038516815260806020820181905260009061133d9083018661120d565b828103604084015261134f818661120d565b90508281036060840152611363818561120d565b979650505050505050565b602081526000611381602083018461120d565b9392505050565b60408152600061139b604083018561120d565b82810360208401526113ad818561120d565b95945050505050565b60208082526030908201527f476574207461626c652064617461206661696c65642c6d61796265207573657260408201526f206e6f7420617574686f72697a65642160801b606082015260800190565b60008282101561141857611418611468565b500390565b60005b83811015611438578181015183820152602001611420565b83811115611447576000848401525b50505050565b600060001982141561146157611461611468565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea164736f6c6343000805000a'; +const deployBytecode = '0x608060405260405162001c8838038062001c8883398101604081905262000026916200012f565b600080546001600160a01b031916611001908117909155604051636236be8d60e01b8152636236be8d90620000629085908590600401620001c7565b600060405180830381600087803b1580156200007d57600080fd5b505af115801562000092573d6000803e3d6000fd5b50505050505062000242565b600082601f830112620000b057600080fd5b81516001600160401b0380821115620000cd57620000cd6200022c565b604051601f8301601f19908116603f01168101908282118183101715620000f857620000f86200022c565b816040528381528660208588010111156200011257600080fd5b62000125846020830160208901620001f9565b9695505050505050565b600080604083850312156200014357600080fd5b82516001600160401b03808211156200015b57600080fd5b62000169868387016200009e565b935060208501519150808211156200018057600080fd5b506200018f858286016200009e565b9150509250929050565b60008151808452620001b3816020860160208601620001f9565b601f01601f19169290920160200192915050565b604081526000620001dc604083018562000199565b8281036020840152620001f0818562000199565b95945050505050565b60005b8381101562000216578181015183820152602001620001fc565b8381111562000226576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b611a3680620002526000396000f3fe6080604052600436106101da5760003560e01c8063746ecd69116101015780639c7c722b1161009a578063d618613a1161006c578063d618613a14610579578063de5c386514610599578063e6920507146105b9578063f5ad5c85146105d9578063ff1cc4c6146105f957005b80639c7c722b146104f9578063b24ab46514610519578063c52a873414610539578063cf22eb591461055957005b80638d5df802116100d35780638d5df802146104795780638f44bd6a1461049957806391025cb1146104b957806399489c21146104d957005b8063746ecd69146103f957806376d878ee146104195780638b0a4ee1146104395780638d0f1a801461045957005b80633a396228116101735780636236be8d116101455780636236be8d146103795780636687a78d146103995780636c02d692146103b95780636d63892c146103d957005b80633a396228146102f9578063411304cb146103195780635310b551146103395780636219f6971461035957005b80631ad5321a116101ac5780631ad5321a146102635780632a0aaaac1461029957806330945443146102b957806331445f17146102d957005b8063023e38c4146101e357806304e850a71461020357806313157a5514610223578063198e2b8a1461024357005b366101e157005b005b3480156101ef57600080fd5b506101e16101fe366004611725565b610619565b34801561020f57600080fd5b506101e161021e366004611725565b610681565b34801561022f57600080fd5b506101e161023e36600461164f565b6106b3565b34801561024f57600080fd5b506101e161025e366004611725565b610721565b34801561026f57600080fd5b5061028361027e36600461164f565b610753565b6040516102909190611903565b60405180910390f35b3480156102a557600080fd5b506101e16102b43660046115db565b6108b6565b3480156102c557600080fd5b506101e16102d43660046115db565b610921565b3480156102e557600080fd5b506101e16102f436600461164f565b610955565b34801561030557600080fd5b506101e16103143660046115db565b61098b565b34801561032557600080fd5b506102836103343660046115db565b6109bf565b34801561034557600080fd5b506101e16103543660046116e8565b610b5d565b34801561036557600080fd5b506101e1610374366004611725565b610bc2565b34801561038557600080fd5b506101e1610394366004611725565b610bf4565b3480156103a557600080fd5b506101e16103b43660046115db565b610c26565b3480156103c557600080fd5b506101e16103d43660046115db565b610c5a565b3480156103e557600080fd5b506101e16103f4366004611725565b610c8e565b34801561040557600080fd5b506101e16104143660046115db565b610cc0565b34801561042557600080fd5b506101e1610434366004611725565b610cf3565b34801561044557600080fd5b506101e16104543660046115db565b610d25565b34801561046557600080fd5b506101e1610474366004611725565b610d59565b34801561048557600080fd5b506101e161049436600461164f565b610d8b565b3480156104a557600080fd5b506101e16104b436600461164f565b610dc1565b3480156104c557600080fd5b506101e16104d43660046116e8565b610df7565b3480156104e557600080fd5b506102836104f43660046115db565b6110b3565b34801561050557600080fd5b506101e1610514366004611725565b611251565b34801561052557600080fd5b506101e16105343660046115db565b611283565b34801561054557600080fd5b506101e1610554366004611725565b6112b7565b34801561056557600080fd5b5061028361057436600461164f565b6112e9565b34801561058557600080fd5b506101e1610594366004611725565b611437565b3480156105a557600080fd5b506101e16105b4366004611725565b611469565b3480156105c557600080fd5b506101e16105d4366004611725565b61149b565b3480156105e557600080fd5b506101e16105f43660046116e8565b6114cd565b34801561060557600080fd5b506101e1610614366004611725565b6114fd565b60005460405163247f351560e01b81526001600160a01b039091169063247f35159061064b908590859060040161191d565b600060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050505050565b6000546040516304e850a760e01b81526001600160a01b03909116906304e850a79061064b908590859060040161191d565b6000546040516313157a5560e01b81526001600160a01b03909116906313157a55906106e99087908790879087906004016118ae565b600060405180830381600087803b15801561070357600080fd5b505af1158015610717573d6000803e3d6000fd5b5050505050505050565b60005460405163fc8b4adf60e01b81526001600160a01b039091169063fc8b4adf9061064b908590859060040161191d565b60008054604051632f4c2ce760e01b8152606092916001600160a01b031690632f4c2ce79061078a9089908990899060040161186e565b60206040518083038186803b1580156107a257600080fd5b505afa1580156107b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107da9190611789565b9050806108025760405162461bcd60e51b81526004016107f99061194b565b60405180910390fd5b600081ca60408051602081019091526000808252919250905b828110156108aa57600084828880519060200181818486cf6020018060405190810160405281818585888acc95505050505050905082816040516020016108639291906117ce565b60405160208183030381529060405292508260405160200161088591906117fd565b60405160208183030381529060405292505080806108a2906119e2565b91505061081b565b50979650505050505050565b600054604051630a82aaab60e21b81526001600160a01b0390911690632a0aaaac906108ea9086908690869060040161186e565b600060405180830381600087803b15801561090457600080fd5b505af1158015610918573d6000803e3d6000fd5b50505050505050565b600054604051633094544360e01b81526001600160a01b03909116906330945443906108ea9086908690869060040161186e565b6000546040516331445f1760e01b81526001600160a01b03909116906331445f17906106e99087908790879087906004016118ae565b6000546040516307472c4560e31b81526001600160a01b0390911690633a396228906108ea9086908690869060040161186e565b60008054604051632f4c2ce760e01b8152606092916001600160a01b031690632f4c2ce7906109f69088908890889060040161186e565b60206040518083038186803b158015610a0e57600080fd5b505afa158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a469190611789565b905080610a655760405162461bcd60e51b81526004016107f99061194b565b600081ca9050600082cb60408051602081019091526000808252919250905b838110156108aa5760005b83811015610b27576000868383808284d0602001806040519081016040528181848688cd94505050505090508381604051602001610ace9291906117ce565b60408051601f198184030181529190529350610aeb60018661199b565b8214610b145783604051602001610b029190611822565b60405160208183030381529060405293505b5080610b1f816119e2565b915050610a8f565b5081604051602001610b399190611848565b60405160208183030381529060405291508080610b55906119e2565b915050610a84565b6000546040516318454c0760e11b81526001600160a01b039091169063308a980e90610b8d908490600401611903565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b5050505050565b600054604051636219f69760e01b81526001600160a01b0390911690636219f6979061064b908590859060040161191d565b600054604051636236be8d60e01b81526001600160a01b0390911690636236be8d9061064b908590859060040161191d565b600054604051630351a46360e61b81526001600160a01b039091169063d46918c0906108ea9086908690869060040161186e565b6000546040516336016b4960e11b81526001600160a01b0390911690636c02d692906108ea9086908690869060040161186e565b600054604051631b58e24b60e21b81526001600160a01b0390911690636d63892c9061064b908590859060040161191d565b600054604051626c6cf160e31b81526001600160a01b03909116906303636788906108ea9086908690869060040161186e565b600054604051633b6c3c7760e11b81526001600160a01b03909116906376d878ee9061064b908590859060040161191d565b600054604051638b0a4ee160e01b81526001600160a01b0390911690638b0a4ee1906108ea9086908690869060040161186e565b60005460405163011a1e3560e71b81526001600160a01b0390911690638d0f1a809061064b908590859060040161191d565b600054604051631bf4faa160e01b81526001600160a01b0390911690631bf4faa1906106e99087908790879087906004016118ae565b6000546040516312641bad60e31b81526001600160a01b0390911690639320dd68906106e99087908790879087906004016118ae565bc8336001600160a01b031681805190602001604051610ed1907f5b7b226669656c64223a226964222c20227479706522203a2022696e74222c2081527f226c656e67746822203a2031312c2022504b22203a20312c20224e4e22203a2060208201527f312c2022555122203a20317d2c207b20226669656c64223a226163636f756e7460408201527f222c20227479706522203a20227661726368617222207d2c207b20226669656c60608201527f64223a22616765222c20227479706522203a2022696e7422207d5d00000000006080820152609b0190565b604051809103908181016040528181858588c0945050505050158015610efb573d6000803e3d6000d15b50336001600160a01b031681805190602001604051610fa8907f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681527f6a566173795073463459486a323234222c20226964223a317d2c207b2261636360208201527f6f756e74223a227a55343279445733667a466a47576f736465566a566173795060408201527573463459486a323234222c202020226964223a327d5d60501b606082015260760190565b604051809103908181016040528181858588c3945050505050158015610fd2573d6000803e3d6000d15b508051604051677b226964223a317d60c01b81523391906020840190600801604051809103908181016040528181858588c494505050505015801561101b573d6000803e3d6000d15b508051604051727b226163636f756e74223a2269643d3d32227d60681b815233919060208401906013016040518091039081810160405260405161106e90687b226964223a20327d60b81b815260090190565b604051809103908181016040528181858589898cc5965050505050505015801561109c573d6000803e3d6000d15b50c91580156110af573d6000803e3d6000d15b5050565b600080546040516355b54bf560e11b8152606092916001600160a01b03169063ab6a97ea906110ea9088908890889060040161186e565b60206040518083038186803b15801561110257600080fd5b505afa158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190611789565b9050806111595760405162461bcd60e51b81526004016107f99061194b565b600081ca9050600082cb60408051602081019091526000808252919250905b838110156108aa5760005b8381101561121b576000868383808284d0602001806040519081016040528181848688cd945050505050905083816040516020016111c29291906117ce565b60408051601f1981840301815291905293506111df60018661199b565b821461120857836040516020016111f69190611822565b60405160208183030381529060405293505b5080611213816119e2565b915050611183565b508160405160200161122d9190611848565b60405160208183030381529060405291508080611249906119e2565b915050611178565b600054604051634e8f306d60e11b81526001600160a01b0390911690639d1e60da9061064b908590859060040161191d565b60005460405163b24ab46560e01b81526001600160a01b039091169063b24ab465906108ea9086908690869060040161186e565b60005460405163314aa1cd60e21b81526001600160a01b039091169063c52a87349061064b908590859060040161191d565b600080546040516355b54bf560e11b8152606092916001600160a01b03169063ab6a97ea906113209089908990899060040161186e565b60206040518083038186803b15801561133857600080fd5b505afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113709190611789565b90508061138f5760405162461bcd60e51b81526004016107f99061194b565b600081ca60408051602081019091526000808252919250905b828110156108aa57600084828880519060200181818486cf6020018060405190810160405281818585888acc95505050505050905082816040516020016113f09291906117ce565b60405160208183030381529060405292508260405160200161141291906117fd565b604051602081830303815290604052925050808061142f906119e2565b9150506113a8565b600054604051636b0c309d60e11b81526001600160a01b039091169063d618613a9061064b908590859060040161191d565b60005460405163de5c386560e01b81526001600160a01b039091169063de5c38659061064b908590859060040161191d565b60005460405163e692050760e01b81526001600160a01b039091169063e69205079061064b908590859060040161191d565b6000546040516357a78d9f60e11b81526001600160a01b039091169063af4f1b3e90610b8d908490600401611903565b600054604051600162719d9d60e11b031981526001600160a01b039091169063ff1cc4c69061064b908590859060040161191d565b80356001600160a01b038116811461154957600080fd5b919050565b600082601f83011261155f57600080fd5b813567ffffffffffffffff8082111561157a5761157a611a13565b604051601f8301601f19908116603f011681019082821181831017156115a2576115a2611a13565b816040528381528660208588010111156115bb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156115f057600080fd5b6115f984611532565b9250602084013567ffffffffffffffff8082111561161657600080fd5b6116228783880161154e565b9350604086013591508082111561163857600080fd5b506116458682870161154e565b9150509250925092565b6000806000806080858703121561166557600080fd5b61166e85611532565b9350602085013567ffffffffffffffff8082111561168b57600080fd5b6116978883890161154e565b945060408701359150808211156116ad57600080fd5b6116b98883890161154e565b935060608701359150808211156116cf57600080fd5b506116dc8782880161154e565b91505092959194509250565b6000602082840312156116fa57600080fd5b813567ffffffffffffffff81111561171157600080fd5b61171d8482850161154e565b949350505050565b6000806040838503121561173857600080fd5b823567ffffffffffffffff8082111561175057600080fd5b61175c8683870161154e565b9350602085013591508082111561177257600080fd5b5061177f8582860161154e565b9150509250929050565b60006020828403121561179b57600080fd5b5051919050565b600081518084526117ba8160208601602086016119b2565b601f01601f19169290920160200192915050565b600083516117e08184602088016119b2565b8351908301906117f48183602088016119b2565b01949350505050565b6000825161180f8184602087016119b2565b603b60f81b920191825250600101919050565b600082516118348184602087016119b2565b61016160f51b920191825250600201919050565b6000825161185a8184602087016119b2565b611d8560f11b920191825250600201919050565b6001600160a01b0384168152606060208201819052600090611892908301856117a2565b82810360408401526118a481856117a2565b9695505050505050565b6001600160a01b03851681526080602082018190526000906118d2908301866117a2565b82810360408401526118e481866117a2565b905082810360608401526118f881856117a2565b979650505050505050565b60208152600061191660208301846117a2565b9392505050565b60408152600061193060408301856117a2565b828103602084015261194281856117a2565b95945050505050565b60208082526030908201527f476574207461626c652064617461206661696c65642c6d61796265207573657260408201526f206e6f7420617574686f72697a65642160801b606082015260800190565b6000828210156119ad576119ad6119fd565b500390565b60005b838110156119cd5781810151838201526020016119b5565b838111156119dc576000848401525b50505050565b60006000198214156119f6576119f66119fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea164736f6c6343000805000a'; const contractAddr = "zJ6s4T2zLtFBTjZqnLZfN1cuoCWPqfdEsa"; //solidity code: @@ -55,21 +61,22 @@ var tagStep = { 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 + table_insert_hash: 14, add_fields: 15, delete_fields: 16, modify_fields: 17, + create_index: 18, delete_index:19 } main(); async function main() { - // var wsAddress = 'ws://localhost:5510'; - var wsAddress = 'ws://10.100.0.78:25510'; + var wsAddress = 'ws://localhost:6006'; +// var wsAddress = 'ws://10.100.0.78:6006'; let res = await c.connect(wsAddress); console.log(" connect successfully.") c.setRestrict(true); let isContract = true; - let nStep = tagStep.table_insert; + let nStep = tagStep.create_index; if (nStep != tagStep.deployContract) { myContract = c.contract(JSON.parse(abi), contractAddr); @@ -86,6 +93,11 @@ async function main() { 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; + case tagStep.add_fields: add_fields_by_contract(); break; + case tagStep.delete_fields: delete_fields_by_contract(); break; + case tagStep.modify_fields: modify_fields_by_contract(); break; + case tagStep.create_index: create_index_by_contract(); break; + case tagStep.delete_index: delete_index_by_contract(); break; default: break; } }else{ @@ -99,6 +111,11 @@ async function main() { case tagStep.table_delete: table_delete(); break; case tagStep.table_update: table_update(); break; case tagStep.table_get: table_get(); break; + case tagStep.add_fields: add_fields(); break; + case tagStep.delete_fields: delete_fields(); break; + case tagStep.modify_fields: modify_fields(); break; + case tagStep.create_index: create_index(); break; + case tagStep.delete_index: delete_index(); break; default: break; } } @@ -235,7 +252,7 @@ var table_delete_by_contract = async function () { var table_update_by_contract = async function () { c.as(user) try { - myContract.methods.updateByContract(contractAddr, sTableName, rawUpdate, rawGet).submit({ + myContract.methods.updateByContract(contractAddr, sTableName, rawUpdate).submit({ Gas: 500000, expect: "db_success" }, (err, res) => { @@ -272,6 +289,78 @@ var table_get_by_contract = async function () { } } +var add_fields_by_contract = async function () { + c.as(user) + try { + myContract.methods.addFieldsByContract(sTableName, rawAddFeild).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var delete_fields_by_contract = async function () { + c.as(user) + try { + myContract.methods.deleteFieldsByContract(sTableName, rawDeleteFeild).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var modify_fields_by_contract = async function () { + c.as(user) + try { + myContract.methods.modifyFieldsByContract(sTableName, rawModifyFeild).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var create_index_by_contract = async function () { + c.as(user) + try { + myContract.methods.createIndexByContract(sTableName, rawCreateIndex).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var delete_index_by_contract = async function () { + c.as(user) + try { + myContract.methods.deleteIndexByContract(sTableName, rawDeleteIndex).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + + + var table_create = async function () { c.as(user) //发交易调用合约 @@ -378,7 +467,7 @@ var table_delete = async function () { var table_update = async function () { c.as(user) try { - myContract.methods.update(user.address, sTableName, rawUpdate, rawGet).submit({ + myContract.methods.update(user.address, sTableName, rawUpdate).submit({ Gas: 500000, expect: "db_success" }, (err, res) => { @@ -415,5 +504,76 @@ var table_get = async function () { } } + +var add_fields = async function () { + c.as(user) + try { + myContract.methods.addFields(sTableName, rawAddFeild).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var delete_fields = async function () { + c.as(user) + try { + myContract.methods.deleteFields(sTableName, rawDeleteFeild).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var modify_fields = async function () { + c.as(user) + try { + myContract.methods.modifyFields(sTableName, rawModifyFeild).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var create_index = async function () { + c.as(user) + try { + myContract.methods.createIndex(sTableName, rawCreateIndex).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + +var delete_index = async function () { + c.as(user) + try { + myContract.methods.deleteIndex(sTableName, rawDeleteIndex).submit({ + Gas: 500000, + expect: "validate_success" + }, (err, res) => { + err ? console.log("insert_hash res:", err) : console.log("insert_hash res:", res); + }); + } catch (error) { + console.log(error); + } +} + diff --git a/test/testSign.js b/test/testSign.js index 8e11933..f1591d1 100644 --- a/test/testSign.js +++ b/test/testSign.js @@ -5,46 +5,51 @@ const ChainsqlAPI = require('../src/index'); const c = new ChainsqlAPI(); var user = { - secret: "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - address: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - publickKey: "aBQG8RQAzjs1eTKFEAQXr2gS4utcDiEC9wmi7pfUPTi27VCahwgw" + secret: "pwWxLSLpWDHBa66Lweexg82vQNKWbTpMjgqgca2tsqLvJTLKCBz", + address: "zPoCNMA7jqWcuaVXJcXX9zsrCP5TAd3V48", + publickKey: "pYvDQNUrSAAEbTrR4aVp1b7k1e8oa9omuDYJN1wwsyobZQhSTPjzQ3k7szPjkfzj6hx3LktycvJTPCbwQDTsJoFAQkHwqiBH" }; +var root = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} +var issuer = { + secret: "xxXvas5HTwVwjpmGNLQDdRyYe2H6t", + address: "z4ypskpHPpMDtHsZvFHg8eDEdTjQrYYYV6" +} main(); async function main(){ // await c.connect('ws://139.198.11.189:6006'); - await c.connect('ws://127.0.0.1:6007'); + await c.connect('ws://localhost:5510'); + c.as(root) console.log('连接成功') - let info = await c.api.getAccountInfo("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); + let info = await c.api.getAccountInfo(root.address); console.log(info); c.getLedgerVersion(function(err,data){ var payment = { - "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Account": root.address, "Amount":"1000000000", - "Destination": "rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q", + "Destination": issuer.address, "TransactionType": "Payment", "Sequence": info.sequence, "LastLedgerSequence":data + 5, "Fee":"50" } - let signedRet = c.sign(payment,user.secret); - console.log(signedRet); + + var opt = { + maxLedgerVersion:data + 1, + minLedgerVersion:data + } + + let signedRet = c.sign(payment,root.secret); c.api.submit(signedRet.signedTransaction).then(function(data){ console.log(data); - }); - - // var opt = { - // maxLedgerVersion:data + 1, - // minLedgerVersion:data - // } - // c.api.getTransaction(signedRet.id,opt).then(function(data){ - // console.log(data); - // }).catch(function(err){ - // console.log(err); - // }) - + }); + + }) // setTimeout(function(){ // c.api.getTransaction(signedRet.id).then(function(data){ // console.log(data); @@ -52,7 +57,7 @@ async function main(){ // console.log(err); // }) // },5000); - }); + // }); var signed = "1200002400000006201B0000001061400000003B9ACA0068400000000000003273210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02074473045022100E684319763A47F8E4AA590ECBB4F16D4392E4DAB312A19ACC7E69F273DCD5FE702204DBBF8CB14FA8B723E35FB2659936DF6635BA4C80616B2563885AF5D91610B848114B5F762798A53D543A014CAF8B297CFF8F2F937E8831493CAB3CA5AA1B46E5A2A55BB8AA934A720ECD7A5"; From 8dac34eaddf58159ac8ce1d743016f7a318b684c Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Fri, 25 Mar 2022 15:48:59 +0800 Subject: [PATCH 097/101] Add method to get contract call transaction --- src/index.js | 42 +++++++++++++++++++++++++++++++++++++ test/testRipple.js | 52 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 599b055..4718295 100644 --- a/src/index.js +++ b/src/index.js @@ -577,6 +577,48 @@ ChainsqlAPI.prototype.getAccountTransactions = function (address, opts, cb) { } }; +ChainsqlAPI.prototype.getContractTransactions = function (address, opts, cb) { + let callback, newOpt, singleArg; + let isCallback = false; + switch (arguments.length) { + case 1: + newOpt = {}; + break; + case 2: + singleArg = arguments[1]; + if ((typeof singleArg) === "function") { + callback = singleArg; + isCallback = true; + } else if ((typeof singleArg) === "object") { + newOpt = singleArg; + } else { + throw chainsqlError("wrong params, please check"); + } + break; + case 3: + newOpt = opts; + if ((typeof cb) === "function") { + callback = cb; + isCallback = true; + } else { + throw chainsqlError("wrong params, please check"); + } + break; + default: + throw chainsqlError("wrong params, please check"); + } + + if (isCallback) { + this.api.getContractTransactions(address, newOpt).then(function (data) { + callback(null, data); + }).catch(function (err) { + callback(err, null); + }); + } else { + return this.api.getContractTransactions(address, newOpt); + } +}; + ChainsqlAPI.prototype.getTransaction = function (hash,meta,meta_chain,cb) { if ((typeof cb) != 'function') { return this.api.getTransaction(hash,meta,meta_chain); diff --git a/test/testRipple.js b/test/testRipple.js index 771570b..f17cf87 100644 --- a/test/testRipple.js +++ b/test/testRipple.js @@ -33,6 +33,7 @@ var user3 = { var tagStep = { active: 1, gateWay: 2, escrow: 3, balances: 4, getLedger: 5, getTxs: 6,authorize:7, + getContractTxs:8,getContractTxsAsync:9, } var sCurrency = "aaa" var whiteLists = [ @@ -50,7 +51,7 @@ async function main() { c.as(root); c.setRestrict(true); /**************************************/ - let nStep = tagStep.authorize; + let nStep = tagStep.getContractTxs; switch (nStep) { case tagStep.active: testActive(); break;// 激活若干账户 case tagStep.gateWay: testGateWay(); break;//部署网管,信任,发行币转账 @@ -59,6 +60,8 @@ async function main() { case tagStep.getTxs: testTransactions(); break; case tagStep.getLedger: testGetLedger(); break; case tagStep.authorize: testAuthorize();break; + case tagStep.getContractTxs: getContractTransactions();break; + case tagStep.getContractTxsAsync: getContractTransactionsAsync();break; default: break; } /**************************************/ @@ -199,7 +202,7 @@ var testBalances = async function () { var testTransactions = async function () { let res; // - let bAll_one = true; + let bAll_one = false; let bMore = true; // if (bAll_one) { @@ -216,7 +219,7 @@ var testTransactions = async function () { if (bMore) { let nLimit = 10; var options = { - limit: nLimit + limit: nLimit, }; while (true) { res = await c.api.getTransactions(root.address, options); @@ -263,4 +266,47 @@ var testAuthorize = async function(){ console.error("accountAuthorize ", error); } +} + +var getContractTransactions = async function(){ + try { + var options = { + limit: 3, + ledgerIndexMin:1, + ledgerIndexMax:100, + marker:{ + ledger:53, + seq:5300002 + } + }; + var obj = await c.getContractTransactions("zwCkG85oeRsmMpQs2auAV8Tc6kQF5aWsr6", options); + console.log("getContractTransactions ", obj); + } catch (error) { + console.error("accountAuthorize ", error); + } + +} + +var getContractTransactionsAsync = async function(){ + try { + var options = { + limit: 3, + ledgerIndexMin:1, + ledgerIndexMax:100, + marker:{ + ledger:53, + seq:5300002 + } + }; + var obj = await c.getContractTransactions("zwCkG85oeRsmMpQs2auAV8Tc6kQF5aWsr6", options, function callback(err,data){ + if(err) + console.err("getContractTransactionsAsync", err) + else + console.info("getContractTransactionsAsync", data) + }); + //console.log("getContractTransactions ", obj); + } catch (error) { + console.error("accountAuthorize ", error); + } + } \ No newline at end of file From aab8a02c03065167178d2e47c617b8b50e1edc66 Mon Sep 17 00:00:00 2001 From: dbliu Date: Fri, 8 Apr 2022 10:13:12 +0800 Subject: [PATCH 098/101] implements deleteSchema --- src/index.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/index.js b/src/index.js index 4718295..62c010b 100644 --- a/src/index.js +++ b/src/index.js @@ -726,6 +726,7 @@ ChainsqlAPI.prototype.beginTran = function () { this.transaction = true; return; } + throw chainsqlError("connect is undefine or connect.address is undefine") } function handleCommit(ChainSQL, object, resolve, reject) { @@ -1366,6 +1367,27 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ return this; }; +ChainsqlAPI.prototype.deleteSchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) + && (schemaInfo.SchemaID !== undefined) + + if(!bValid){ + throw new Error("Invalid deleteSchema parameter"); + } + + var schemaDeleteTxJson = { + Account: this.connect.address, + SchemaID: schemaInfo.SchemaID, + TransactionType: 'SchemaDelete' + }; + + // 修改子链 + this.schemaModifyTx = true; + this.payment = schemaDeleteTxJson; + return this; +}; + function callback(data, callback) { } From 2e2558286e3c105c5548ee9f7f74b07b610a8d0e Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Thu, 14 Apr 2022 18:55:52 +0800 Subject: [PATCH 099/101] Modify the encryptText method --- src/lib/crypto.js | 118 +++++++++++++++++++++++++++++------ src/proto/MultiEncrypt.js | 69 +++++--------------- src/proto/MultiEncrypt.proto | 8 +-- 3 files changed, 116 insertions(+), 79 deletions(-) diff --git a/src/lib/crypto.js b/src/lib/crypto.js index b1d960b..4e9c34a 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -378,31 +378,23 @@ var encryptText = function(plainText,listPublic){ var listPubHash = []; var listPassCipher = []; - // random keypair - const seed = keypairs.generateSeed(); - const ephKeyPair = keypairs.deriveKeypair(seed); - var ephPrivKey = Secp256k1.keyFromPrivate(ephKeyPair.privateKey, 'hex'); - var ephPublicKey = ephKeyPair.publicKey; for(var i=0; i|null} [hashTokenPair] MultiEncrypt hashTokenPair * @property {Uint8Array} cipher MultiEncrypt cipher */ @@ -36,14 +35,6 @@ $root.MultiEncrypt = (function() { this[keys[i]] = properties[keys[i]]; } - /** - * MultiEncrypt publicOther. - * @member {Uint8Array} publicOther - * @memberof MultiEncrypt - * @instance - */ - MultiEncrypt.prototype.publicOther = $util.newBuffer([]); - /** * MultiEncrypt hashTokenPair. * @member {Array.} hashTokenPair @@ -84,11 +75,10 @@ $root.MultiEncrypt = (function() { 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); + $root.MultiEncrypt.HashToken.encode(message.hashTokenPair[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.cipher); return writer; }; @@ -124,14 +114,11 @@ $root.MultiEncrypt = (function() { 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: + case 2: message.cipher = reader.bytes(); break; default: @@ -139,8 +126,6 @@ $root.MultiEncrypt = (function() { 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; @@ -173,8 +158,6 @@ $root.MultiEncrypt = (function() { 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"; @@ -201,11 +184,6 @@ $root.MultiEncrypt = (function() { 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"); @@ -239,14 +217,7 @@ $root.MultiEncrypt = (function() { 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.defaults) if (options.bytes === String) object.cipher = ""; else { @@ -254,9 +225,6 @@ $root.MultiEncrypt = (function() { 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) @@ -285,7 +253,7 @@ $root.MultiEncrypt = (function() { * @memberof MultiEncrypt * @interface IHashToken * @property {Uint8Array} publicHash HashToken publicHash - * @property {Uint8Array} token HashToken token + * @property {string} token HashToken token */ /** @@ -313,11 +281,11 @@ $root.MultiEncrypt = (function() { /** * HashToken token. - * @member {Uint8Array} token + * @member {string} token * @memberof MultiEncrypt.HashToken * @instance */ - HashToken.prototype.token = $util.newBuffer([]); + HashToken.prototype.token = ""; /** * Creates a new HashToken instance using the specified properties. @@ -344,7 +312,7 @@ $root.MultiEncrypt = (function() { 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); + writer.uint32(/* id 2, wireType 2 =*/18).string(message.token); return writer; }; @@ -383,7 +351,7 @@ $root.MultiEncrypt = (function() { message.publicHash = reader.bytes(); break; case 2: - message.token = reader.bytes(); + message.token = reader.string(); break; default: reader.skipType(tag & 7); @@ -426,8 +394,8 @@ $root.MultiEncrypt = (function() { 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"; + if (!$util.isString(message.token)) + return "token: string expected"; return null; }; @@ -449,10 +417,7 @@ $root.MultiEncrypt = (function() { 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; + message.token = String(object.token); return message; }; @@ -477,18 +442,12 @@ $root.MultiEncrypt = (function() { 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); - } + 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; + object.token = message.token; return object; }; diff --git a/src/proto/MultiEncrypt.proto b/src/proto/MultiEncrypt.proto index ddaf0ec..855d27d 100644 --- a/src/proto/MultiEncrypt.proto +++ b/src/proto/MultiEncrypt.proto @@ -3,14 +3,12 @@ message MultiEncrypt { message HashToken{ required bytes public_hash = 1; - required bytes token = 2; + required string token = 2; } - //DH 随机产生的公钥 - required bytes public_other = 1; //公钥哈希与Token数组 - repeated HashToken hash_token_pair = 2; + repeated HashToken hash_token_pair = 1; //字符串的密文 - required bytes cipher = 3; + required bytes cipher = 2; } \ No newline at end of file From f3887699ef87e38b09a406e0ca84c6c1a005f10b Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Wed, 12 Oct 2022 17:59:06 +0800 Subject: [PATCH 100/101] New function: the transaction needs to be signed by the node and sent to the chain --- src/lib/util.js | 14 ++++++++++++-- src/submit.js | 6 +++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/lib/util.js b/src/lib/util.js index 7179f15..b9effa8 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -261,13 +261,14 @@ function checkUserMatchPublicKey(user,publicKey){ function parseCb(cb) { var isFunction = false; - let expectOpt = { expect: "send_success" }; + let expectOpt = { expect: "send_success", isNeedPeerSign:false}; let cbCheckRet = checkCbOpt(cb); if (cbCheckRet.status === "success") { if (cbCheckRet.type === "function") { isFunction = cbCheckRet.isFunction; } else { expectOpt.expect = cbCheckRet.expect; + expectOpt.isNeedPeerSign = cbCheckRet.isNeedPeerSign; } } else { throw new Error(cbCheckRet.errMsg); @@ -309,10 +310,19 @@ function checkCbOpt(cbOpt) { if(checkExpect(cbOpt)) { retObj.status = "success"; retObj.expect = cbOpt.expect; + retObj.isNeedPeerSign = false; } else { retObj.errMsg = "Unknown 'expect' value, please check!"; } - } + } else if(Object.getOwnPropertyNames(cbOpt).length === 2 && cbOpt.hasOwnProperty("expect") && cbOpt.hasOwnProperty("isNeedPeerSign")){ + if(checkExpect(cbOpt)) { + retObj.status = "success"; + retObj.expect = cbOpt.expect; + retObj.isNeedPeerSign = cbOpt.isNeedPeerSign; + } else { + retObj.errMsg = "Unknown 'expect' value, please check!"; + } + } else { retObj.errMsg = "submit option is wrong, please check!"; } diff --git a/src/submit.js b/src/submit.js index 2436c13..0633ef4 100644 --- a/src/submit.js +++ b/src/submit.js @@ -109,7 +109,7 @@ Submit.prototype.handleSignedTx = function (ChainSQL, signed, expectOpt, resolve // var isFunction = false; // let expectOpt = {expect:"send_success"}; - if (expectOpt.expect !== "send_success") { + if (expectOpt.expect !== "send_success" && !expectOpt.isNeedPeerSign) { // subscribe event ChainSQL.event.subscribeTx(signed.id, function (err, data) { if (err) { @@ -148,7 +148,7 @@ Submit.prototype.handleSignedTx = function (ChainSQL, signed, expectOpt, resolve } // submit transaction - ChainSQL.api.submit(signed.signedTransaction).then(function (result) { + ChainSQL.api.submit(signed.signedTransaction, expectOpt.isNeedPeerSign).then(function (result) { //console.log('submit ', JSON.stringify(result)); if (result.resultCode !== 'tesSUCCESS') { if(expectOpt.expect !== "send_success") { @@ -161,7 +161,7 @@ Submit.prototype.handleSignedTx = function (ChainSQL, signed, expectOpt, resolve if (expectOpt.expect === 'send_success') { resolve({ status: 'send_success', - tx_hash: signed.id + tx_hash: result.txJson.hash }); } } From 8d50a92004a8a61de595b122fa23063a0e799841 Mon Sep 17 00:00:00 2001 From: xiuxiufxx Date: Mon, 31 Oct 2022 18:01:27 +0800 Subject: [PATCH 101/101] Modify multi-party signature --- src/submit.js | 7 +++---- test/test-multi-sign.js | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/submit.js b/src/submit.js index 0633ef4..37d84d2 100644 --- a/src/submit.js +++ b/src/submit.js @@ -33,9 +33,6 @@ Submit.prototype.submit = function (expectOpt) { }; Submit.prototype.submitSigned = function (signedRet,expectOpt) { - if(!expectOpt){ - expectOpt = { expect:"send_success"} - } let self = this; return new Promise(function (resolve, reject) { try { @@ -108,7 +105,9 @@ Submit.prototype.signTx = function () { Submit.prototype.handleSignedTx = function (ChainSQL, signed, expectOpt, resolve, reject) { // var isFunction = false; // let expectOpt = {expect:"send_success"}; - + if(!expectOpt){ + expectOpt = { expect:"send_success"} + } if (expectOpt.expect !== "send_success" && !expectOpt.isNeedPeerSign) { // subscribe event ChainSQL.event.subscribeTx(signed.id, function (err, data) { diff --git a/test/test-multi-sign.js b/test/test-multi-sign.js index 7504190..64d161f 100644 --- a/test/test-multi-sign.js +++ b/test/test-multi-sign.js @@ -31,8 +31,8 @@ main(); async function main() { await c.connect('ws://127.0.0.1:6006'); console.log("connect successfully."); - - var signRet,res; + + var signRet,res; // 1. 设置多方签名列表 var signerListSet = getSignerListSetJson(root.address,[delegate1.address,delegate2.address,delegate3.address]) await c.api.prepareTx(signerListSet); @@ -49,8 +49,21 @@ async function main() { console.log(signRet); signRet = c.sign(signRet.tx_json,delegate3.secret,{signAs:delegate3.address}); console.log(signRet); - res = await c.submitSigned(signRet,{expect:'validate_success'}) - console.log("submit signerListSet result:"+ JSON.stringify(res)); + try { + res = await c.submitSigned(signRet,{expect:'validate_success'}) + console.log("submit signerListSet result:"+ JSON.stringify(res)); + } catch (error) { + console.log("submit signerListSet result:"+ error); + } + + try { + // 需要节点签名 + res = await c.submitSigned(signRet,{expect:'send_success', isNeedPeerSign:true}) + console.log("submit signerListSet result:"+ JSON.stringify(res)); + } catch (error) { + console.log("submit signerListSet result:"+ error); + } + }