From c3e8ddce1c03b6cc71ad9de0bdf404e89c154a8c Mon Sep 17 00:00:00 2001 From: Mojicode Date: Tue, 14 Jul 2020 16:34:08 +0800 Subject: [PATCH 01/53] add setEncTabToSyc getSyncTabAccount getNodeAccount interface for gm --- package.json | 2 +- src/index.js | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 18719ac..0fe6ba6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.6.67", + "version": "0.6.68", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index 8d50fbb..53c001b 100644 --- a/src/index.js +++ b/src/index.js @@ -904,6 +904,26 @@ ChainsqlAPI.prototype.generatCryptData = function(smAlgType, dataSetCount, plain }); }; +ChainsqlAPI.prototype.setEncTabToSync = function(address, tableName) { + const chainsqlCon = this.connect; + return chainsqlCon.api.connection.request({ + command: "g_addEncTabToSync", + account: address, + tablename: tableName + }); +}; +ChainsqlAPI.prototype.getSyncTabAccount = function() { + const chainsqlCon = this.connect; + return chainsqlCon.api.connection.request({ + command: "g_getSyncPub" + }); +}; +ChainsqlAPI.prototype.getNodeAccount = function() { + const chainsqlCon = this.connect; + return chainsqlCon.api.connection.request({ + command: "g_getNodePub" + }); +}; ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,includeFailure){ From 062ce38823fdab49c9c7e0411bca9884c071980e Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 9 Sep 2020 18:54:24 +0800 Subject: [PATCH 02/53] 1 support gm algorithm (sm2 sm3 sm4) 2 upgrade version to 0.6.68 --- lib/crypto.js | 11 +++++- lib/util.js | 105 ++++++++++++++++++++++++++++++++++++++++++++------ package.json | 9 +++-- src/index.js | 101 ++++++++++++++++++++++++++++++++++++------------ src/submit.js | 4 +- src/table.js | 9 ++++- 6 files changed, 195 insertions(+), 44 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index 1b5e1cc..9becf93 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -122,6 +122,8 @@ function eciesDecrypt(messageHex, privateKey) { return plainMsgBuf; } + + function hmac(key, bytes) { //debug('key: ', JSON.stringify(key)); //debug('bytes: ', JSON.stringify(bytes)); @@ -211,7 +213,10 @@ function paddingPass(password,keyLen){ var symEncrypt = function(symKey, plaintext, algType = 'aes') { if(algType === "gmAlg") { return keypairs.gmAlgSymEnc(symKey, plaintext); - } else { + } else if(algType === "softGMAlg"){ + return keypairs.softGMAlgSymEnc(symKey, plaintext); + } + else { return aesEncrypt(symKey, plaintext); } }; @@ -236,7 +241,9 @@ var aesEncrypt = function(secret, plaintext) { var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { if(algType === "gmAlg") { return keypairs.gmAlgSymDec(symKey, encryptedHex); - } else { + } else if(algType === "softGMAlg"){ + return keypairs.softGMAlgSymDec(symKey, encryptedHex); + }else { return aesDecrypt(symKey, encryptedHex); } }; diff --git a/lib/util.js b/lib/util.js index 8e9b810..4ee4dd8 100644 --- a/lib/util.js +++ b/lib/util.js @@ -29,25 +29,52 @@ function getSequence(api, address) { } -function generateToken(key, secretIn) { - let symKey = secretIn; +/** + * + * @param {*} key asymmetrically encrypted public or private key + * @param {*} symKey symmetrically encrypted key + */ +function generateToken(key, symKey) { + let token; const isUserPub = symKey ? true : false; - symKey = symKey ? symKey : cryptoo.randomBytes(AESKeyLength / 2).toString('hex'); - if (key === "gmAlg" || keypairs.getCryptAlgType() === "gmAlg") { + symKey = symKey ? symKey : cryptoo.randomBytes(AESKeyLength / 2).toString('hex'); + + var algType = "ecdsa-secp256k1"; + var encrytPub = ""; + if(isUserPub){ + algType = keypairs.getAlgFromPubKey(key); + encrytPub = key; + }else{ + algType = keypairs.getAlgFromPrivateKey(key); + encrytPub = keypairs.deriveKeypair(key).publicKey; + } + + if ( algType === "gmAlg" ) { token = keypairs.gmAlgSm2Enc(key, symKey); - } else { - const userPub = isUserPub ? key : keypairs.deriveKeypair(key).publicKey; - token = crypto.eciesEncrypt(symKey, userPub); + }else if(algType === "softGMAlg") { + + if(symKey && typeof symKey === "object" && Buffer.isBuffer(symKey)){ + symKey = symKey.toString('hex'); + } + + token = keypairs.softGMAlgSm2Enc(symKey,encrytPub); + }else { + token = crypto.eciesEncrypt(symKey, encrytPub); } return token; } function decodeToken(that, token) { - let symKey; + + let symKey; + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + if(that.connect.secret === "gmAlg") { symKey = keypairs.gmAlgSm2Dec(that.connect.secret, token); - } else { + }else if( regSoftGMSeed.test(that.connect.secret)){ + symKey = keypairs.softGMAlgSm2Dec(that.connect.secret, token); + }else { let keypair = keypairs.deriveKeypair(that.connect.secret); symKey = crypto.eciesDecrypt(token, keypair.privateKey); } @@ -354,12 +381,66 @@ function decodeChainsqlAddr(addrStr){ return hexAddrStr; } + +/** + * 32 bytes hex string to base58 chainsql address + * @param {string} : hexStr + * @returns {string} : base58 address string + */ +function encodeChainsqlAccountSecret(hexStr){ + let hexArray = Buffer.from(hexStr,'hex'); + let encodeRes = addressCodec.encodeAccountPrivate(hexArray); + return encodeRes; +} + +/** + * base58 chainsql address to 32 bytes hex string + * @param {string} : base58 address string + * @returns {string} : hexStr + */ +function decodeChainsqlAccountSecret(accountSecretStr){ + let decodeRes = addressCodec.decodeAccountPrivate(accountSecretStr); + //decodeRes is decimal, format to hex + let hexAddrStr = Buffer.from(decodeRes).toString('hex'); + return hexAddrStr; +} + +/** + * 获取账户使用的加密算法 + * "gmAlg" :硬国密 + * "normal":spec256k1 + * "softGMAlg": 软国密 + * "ed25519": ed25519 + * @param {*} account + */ +function getCryptAlgTypeFromAccout(account){ + + const CryptAlgType = { + GMALG:"gmAlg", + ED25519:"ed25519", + SOFTGMALG:"softGMAlg", + NORMAL:"normal" + } + + const regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + var cryptoAlg = CryptAlgType.NORMAL; + if(account.secret === "gmAlg"){ + cryptoAlg = CryptAlgType.GMALG ; + }else if(regSoftGMSeed.test(account.secret)){ + cryptoAlg = CryptAlgType.SOFTGMALG ; + } + + + return cryptoAlg; +} + + module.exports = { - getFee: getFee, - getSequence: getSequence, convertStringToHex: convertStringToHex, convertHexToString : convertHexToString, unHexTxData: unHexTxData, + getCryptAlgTypeFromAccout:getCryptAlgTypeFromAccout, getTableSequence: getTableSequence, getUserToken: getUserToken, getTableName: getTableName, @@ -374,6 +455,8 @@ module.exports = { isMeaningless: isMeaningless, encodeChainsqlAddr: encodeChainsqlAddr, decodeChainsqlAddr: decodeChainsqlAddr, + encodeChainsqlAccountSecret: encodeChainsqlAccountSecret, + decodeChainsqlAccountSecret: decodeChainsqlAccountSecret, signData:signData, parseCb: parseCb, checkCbOpt:checkCbOpt, diff --git a/package.json b/package.json index 18719ac..e2b9037 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "chainsql", - "version": "0.6.67", + "version": "0.6.68", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "mocha" }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.6", + "chainsql-keypairs": "^0.10.11", "chainsql-lib": "^0.17.44", "co": "^4.6.0", "elliptic": "^5.1.0", @@ -21,6 +21,9 @@ "web3-utils": "1.0.0-beta.36", "ws": "^7.2.0" }, + "devDependencies": { + "mocha": "~2.3.3" + }, "repository": { "type": "git", "url": "git+https://github.com/chainsql/node-chainsql-api" diff --git a/src/index.js b/src/index.js index 8d50fbb..cbbe08f 100644 --- a/src/index.js +++ b/src/index.js @@ -20,10 +20,9 @@ const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); const opType = require('../lib/config').opType; -const getFee = util.getFee; -const getSequence = util.getSequence; const convertStringToHex = util.convertStringToHex; -const getTableSequence = util.getTableSequence; +const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; + const getUserToken = util.getUserToken; const getTxJson = util.getTxJson; const generateToken = util.generateToken; @@ -47,10 +46,10 @@ class ChainsqlAPI extends Submit { this.cache = []; this.strictMode = false; this.needVerify = 1; - if(algType === "gmAlg" || algType === "normal") { + if(algType === "gmAlg" || algType === "normal" || algType === "softGMAlg" ) { keypairs.setCryptAlgType(algType); } else { - throw new Error("Wrong algType for ChainsqlAPI object, must be 'gmAlg' or 'normal'"); + throw new Error("Wrong algType for ChainsqlAPI object, must be 'gmAlg','softGMAlg' or 'normal'"); } } @@ -112,10 +111,14 @@ ChainsqlAPI.prototype.disconnect = function (cb) { } } ChainsqlAPI.prototype.as = function (account) { + if(!account.secret || !account.address){ throw chainsqlError("c.as parameter invalid,must contain 'secret' and 'address'"); } - this.connect.as(account); + + // 根据账户信息判断底层的算法类型 + keypairs.setCryptAlgType(getCryptAlgTypeFromAccout(account)); + this.connect.as(account); } ChainsqlAPI.prototype.use = function (address) { this.connect.use(address); @@ -151,7 +154,8 @@ ChainsqlAPI.prototype.contract = function(jsonInterface, address, options) { } ChainsqlAPI.prototype.generateAddress = function () { - var account; + + var account = {secret:"",address:""}; var keypair; let ripple = new RippleAPI(); if (arguments.length == 0) { @@ -159,19 +163,23 @@ ChainsqlAPI.prototype.generateAddress = function () { keypair = keypairs.deriveKeypair(account.secret); } else { if(typeof(arguments[0]) === "object" ) { - let secretNew = keypairs.generateSeed(arguments[0]); - keypair = keypairs.deriveKeypair(secretNew); - account = { - secret: secretNew, - address: keypairs.deriveAddress(keypair.publicKey) - } - } else { - keypair = keypairs.deriveKeypair(arguments[0]); - account = { - secret: arguments[0], - address: keypairs.deriveAddress(keypair.publicKey) + let seed = keypairs.generateSeed(arguments[0]); + keypair = keypairs.deriveKeypair(seed); + + if(typeof(seed) !== "object"){ + // ed25519 + account.secret = seed; + }else{ + // softGMAlg + account.secret = util.encodeChainsqlAccountSecret(keypair.privateKey) } + + } else { + keypair = keypairs.deriveKeypair(arguments[0]) + account.secret =arguments[0] } + + account.address = keypairs.deriveAddress(keypair.publicKey); } var opt = { version: 35 @@ -305,19 +313,22 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { }; if (confidential) { - var token = generateToken(that.connect.secret); + var token = generateToken(that.connect.secret); var symKey = decodeToken(that, token); + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + if(that.connect.secret === "gmAlg") { payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").toUpperCase(); - } else { + }else if( regSoftGMSeed.test(that.connect.secret)){ + payment.raw = crypto.symEncrypt(symKey, payment.raw, "softGMAlg").toUpperCase(); + } + else { payment.raw = crypto.symEncrypt(symKey, payment.raw).toUpperCase(); - } - + } payment.token = token.toUpperCase(); } else { payment.raw = convertStringToHex(payment.raw); } - if (payment.operationRule) { payment.operationRule = convertStringToHex(payment.operationRule); } @@ -774,6 +785,7 @@ function handleGrantPayment(ChainSQL) { reject(chainsqlError('your publicKey is not validate')); } ChainSQL.payment.token = token; + console.log("token : ",token) } delete ChainSQL.payment.name; delete ChainSQL.payment.publicKey; @@ -802,6 +814,47 @@ ChainsqlAPI.prototype.eciesDecrypt = function (cipher, secret) { return crypto.eciesDecrypt(cipher,keypair.privateKey); } + + +/** + * 对称加密 + * @param {*} plainText + * @param {*} publicKey + */ +ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') { + return crypto.symEncrypt(symKey,plaintext,algType); +} + +/** + * 对称解密 + * @param {*} cipher + * @param {*} privateKey + */ +ChainsqlAPI.prototype.symDecrypt = function (symKey, encryptedHex, algType = 'aes') { + + return crypto.symDecrypt(symKey, encryptedHex, algType); +} + +/** + * 非对称加密 + * @param {*} plainText + * @param {*} publicKey + */ +ChainsqlAPI.prototype.asymEncrypt = function (plainText, publicKey) { + return keypairs.asymEncrypt(plainText,publicKey); +} + +/** + * 非对称解密 + * @param {*} cipher + * @param {*} privateKey + */ +ChainsqlAPI.prototype.asymDecrypt = function (cipher, privateKey) { + + return keypairs.asymDecrypt(cipher,privateKey); +} + + ChainsqlAPI.prototype.getAccountTables = function(address, bGetDetailInfo=false){ var connection = this.api ? this.api.connection : this.connect.api.connection; return new Promise(function(resolve, reject){ @@ -927,7 +980,7 @@ ChainsqlAPI.prototype.getLedgerTxs = function(ledgerIndex,includeSuccess,include ChainsqlAPI.prototype.signFromString = function (messageHex, secret) { - var keypair = keypairs.deriveKeypair(secret); + var keypair = keypairs.deriveKeypair(secret); var signatue = keypairs.sign(messageHex,keypair.privateKey); return signatue; }; diff --git a/src/submit.js b/src/submit.js index c88dd85..46cc813 100644 --- a/src/submit.js +++ b/src/submit.js @@ -20,9 +20,7 @@ Submit.prototype.submit = function (expectOpt) { try { self.prepareJson().then(function (prepared) { self.txJSON = prepared.txJSON; - - self.setCert(); - + self.setCert(); let signedRet = self.signTx(); self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); }).catch(function (error) { diff --git a/src/table.js b/src/table.js index 4cac68c..089152e 100644 --- a/src/table.js +++ b/src/table.js @@ -412,7 +412,14 @@ function prepareTable(ChainSQL, payment, resolve, reject) { token = token[ChainSQL.connect.scope + ChainSQL.tab]; if (token && token != '') { var secret = decodeToken(ChainSQL, token); - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(ChainSQL.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ + algType = "softGMAlg"; + } payment.raw = crypto.symEncrypt(secret, payment.raw, algType).toUpperCase(); } else { payment.raw = convertStringToHex(payment.raw); From 5557d0ddbece9103472a9dcf1e736e605e7f5e01 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 9 Sep 2020 18:56:00 +0800 Subject: [PATCH 03/53] upgrade version to 0.6.69 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e2b9037..aea49ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.6.68", + "version": "0.6.69", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 0700b88d9a94fa74955af0af5ff3e6cc73165a33 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 16 Sep 2020 15:48:07 +0800 Subject: [PATCH 04/53] Table transaction adds a field TxsHashFillField --- src/table.js | 34 ++++++++++++++++++++++++++-------- src/tablePayment.js | 3 ++- test/test.js | 22 ++++++++++------------ 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/table.js b/src/table.js index 089152e..241c5b8 100644 --- a/src/table.js +++ b/src/table.js @@ -19,7 +19,8 @@ class Table extends Submit { this.exec = ''; this.field = null; this.connect = ChainsqlAPI.connect; - this.cache = []; + this.cache = []; + this.txsHashFillField = null; } submit (cb) { @@ -59,13 +60,18 @@ class Table extends Submit { } } -Table.prototype.insert = function(raw, field) { +Table.prototype.insert = function(raw, autoField ,txsHashFillField) { if (!this.tab) throw chainsqlError('you must appoint the table name'); if (this.exec !== '' && this.exec !== 'r_insert') throw chainsqlError('Object can not hava function insert'); var that = this; - if (field) { - this.field = field; + if (autoField) { + this.field = autoField; + } + + if (txsHashFillField) { + this.txsHashFillField = txsHashFillField; } + if (Object.prototype.toString.call(raw) === '[object Array]') { raw.forEach(function(item) { that.query.push(item); @@ -90,7 +96,7 @@ Table.prototype.insert = function(raw, field) { } } -Table.prototype.update = function(raw,field) { +Table.prototype.update = function(raw,field,txsHashFillField) { if (!this.tab) throw chainsqlError('you must appoint the table name'); if (this.exec !== 'r_get') throw chainsqlError('Object can not hava function update'); this.query.unshift(raw); @@ -99,6 +105,10 @@ Table.prototype.update = function(raw,field) { this.field = field; } + if (txsHashFillField) { + this.txsHashFillField = txsHashFillField; + } + this.exec = 'r_update'; if (this.transaction) { this.cache.push({ @@ -397,10 +407,18 @@ Table.prototype.prepareJson = function() { }], tsType: 'SQLStatement' }; - if ( (that.exec == 'r_insert' || that.exec == 'r_update') && that.field) { - payment.autoFillField = convertStringToHex(that.field); - } + if ( (that.exec == 'r_insert' || that.exec == 'r_update') ) { + + if(that.field){ + payment.autoFillField = convertStringToHex(that.field); + } + if ( that.txsHashFillField) { + payment.txsHashFillField = convertStringToHex(that.txsHashFillField); + } + + } + return new Promise(function (resolve, reject) { prepareTable(that, payment, resolve, reject); }); diff --git a/src/tablePayment.js b/src/tablePayment.js index 39d7780..c938ef9 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -61,7 +61,8 @@ function createPaymentTransaction(paymentArgument) { AutoFillField:payment.autoFillField, Token:payment.token, StrictMode: payment.strictMode, - OperationRule: payment.operationRule + OperationRule: payment.operationRule, + TxsHashFillField:payment.txsHashFillField, } return txJSON; } diff --git a/test/test.js b/test/test.js index 42f054c..6ae5a20 100644 --- a/test/test.js +++ b/test/test.js @@ -25,7 +25,7 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "fasefa"; +var sTableName = "fasefa25"; var sTableName2 = "b1"; var sReName = "boy1234"; var sTableName3 = "hijack12"; @@ -34,7 +34,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:6005'); + await c.connect('ws://127.0.0.1:7017'); //await c.connect('ws://101.201.40.124:5006'); console.log('连接成功'); @@ -143,9 +143,9 @@ async function testChainsql(){ // await testCreateTable(); // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); - // await testInsert(); - // await testUpdate(); + //await testCreateTable1(); + //await testInsert(); + await testUpdate(); // await testDelete(); // await testRename(); // await testGet(); @@ -204,8 +204,8 @@ var testCreateTable = async function() { var testCreateTable1 = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, - {'field':'name','type':'varchar','length':50,'default':null}, - {'field':'age','type':'int'} + {'field':'name','type':'text','default':''}, + {'field':'txnField','type':'text'} ]; var option = { confidential: false @@ -222,12 +222,10 @@ var testCreateTable1 = async function() { //重复插入的情况下报异常 var testInsert = async function() { var raw = [ - {'id':1,'age': 333,'name':'hello'}, - {'id':2,'age': 444,'name':'sss'}, - {'id':3,'age': 555,'name':'rrr'} + {'id':7} ]; try { - var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + var rs = await c.table(sTableName).insert(raw,"name","txnField").submit({expect:'db_success'}); console.log("testInsert",rs); } catch (error) { console.error(error); @@ -236,7 +234,7 @@ var testInsert = async function() { var testUpdate = async function(){ try { - var rs = await c.table(sTableName).get({'id': 2}).update({'age':200}).submit({expect:'db_success'}); + var rs = await c.table(sTableName).get({'id': 7}).update({'name':"26"},"name","txnField").submit({expect:'db_success'}); console.log("testUpdate",rs); } catch (error) { console.error(error); From 165dc6bcc0770f96d0a4f1b8b1cac0d6b2d8a5af Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 22 Sep 2020 18:37:26 +0800 Subject: [PATCH 05/53] upgrade version to 0.70.0 --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index aea49ef..082f50e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql", - "version": "0.6.69", + "version": "0.7.0", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -22,7 +22,8 @@ "ws": "^7.2.0" }, "devDependencies": { - "mocha": "~2.3.3" + "mocha": "~2.3.3", + "chai": "^4.2.0" }, "repository": { "type": "git", From a3016242c62fa8cedd34a333a70836a0a5035c6e Mon Sep 17 00:00:00 2001 From: ruancheng Date: Wed, 30 Sep 2020 10:02:25 +0800 Subject: [PATCH 06/53] 1 fix t_sqlTxs bug 2 submit test version chainsql-test^0.6.70 --- package.json | 4 ++-- src/index.js | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index aea49ef..2f14cda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql", - "version": "0.6.69", + "name": "chainsql-test", + "version": "0.6.70", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index cbbe08f..0c90e4f 100644 --- a/src/index.js +++ b/src/index.js @@ -681,7 +681,14 @@ function handleCommit(ChainSQL, object, resolve, reject) { var secret = decodeToken(ChainSQL, token); if (cache[i].Raw) { if (cache[i].OpType != opType.t_grant) { - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + let algType = "aes"; + if(ChainSQL.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ + algType = "softGMAlg"; + } cache[i].Raw = crypto.symEncrypt(secret, JSON.stringify(cache[i].Raw), algType).toUpperCase(); } else { cache[i].Raw = convertStringToHex(JSON.stringify(cache[i].Raw)); From 29fa3fcb895ded7e3c8678af18e680869cbff1a1 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 12 Oct 2020 14:12:50 +0800 Subject: [PATCH 07/53] create a new branch feature/chainsql-test --- lib/crypto.js | 2 +- lib/util.js | 2 +- package.json | 6 +- solidity-example/solidity-TableTxs.sol | 9 +- src/index.js | 25 ++++- src/smartContract.js | 2 +- test/server.js | 2 +- test/test.js | 128 ++++++++++++++++++----- test/testContractTableTxs.js | 94 +++++++++++------ test/testTable.js | 138 ++++++++++++++++++++----- 10 files changed, 312 insertions(+), 96 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index 9becf93..30909d7 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -1,6 +1,6 @@ "use strict"; // requires -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const hashjs = require('hash.js'); const elliptic = require('elliptic'); diff --git a/lib/util.js b/lib/util.js index 4ee4dd8..abb0861 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); const common = require('chainsql-lib').ChainsqlLibCommon; -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const cryptoo = require('crypto'); const crypto = require('./crypto'); const opType = require('./config').opType; diff --git a/package.json b/package.json index 082f50e..10a3503 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql", - "version": "0.7.0", + "name": "chainsql-test", + "version": "0.6.71", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -8,7 +8,7 @@ }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.11", + "chainsql-keypairs-test": "^0.10.16", "chainsql-lib": "^0.17.44", "co": "^4.6.0", "elliptic": "^5.1.0", diff --git a/solidity-example/solidity-TableTxs.sol b/solidity-example/solidity-TableTxs.sol index 506aebb..2f1e8e5 100644 --- a/solidity-example/solidity-TableTxs.sol +++ b/solidity-example/solidity-TableTxs.sol @@ -85,12 +85,11 @@ contract DBTest { return msg.sender.grant(toWho, tableName, raw); } - function sqlTransaction(string tableName) public{ + function sqlTransaction(address owner,string tableName) public{ db.beginTrans(); - msg.sender.create(tableName, "[{\"field\":\"id\", \"type\" : \"int\", \"length\" : 11, \"PK\" : 1, \"NN\" : 1, \"UQ\" : 1}, { \"field\":\"account\", \"type\" : \"varchar\" }, { \"field\":\"age\", \"type\" : \"int\" }]"); - msg.sender.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); - msg.sender.deletex(tableName, "{\"id\":1}"); - msg.sender.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); + msg.sender.insert(owner,tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); + msg.sender.deletex(owner,tableName, "{\"id\":1}"); + msg.sender.update(owner,tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); db.commit(); } diff --git a/src/index.js b/src/index.js index cbbe08f..107cdd0 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ 'use strict' const crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const EventManager = require('./eventManager') const _ = require('lodash'); @@ -19,6 +19,7 @@ const Connection = require('./connect'); const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); +const co = require('co'); const opType = require('../lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; @@ -316,6 +317,10 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { var token = generateToken(that.connect.secret); var symKey = decodeToken(that, token); var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + + // 原始的大小 + console.log("pre :",payment.raw); if(that.connect.secret === "gmAlg") { payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").toUpperCase(); @@ -325,7 +330,13 @@ ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { else { payment.raw = crypto.symEncrypt(symKey, payment.raw).toUpperCase(); } + + // + console.log("after :",payment.raw); + payment.token = token.toUpperCase(); + + console.log("token :",payment.token); } else { payment.raw = convertStringToHex(payment.raw); } @@ -681,7 +692,17 @@ function handleCommit(ChainSQL, object, resolve, reject) { var secret = decodeToken(ChainSQL, token); if (cache[i].Raw) { if (cache[i].OpType != opType.t_grant) { - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + //const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; + + + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(ChainSQL.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ + algType = "softGMAlg"; + } cache[i].Raw = crypto.symEncrypt(secret, JSON.stringify(cache[i].Raw), algType).toUpperCase(); } else { cache[i].Raw = convertStringToHex(JSON.stringify(cache[i].Raw)); diff --git a/src/smartContract.js b/src/smartContract.js index 5ffe469..862acaa 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -4,7 +4,7 @@ var util = require('../lib/util'); const _ = require('lodash'); var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); var abi = require('web3-eth-abi'); diff --git a/test/server.js b/test/server.js index f4b3bbc..96f1f62 100644 --- a/test/server.js +++ b/test/server.js @@ -8,7 +8,7 @@ var path = require('path'); var basePath = path.join(require.resolve('chainsql-lib'), '../common'); var common = require(basePath); var crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs'); +const keypairs = require('chainsql-keypairs-test'); co(function*() { try { diff --git a/test/test.js b/test/test.js index 6ae5a20..504423f 100644 --- a/test/test.js +++ b/test/test.js @@ -25,34 +25,83 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "fasefa25"; +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", + publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' +} + + +// zM8SaWYBPSiRd7x8KpcrwLL7UJU8YDG8Wf + +// pwhRt7Cw561HobWUtsCn3heg3UqCCjNSk6vZXLk1LjwmbtzVy1r + +var smTest = { + secret: 'pwhRt7Cw561HobWUtsCn3heg3UqCCjNSk6vZXLk1LjwmbtzVy1r', + address: 'zM8SaWYBPSiRd7x8KpcrwLL7UJU8YDG8Wf', + publicKey: 'pYvPU2kQCUgJZzMYX3RFFGvhyVHeSb3UeLGLAjTtTn7jPTR2hJbHvDi7ScDXMyuc7aFueaNMohSxJnoa9KGKgTwxaqgWWEvc' +} + +var smUser7 ={ + secret:"pwRdHmA4cSUKKtFyo4m2vhiiz5g6ym58Noo9dTsUU97mARNjevj", + address: "zMXMtS2C36J1p3uhTxRFWV8pEhHa8AMMSL", + publicKey: "pYvXDbsUUr5dpumrojYApjG8nLfFMXhu3aDvxq5oxEa4ZSeyjrMzisdPsYjfxyg9eN3ZJsNjtNENbzXPL89st39oiSp5yucU" +} + +// var smTest = { +// secret: 'pw2E1su2nmj5qnFJoq6WfCQLjGLWuKVuAFR49vrkSGr16DQwHKu', +// address: 'zGPoujotavee98sssyKCVGig3mVJB42sZJ', +// publicKey: 'pYvhKdDqBnGzXc4Ff1wutzc7z3z2UcN4aPxMPN1pW66…hkDLmoHFRkGmBaz2fzdjZsXW85FCgHFVw3VqeGGVfQt' +// } + +var sTableName = "jmtable5"; var sTableName2 = "b1"; -var sReName = "boy1234"; +var sReName = "jmtable2"; var sTableName3 = "hijack12"; +//var wsAddr = "ws://192.168.191.208:5215"; +//var wsAddr = "ws://192.168.191.223:6006"; +var wsAddr = "ws://192.168.29.113:6006" main(); - async function main(){ + try { - await c.connect('ws://127.0.0.1:7017'); - //await c.connect('ws://101.201.40.124:5006'); + + // let accountInfo = c.generateAddress({algorithm:"softGMAlg",secret:smUser7.secret}); + // console.log(JSON.stringify(accountInfo)) + // accountInfo = c.generateAddress({algorithm:"softGMAlg"}); + // console.log(accountInfo) + // accountInfo = c.generateAddress({algorithm:"softGMAlg"}); + // console.log(accountInfo) + + await c.connect(wsAddr); + //await c.connect('ws://127.0.0.1:7017'); console.log('连接成功'); - c.as(owner); + c.as(smRoot); - // // 读取证书文件 - // var data = fs.readFileSync('D:\\git\\ca\\test\\userCert.cert'); + // 读取证书文件 + // var data = fs.readFileSync('C:\\ca\\userCert.cert'); // c.useCert(data.toString()); + // let accountInfo = c.generateAddress({algorithm:"softGMAlg"}); + // console.log(accountInfo) + // c.setRestrict(true); //激活user账户 - // await activateAccount(user.address); + await activateAccount(smUser.address); //await testSubscribe(); // await testRippleAPI(); // await testAccount(); - await testChainsql(); + //await testChainsql(); //await c.disconnect(); console.log('运行结束'); @@ -140,12 +189,12 @@ async function testAccount(){ } async function testChainsql(){ - // await testCreateTable(); + //await testCreateTable(); // // //创建另一张表,用来测试rename,drop - //await testCreateTable1(); - //await testInsert(); - await testUpdate(); +// await testCreateTable1(); + await testInsert(); +// await testUpdate(); // await testDelete(); // await testRename(); // await testGet(); @@ -194,7 +243,7 @@ var testCreateTable = async function() { {'field':'age','type':'int'} ] var option = { - confidential: false + confidential: true } // 创建表 let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); @@ -205,7 +254,29 @@ var testCreateTable1 = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, {'field':'name','type':'text','default':''}, - {'field':'txnField','type':'text'} + {'field':'txnField','type':'text'}, + {"field":"age1","type":"int"}, + {"field":"age2","type":"int"}, + {"field":"age3","type":"int"}, + {"field":"age4","type":"int"}, + {"field":"age5","type":"int"}, + {"field":"age6","type":"int"}, + {"field":"age7","type":"int"}, + {"field":"age8","type":"int"}, + {"field":"age9","type":"int"}, + {"field":"age10","type":"int"}, + {"field":"age11","type":"int"}, + {"field":"age12","type":"int"}, + {"field":"age13","type":"int"}, + {"field":"age14","type":"int"}, + {"field":"age15","type":"int"}, + {"field":"age16","type":"int"}, + {"field":"age17","type":"int"}, + {"field":"age18","type":"int"}, + {"field":"age19","type":"int"}, + {"field":"age20","type":"int"}, + {"field":"age21","type":"int"}, + {"field":"age22","type":"int"} ]; var option = { confidential: false @@ -219,14 +290,20 @@ var testCreateTable1 = async function() { } }; +// {'age': 333,'name':'hello'}, +// {'age': 444,'name':'sss'}, +// {'age': 555,'name':'rrr'} + //重复插入的情况下报异常 var testInsert = async function() { var raw = [ - {'id':7} + {'id':7}, + {'id':8}, + {'id':9} ]; try { - var rs = await c.table(sTableName).insert(raw,"name","txnField").submit({expect:'db_success'}); - console.log("testInsert",rs); + var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + console.log("testInsert ",rs); } catch (error) { console.error(error); } @@ -234,7 +311,7 @@ var testInsert = async function() { var testUpdate = async function(){ try { - var rs = await c.table(sTableName).get({'id': 7}).update({'name':"26"},"name","txnField").submit({expect:'db_success'}); + var rs = await c.table(sTableName).get({'id': 7}).update({'name':"28"},"name","txnField").submit({expect:'db_success'}); console.log("testUpdate",rs); } catch (error) { console.error(error); @@ -290,8 +367,8 @@ var testDrop = async function(){ //重复授权可能出异常,测一下 var testGrant = async function(){ try { - var raw = {select:true, insert:false, update:false, delete:true}; - var rs = await c.grant(sTableName, user.address, raw, user.publicKey).submit({expect:'db_success'}); + var raw = {select:true, insert:true, update:true, delete:true}; + var rs = await c.grant(sTableName, smUser7.address, raw, smUser7.publicKey).submit({expect:'validate_success'}); console.log("testGrant",rs); } catch (error) { console.error(error); @@ -314,10 +391,11 @@ var insertAfterGrant = async function(){ var testTxs = async function(){ try { + c.as(smRoot) c.beginTran(); - c.grant(sTableName,user.address,{insert:true,update:true},user.publicKey) - c.table(sTableName).insert({ 'age': 333, 'name': 'hello' }); - c.table(sTableName).get({ 'age': 333 }).update({ 'name': 'world' }); + //c.grant(sTableName,user.address,{insert:true,update:true},user.publicKey) + c.table(sTableName).insert({ 'id':1245, 'name': '333'}); + // c.table(sTableName).get({ 'age': 333 }).update({ 'name': 'world' }); var rs = await c.commit({expect: 'db_success'}); console.log("testTxs",rs); } catch (error) { diff --git a/test/testContractTableTxs.js b/test/testContractTableTxs.js index 6c80ef7..9fd3b82 100644 --- a/test/testContractTableTxs.js +++ b/test/testContractTableTxs.js @@ -16,6 +16,19 @@ var user = { address: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv", secret: "xnJn5J5uYz3qnYX72jXkAPVB3ZsER" } + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + + var userOperation = user; var user1 = { @@ -26,7 +39,7 @@ var user1 = { var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; -var sTableName = "sTable"; +var sTableName = "n3"; var sTableNameNew = "table_new" var rawTable = "[ \ { \"field\": \"id\", \"type\": \"int\" }, \ @@ -50,8 +63,10 @@ var rawGet = "{\"id\": 2}" var myContract; -const abi = '[{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"create","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"drop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"toWho","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"grant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"},{"name":"field","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'; -const deployBytecode = '0x608060405234801561001057600080fd5b50611f58806100206000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff8146100ca578063198e2b8a1461022957806331445f171461038857806331c3e4561461059e5780635310b551146107945780636c02d6921461085c578063746ecd69146109db5780638b0a4ee114610b5a57806391025cb114610cd957806399489c2114610da15780639c7c722b14610f99578063cf22eb59146110f8578063ea0f5b7a14611387575b600080fd5b3480156100d657600080fd5b50610227600480360360408110156100ed57600080fd5b810190808035906020019064010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460018302840111640100000000831117156101d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506114e6565b005b34801561023557600080fd5b506103866004803603604081101561024c57600080fd5b810190808035906020019064010000000081111561026957600080fd5b82018360208201111561027b57600080fd5b8035906020019184600183028401116401000000008311171561029d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561030057600080fd5b82018360208201111561031257600080fd5b8035906020019184600183028401116401000000008311171561033457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061152d565b005b34801561039457600080fd5b5061059c600480360360808110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103e857600080fd5b8201836020820111156103fa57600080fd5b8035906020019184600183028401116401000000008311171561041c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460018302840111640100000000831117156104b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561051657600080fd5b82018360208201111561052857600080fd5b8035906020019184600183028401116401000000008311171561054a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611574565b005b3480156105aa57600080fd5b50610792600480360360608110156105c157600080fd5b81019080803590602001906401000000008111156105de57600080fd5b8201836020820111156105f057600080fd5b8035906020019184600183028401116401000000008311171561061257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561067557600080fd5b82018360208201111561068757600080fd5b803590602001918460018302840111640100000000831117156106a957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561070c57600080fd5b82018360208201111561071e57600080fd5b8035906020019184600183028401116401000000008311171561074057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506115c8565b005b3480156107a057600080fd5b5061085a600480360360208110156107b757600080fd5b81019080803590602001906401000000008111156107d457600080fd5b8201836020820111156107e657600080fd5b8035906020019184600183028401116401000000008311171561080857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061161b565b005b34801561086857600080fd5b506109d96004803603606081101561087f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111640100000000831117156108f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561095357600080fd5b82018360208201111561096557600080fd5b8035906020019184600183028401116401000000008311171561098757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611656565b005b3480156109e757600080fd5b50610b58600480360360608110156109fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b80359060200191846001830284011164010000000083111715610a6f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ad257600080fd5b820183602082011115610ae457600080fd5b80359060200191846001830284011164010000000083111715610b0657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061169e565b005b348015610b6657600080fd5b50610cd760048036036060811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610bba57600080fd5b820183602082011115610bcc57600080fd5b80359060200191846001830284011164010000000083111715610bee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c5157600080fd5b820183602082011115610c6357600080fd5b80359060200191846001830284011164010000000083111715610c8557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116e6565b005b348015610ce557600080fd5b50610d9f60048036036020811015610cfc57600080fd5b8101908080359060200190640100000000811115610d1957600080fd5b820183602082011115610d2b57600080fd5b80359060200191846001830284011164010000000083111715610d4d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611731565b005b348015610dad57600080fd5b50610f1e60048036036060811015610dc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e0157600080fd5b820183602082011115610e1357600080fd5b80359060200191846001830284011164010000000083111715610e3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e9857600080fd5b820183602082011115610eaa57600080fd5b80359060200191846001830284011164010000000083111715610ecc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061195e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f5e578082015181840152602081019050610f43565b50505050905090810190601f168015610f8b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fa557600080fd5b506110f660048036036040811015610fbc57600080fd5b8101908080359060200190640100000000811115610fd957600080fd5b820183602082011115610feb57600080fd5b8035906020019184600183028401116401000000008311171561100d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561107057600080fd5b82018360208201111561108257600080fd5b803590602001918460018302840111640100000000831117156110a457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b48565b005b34801561110457600080fd5b5061130c6004803603608081101561111b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561115857600080fd5b82018360208201111561116a57600080fd5b8035906020019184600183028401116401000000008311171561118c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156111ef57600080fd5b82018360208201111561120157600080fd5b8035906020019184600183028401116401000000008311171561122357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561128657600080fd5b82018360208201111561129857600080fd5b803590602001918460018302840111640100000000831117156112ba57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b8f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561134c578082015181840152602081019050611331565b50505050905090810190601f1680156113795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561139357600080fd5b506114e4600480360360408110156113aa57600080fd5b81019080803590602001906401000000008111156113c757600080fd5b8201836020820111156113d957600080fd5b803590602001918460018302840111640100000000831117156113fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561145e57600080fd5b82018360208201111561147057600080fd5b8035906020019184600183028401116401000000008311171561149257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d12565b005b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611528573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c094505050505015801561156f573d6000803e3d6000d15b505050565b8373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc596505050505050501580156115c1573d6000803e3d6000d15b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc59650505050505050158015611615573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1681805190602001818184c192505050158015611652573d6000803e3d6000d15b5050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611698573d6000803e3d6000d15b50505050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c49450505050501580156116e0573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1683838051906020018480519060200181818585888ac79550505050505015801561172b573d6000803e3d6000d15b50505050565bc83373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681526020017f6a566173795073463459486a323234222c20226964223a31317d2c207b22616381526020017f636f756e74223a227a55343279445733667a466a47576f736465566a5661737981526020017f5073463459486a323234222c202020226964223a31327d5d00000000000000008152506078019050604051809103908181016040528181858588c394505050505015801561181a573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226964223a317d0000000000000000000000000000000000000000000000008152506008019050604051809103908181016040528181858588c4945050505050158015611891573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226163636f756e74223a2269643d3d32227d0000000000000000000000000081525060130190506040518091039081810160405260405180807f7b226964223a20327d00000000000000000000000000000000000000000000008152506009019050604051809103908181016040528181858589898cc59650505050505050158015611947573d6000803e3d6000d15b50c915801561195a573d6000803e3d6000d15b5050565b606060008473ffffffffffffffffffffffffffffffffffffffff1684805190602001858051906020018181858588c6945050505050905060008114151515611a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050600082cb9050606060008090505b83811015611b395760008090505b83811015611aea576060868383808284d0602001806040519081016040528181848688cd9450505050509050611a8c8482611d59565b93506001850382141515611adc57611ad9846040805190810160405280600281526020017f2c20000000000000000000000000000000000000000000000000000000000000815250611d59565b93505b508080600101915050611a56565b50611b2a826040805190810160405280600281526020017f3b0a000000000000000000000000000000000000000000000000000000000000815250611d59565b91508080600101915050611a48565b50809450505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c2945050505050158015611b8a573d6000803e3d6000d15b505050565b606060008573ffffffffffffffffffffffffffffffffffffffff1685805190602001868051906020018181858588c6945050505050905060008114151515611c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050606060008090505b82811015611d0357606084828880519060200181818486cf6020018060405190810160405281818585888acc955050505050509050611cb28382611d59565b9250611cf3836040805190810160405280600181526020017f3b00000000000000000000000000000000000000000000000000000000000000815250611d59565b9250508080600101915050611c73565b50809350505050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c4945050505050158015611d54573d6000803e3d6000d15b505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611d9d5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8551811015611e63578581815181101515611dc757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e2657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611db0565b5060008090505b8451811015611f1d578481815181101515611e8157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611ee057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611e6a565b508195505050505050929150505600a165627a7a723058200b0dbd97123f4e63cdd05fb7f53186505f6425bd763465b61c74dc7f7a282eeb0029'; + +const abi = '[{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"create","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"drop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"toWho","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"grant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"},{"name":"field","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]' +const deployBytecode = '0x608060405234801561001057600080fd5b50611f79806100206000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff8146100ca5780630a3cb6e414610229578063198e2b8a1461031157806331445f171461047057806331c3e456146106865780635310b5511461087c5780636c02d69214610944578063746ecd6914610ac35780638b0a4ee114610c4257806399489c2114610dc15780639c7c722b14610fb9578063cf22eb5914611118578063ea0f5b7a146113a7575b600080fd5b3480156100d657600080fd5b50610227600480360360408110156100ed57600080fd5b810190808035906020019064010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460018302840111640100000000831117156101d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611506565b005b34801561023557600080fd5b5061030f6004803603604081101561024c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561028957600080fd5b82018360208201111561029b57600080fd5b803590602001918460018302840111640100000000831117156102bd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061154d565b005b34801561031d57600080fd5b5061046e6004803603604081101561033457600080fd5b810190808035906020019064010000000081111561035157600080fd5b82018360208201111561036357600080fd5b8035906020019184600183028401116401000000008311171561038557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103e857600080fd5b8201836020820111156103fa57600080fd5b8035906020019184600183028401116401000000008311171561041c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061177b565b005b34801561047c57600080fd5b506106846004803603608081101561049357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156104d057600080fd5b8201836020820111156104e257600080fd5b8035906020019184600183028401116401000000008311171561050457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561056757600080fd5b82018360208201111561057957600080fd5b8035906020019184600183028401116401000000008311171561059b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156105fe57600080fd5b82018360208201111561061057600080fd5b8035906020019184600183028401116401000000008311171561063257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506117c2565b005b34801561069257600080fd5b5061087a600480360360608110156106a957600080fd5b81019080803590602001906401000000008111156106c657600080fd5b8201836020820111156106d857600080fd5b803590602001918460018302840111640100000000831117156106fa57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561075d57600080fd5b82018360208201111561076f57600080fd5b8035906020019184600183028401116401000000008311171561079157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107f457600080fd5b82018360208201111561080657600080fd5b8035906020019184600183028401116401000000008311171561082857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611816565b005b34801561088857600080fd5b506109426004803603602081101561089f57600080fd5b81019080803590602001906401000000008111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111640100000000831117156108f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611869565b005b34801561095057600080fd5b50610ac16004803603606081101561096757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460018302840111640100000000831117156109d857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b80359060200191846001830284011164010000000083111715610a6f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118a4565b005b348015610acf57600080fd5b50610c4060048036036060811015610ae657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610b2357600080fd5b820183602082011115610b3557600080fd5b80359060200191846001830284011164010000000083111715610b5757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610bba57600080fd5b820183602082011115610bcc57600080fd5b80359060200191846001830284011164010000000083111715610bee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118ec565b005b348015610c4e57600080fd5b50610dbf60048036036060811015610c6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ca257600080fd5b820183602082011115610cb457600080fd5b80359060200191846001830284011164010000000083111715610cd657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610d3957600080fd5b820183602082011115610d4b57600080fd5b80359060200191846001830284011164010000000083111715610d6d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611934565b005b348015610dcd57600080fd5b50610f3e60048036036060811015610de457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e2157600080fd5b820183602082011115610e3357600080fd5b80359060200191846001830284011164010000000083111715610e5557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610eb857600080fd5b820183602082011115610eca57600080fd5b80359060200191846001830284011164010000000083111715610eec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061197f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f7e578082015181840152602081019050610f63565b50505050905090810190601f168015610fab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fc557600080fd5b5061111660048036036040811015610fdc57600080fd5b8101908080359060200190640100000000811115610ff957600080fd5b82018360208201111561100b57600080fd5b8035906020019184600183028401116401000000008311171561102d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561109057600080fd5b8201836020820111156110a257600080fd5b803590602001918460018302840111640100000000831117156110c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b69565b005b34801561112457600080fd5b5061132c6004803603608081101561113b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561117857600080fd5b82018360208201111561118a57600080fd5b803590602001918460018302840111640100000000831117156111ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561120f57600080fd5b82018360208201111561122157600080fd5b8035906020019184600183028401116401000000008311171561124357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156112a657600080fd5b8201836020820111156112b857600080fd5b803590602001918460018302840111640100000000831117156112da57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611bb0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561136c578082015181840152602081019050611351565b50505050905090810190601f1680156113995780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156113b357600080fd5b50611504600480360360408110156113ca57600080fd5b81019080803590602001906401000000008111156113e757600080fd5b8201836020820111156113f957600080fd5b8035906020019184600183028401116401000000008311171561141b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561147e57600080fd5b82018360208201111561149057600080fd5b803590602001918460018302840111640100000000831117156114b257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d33565b005b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611548573d6000803e3d6000d15b505050565bc88173ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681526020017f6a566173795073463459486a323234222c20226964223a317d2c207b2261636381526020017f6f756e74223a227a55343279445733667a466a47576f736465566a566173795081526020017f73463459486a323234222c202020226964223a327d5d000000000000000000008152506076019050604051809103908181016040528181858588c3945050505050158015611636573d6000803e3d6000d15b508173ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226964223a317d0000000000000000000000000000000000000000000000008152506008019050604051809103908181016040528181858588c49450505050501580156116ad573d6000803e3d6000d15b508173ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226163636f756e74223a2269643d3d32227d0000000000000000000000000081525060130190506040518091039081810160405260405180807f7b226964223a20327d00000000000000000000000000000000000000000000008152506009019050604051809103908181016040528181858589898cc59650505050505050158015611763573d6000803e3d6000d15b50c9158015611776573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c09450505050501580156117bd573d6000803e3d6000d15b505050565b8373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc5965050505050505015801561180f573d6000803e3d6000d15b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc59650505050505050158015611863573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1681805190602001818184c1925050501580156118a0573d6000803e3d6000d15b5050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c39450505050501580156118e6573d6000803e3d6000d15b50505050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c494505050505015801561192e573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1683838051906020018480519060200181818585888ac795505050505050158015611979573d6000803e3d6000d15b50505050565b606060008473ffffffffffffffffffffffffffffffffffffffff1684805190602001858051906020018181858588c6945050505050905060008114151515611a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050600082cb9050606060008090505b83811015611b5a5760008090505b83811015611b0b576060868383808284d0602001806040519081016040528181848688cd9450505050509050611aad8482611d7a565b93506001850382141515611afd57611afa846040805190810160405280600281526020017f2c20000000000000000000000000000000000000000000000000000000000000815250611d7a565b93505b508080600101915050611a77565b50611b4b826040805190810160405280600281526020017f3b0a000000000000000000000000000000000000000000000000000000000000815250611d7a565b91508080600101915050611a69565b50809450505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c2945050505050158015611bab573d6000803e3d6000d15b505050565b606060008573ffffffffffffffffffffffffffffffffffffffff1685805190602001868051906020018181858588c6945050505050905060008114151515611c86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050606060008090505b82811015611d2457606084828880519060200181818486cf6020018060405190810160405281818585888acc955050505050509050611cd38382611d7a565b9250611d14836040805190810160405280600181526020017f3b00000000000000000000000000000000000000000000000000000000000000815250611d7a565b9250508080600101915050611c94565b50809350505050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c4945050505050158015611d75573d6000803e3d6000d15b505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611dbe5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8551811015611e84578581815181101515611de857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e4757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611dd1565b5060008090505b8451811015611f3e578481815181101515611ea257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611f0157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611e8b565b508195505050505050929150505600a165627a7a723058208b20fb88ba248a768795bdfa5965f60013dcd97a4301932345ddd45829cee2100029' + //solidity code: solidity-example/solidity-TableTxs.sol var tagStep = { @@ -61,17 +76,29 @@ var tagStep = { table_update: 10, table_get: 11, table_transaction: 12, deployContract: 13 } +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", + publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' +} + + main(); async function main() { - let res = await c.connect('ws://127.0.0.1:6005'); + + var wsAddress = 'ws://192.168.29.118:6006'; + let res = await c.connect(wsAddress); console.log(" connect successfully.") c.setRestrict(true); + let res2 = await c.getTableAuth(smRoot.address,sTableName); + console.log( JSON.stringify(res2)); + /**************************************/ // userOperation = user; - const contractAddr = "zEyJTYupmFGo3tWCts8uyzmkkmjJAwgS2u"; - let nStep = tagStep.deployContract; + const contractAddr = "zGAcwQoo5xqHKy42waq9d2Tb6Myn2MyvJf"; + let nStep = tagStep.table_transaction; // sTableName = sTableNameNew; // if (nStep != tagStep.active && nStep != tagStep.deployContract) { @@ -97,7 +124,7 @@ async function main() { } async function deployContract() { - c.as(owner) + c.as(smRoot) myContract = c.contract(JSON.parse(abi)); try { let deployRes = await myContract.deploy( @@ -117,20 +144,20 @@ async function deployContract() { } var active = async function () { - c.as(root); + c.as(smRoot); var amount = 20000 console.log("----------- active >>>>>>>>>>>>>"); - let res = await c.pay(owner.address, amount).submit({ expect: 'validate_success' }) - console.log("\n owner", owner.address, ":", res) - res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) - console.log("\n user", user.address, ":", res) - res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) - console.log("\n user1", user1.address, ":", res) - console.log("\n----------- active <<<<<<<<<<<<<"); + let res = await c.pay(smUser.address, amount).submit({ expect: 'validate_success' }) + console.log("\n owner", smUser.address, ":", res) + // res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) + // console.log("\n user", user.address, ":", res) + // res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) + // console.log("\n user1", user1.address, ":", res) + // console.log("\n----------- active <<<<<<<<<<<<<"); } var table_create = async function () { - c.as(owner) + c.as(smRoot) //发交易调用合约 try { myContract.methods.create(sTableName, rawTable).submit({ @@ -190,9 +217,9 @@ var table_rename = async function () { } } var table_grant = async function () { - c.as(owner) + c.as(smRoot) try { - myContract.methods.grant(grantAddr, sTableName, flag).submit({ + myContract.methods.grant(smUser.address, sTableName, flag).submit({ Gas: 500000, expect: "validate_success" }, (err, res) => { @@ -216,24 +243,24 @@ var table_drop = async function () { } } var table_insert = async function () { - c.as(userOperation) + c.as(smUser) try { - if (userOperation.address != owner.address) { - myContract.methods.insert(owner.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField - Gas: 500000, + // if (userOperation.address != owner.address) { + myContract.methods.insert(smRoot.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + Gas: 5000000, expect: "db_success" }, (err, res) => { err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); }); - } - else { - myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField - Gas: 500000, - expect: "db_success" - }, (err, res) => { - err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); - }); - } + // } + // else { + // myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + // Gas: 500000, + // expect: "db_success" + // }, (err, res) => { + // err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); + // }); + // } } catch (error) { console.log(error); } @@ -370,9 +397,10 @@ var table_get = async function () { // console.log(" record with fields:", lll); } var table_transaction = async function () { - c.as(owner) + c.as(smUser) + c.use(smRoot.address) try { - myContract.methods.sqlTransaction(sTableName).submit({ + myContract.methods.sqlTransaction(smRoot.address,sTableName).submit({ Gas: 500000, expect: "validate_success" }, (err, res) => { diff --git a/test/testTable.js b/test/testTable.js index 1211925..da6e1c1 100644 --- a/test/testTable.js +++ b/test/testTable.js @@ -3,9 +3,10 @@ const ChainsqlAPI = require('../src/index'); const c = new ChainsqlAPI(); var root = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" -}; + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + var owner = { address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", @@ -23,9 +24,22 @@ var user2 = { secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" } +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", + publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9U…txxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' +} + + +const smUser7 ={ + secret:"pwRdHmA4cSUKKtFyo4m2vhiiz5g6ym58Noo9dTsUU97mARNjevj", + address: "zMXMtS2C36J1p3uhTxRFWV8pEhHa8AMMSL", + publicKey: "pYvXDbsUUr5dpumrojYApjG8nLfFMXhu3aDvxq5oxEa4ZSeyjrMzisdPsYjfxyg9eN3ZJsNjtNENbzXPL89st39oiSp5yucU" +} + var grantAddr = "0xzzzzzzzzzzzzzzzzzzzzBZbvji"; -var sTableName = "chainsqlTest"; +var sTableName = "hjkz9"; var sTableNameNew = "table_new" var tableRaw = [ { 'field': 'id', 'type': 'int' }, @@ -57,15 +71,76 @@ var tagStep = { table_update: 10, table_get: 11, table_transaction: 12 } +var wsAddr = 'ws://192.168.29.69:8006' + main(); async function main() { - let res = await c.connect('ws://127.0.0.1:6006'); + let res = await c.connect(wsAddr); console.log("connect successfully.") c.setRestrict(true); + //test + c.as(smRoot) + try{ + + var tableRaw = [ + { 'field': 'id', 'type': 'int', 'length': 100, 'PK': 1, 'NN': 1 }, + { 'field': 'name', 'type': 'varchar', 'length': 100 }, + { 'field': 'age', 'type': 'int' }, + { 'field': 'account', 'type': 'varchar', 'length': 40 } + ]; + + var rule = { + 'Insert': { + 'Condition': { 'account': '$account' }, //Condition:指定插入操作可设置的默认值 + 'Count': { 'AccountField': 'account', 'CountLimit': 5 } + }, + 'Delete': { + 'Condition': { 'account': '$account' } //只能删除自己插入的数据 + }, + 'Get': { + 'Condition': { 'id': { '$ge': 5 } } //只能查询id大于5的数据 + }, + 'Update': { + 'Fields': ['name'] //只能更新name字段 + } + }; + var option = { + confidential: false, + operationRule: rule + }; + + var lll; + // lll = await c.createTable(sTableName, tableRaw, option).submit({ expect: 'db_success' }); + // console.log(" createTable_operationRule", lll); + + // var insertRaw2 = [ + // { 'id': 1, 'name': 'zhangsan', 'age': 123 } + // ]; + + + // lll = await c.table(sTableName).insert(insertRaw2).submit({ expect: 'validate_success' }); + // console.log(" insert", lll); + + + var rs = await c.table(sTableName).get({ 'id': 1 }).delete().submit({ expect: 'db_success' }) + console.log("testDelete", rs) + }catch(e){ + + console.error(e) + } + + return ; + + + + + + + //t /**************************************/ - let nStep = tagStep.table_insert; + let nStep = tagStep.table_insert_operationRule; // userOperation = user; switch (nStep) { case tagStep.active: active(); break; @@ -99,27 +174,41 @@ var active = async function () { } var table_create = async function () { - c.as(owner) + c.as(smRoot) try { - let lll = await c.createTable(sTableName, tableRaw).submit({expect:"db_success"}); + var option = { + confidential: true + }; + let lll = await c.createTable(sTableName, tableRaw,option).submit({expect:"db_success"}); console.log(" createTable", sTableName, lll); } catch (error) { console.log(" createTable ", sTableName, error); } }; var table_create_operationRule = async function () { - c.as(owner) - var rule = { - 'Insert': { - 'Condition': { 'txHash': '$tx_hash' } //Condition:指定插入操作可设置的默认值 - } - }; - var option = { - confidential: false, - operationRule: rule - }; - let lll = await c.createTable(sTableName, tableRaw, option).submit({ expect: 'db_success' }); - console.log(" createTable_operationRule", lll); + + + try{ + c.as(smRoot) + var rule = { + 'Insert': { + 'Condition': { 'txHash': '$tx_hash' } //Condition:指定插入操作可设置的默认值 + } + }; + var option = { + confidential: false, + operationRule: rule + }; + let lll = await c.createTable(sTableName, tableRaw, option).submit({ expect: 'db_success' }); + console.log(" createTable_operationRule", lll); + + }catch(e){ + + console.error(e); + + } + + } var table_rename = async function () { c.as(owner) @@ -138,8 +227,9 @@ var table_drop = async function () { console.log(" dropTable", sTableName, lll); } var table_insert = async function () { - c.as(userOperation) - c.use(owner.address) + c.as(smRoot) + // c.as(userOperation) + // c.use(owner.address) try { let lll = await c.table(sTableName).insert(insertRaw, "txHash").submit({ expect: 'db_success' }); console.log(" insert", lll); @@ -148,8 +238,8 @@ var table_insert = async function () { } }; var table_insert_operationRule = async function () { - c.as(userOperation) - c.use(owner.address) + c.as(smRoot) + // c.use(owner.address) let lll = await c.table(sTableName).insert(insertRaw).submit({ expect: 'db_success' }); console.log(" insert", lll); } From 0c28ff1b210927b99b9b707c00e44107dcd4ca00 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 12 Oct 2020 14:54:11 +0800 Subject: [PATCH 08/53] upgrade version to 0.6.71 --- lib/error.js | 2 +- lib/util.js | 2 +- package.json | 2 +- src/index.js | 2 +- src/ripple.js | 2 +- src/smartContract.js | 2 +- src/submit.js | 2 +- src/tablePayment.js | 2 +- src/txPayment.js | 2 +- test/server.js | 2 +- test/test.js | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/error.js b/lib/error.js index 32fdb44..cd1ae33 100644 --- a/lib/error.js +++ b/lib/error.js @@ -1,6 +1,6 @@ "use strict"; -const chainsqldError = require('chainsql-lib').ChainsqlLibCommon.errors.ChainsqldError; +const chainsqldError = require('chainsql-lib-test').ChainsqlLibCommon.errors.ChainsqldError; function chainsqlError( errMsg ) { let errName = "apiGeneralErr"; diff --git a/lib/util.js b/lib/util.js index abb0861..3b6d65e 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,6 +1,6 @@ 'use strict'; const path = require('path'); -const common = require('chainsql-lib').ChainsqlLibCommon; +const common = require('chainsql-lib-test').ChainsqlLibCommon; const keypairs = require('chainsql-keypairs-test'); const cryptoo = require('crypto'); const crypto = require('./crypto'); diff --git a/package.json b/package.json index 10a3503..1453622 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs-test": "^0.10.16", - "chainsql-lib": "^0.17.44", + "chainsql-lib-test": "^0.17.52", "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", diff --git a/src/index.js b/src/index.js index 107cdd0..897ab6f 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ const keypairs = require('chainsql-keypairs-test'); const EventManager = require('./eventManager') const _ = require('lodash'); -const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); const chainsqlError = require('../lib/error'); diff --git a/src/ripple.js b/src/ripple.js index 93353e0..777d3cf 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -2,7 +2,7 @@ var util = require('../lib/util'); var Submit = require('./submit'); const FloatOperation = require('../lib/floatOperation'); -var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { diff --git a/src/smartContract.js b/src/smartContract.js index 862acaa..0ec476e 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -3,7 +3,7 @@ var util = require('../lib/util'); const _ = require('lodash'); -var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; const keypairs = require('chainsql-keypairs-test'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); diff --git a/src/submit.js b/src/submit.js index 46cc813..a052bb5 100644 --- a/src/submit.js +++ b/src/submit.js @@ -1,6 +1,6 @@ 'use strict' var util = require('../lib/util'); -const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; const Connection = require('./connect'); class Submit { diff --git a/src/tablePayment.js b/src/tablePayment.js index c938ef9..50ba7b2 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -4,7 +4,7 @@ var _ = require('lodash'); const path = require('path'); const getTxJson = require('../lib/util').getTxJson; const calcFee = require('../lib/util').calcFee; -var utils = require('chainsql-lib').ChainsqlLibUtil; +var utils = require('chainsql-lib-test').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; diff --git a/src/txPayment.js b/src/txPayment.js index 09c4951..8eb7343 100644 --- a/src/txPayment.js +++ b/src/txPayment.js @@ -2,7 +2,7 @@ var _ = require('lodash'); const path = require('path'); -var utils = require('chainsql-lib').ChainsqlLibUtil; +var utils = require('chainsql-lib-test').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; diff --git a/test/server.js b/test/server.js index 96f1f62..9d95924 100644 --- a/test/server.js +++ b/test/server.js @@ -5,7 +5,7 @@ const co = require('co') const ChainsqlAPI = require('../src/index'); const r = new ChainsqlAPI(); var path = require('path'); -var basePath = path.join(require.resolve('chainsql-lib'), '../common'); +var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); var common = require(basePath); var crypto = require('../lib/crypto'); const keypairs = require('chainsql-keypairs-test'); diff --git a/test/test.js b/test/test.js index 504423f..bf6e68d 100644 --- a/test/test.js +++ b/test/test.js @@ -7,7 +7,7 @@ const ChainsqlAPI = require('../src/index'); // ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); const c = new ChainsqlAPI(); -const RippleAPI = new require('chainsql-lib').RippleAPI; +const RippleAPI = new require('chainsql-lib-test').RippleAPI; var user = { secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", From f87e2f6e44db01fbd91d0fa03b1a3cf4f89175ef Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 23 Oct 2020 15:34:12 +0800 Subject: [PATCH 09/53] add schemaID parameter to the connection interface with the chainsql node --- solidity-example/solidity-TableTxs.sol | 9 ++++----- src/connect.js | 4 ++++ src/eventManager.js | 9 ++++++++- src/index.js | 8 ++++++++ src/ripple.js | 7 +++++++ src/submit.js | 2 -- src/tablePayment.js | 12 ++++++++++++ 7 files changed, 43 insertions(+), 8 deletions(-) diff --git a/solidity-example/solidity-TableTxs.sol b/solidity-example/solidity-TableTxs.sol index 506aebb..3bdc20e 100644 --- a/solidity-example/solidity-TableTxs.sol +++ b/solidity-example/solidity-TableTxs.sol @@ -85,12 +85,11 @@ contract DBTest { return msg.sender.grant(toWho, tableName, raw); } - function sqlTransaction(string tableName) public{ + function sqlTransaction(address owner,string tableName) public{ db.beginTrans(); - msg.sender.create(tableName, "[{\"field\":\"id\", \"type\" : \"int\", \"length\" : 11, \"PK\" : 1, \"NN\" : 1, \"UQ\" : 1}, { \"field\":\"account\", \"type\" : \"varchar\" }, { \"field\":\"age\", \"type\" : \"int\" }]"); - msg.sender.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); - msg.sender.deletex(tableName, "{\"id\":1}"); - msg.sender.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); + owner.insert(tableName, "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]"); + owner.deletex(tableName, "{\"id\":1}"); + owner.update(tableName, "{\"account\":\"id==2\"}", "{\"id\": 2}"); db.commit(); } diff --git a/src/connect.js b/src/connect.js index d0064f2..c5f279c 100644 --- a/src/connect.js +++ b/src/connect.js @@ -17,6 +17,10 @@ Connection.prototype.useCert = function(cert) { this.userCert = cert; } +Connection.prototype.setSchema = function(schemaID) { + this.schemaID = schemaID; +} + Connection.prototype.connect = function() { let that = this; return new Promise(function(resolve, reject) { diff --git a/src/eventManager.js b/src/eventManager.js index f3647ee..3c7012b 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -28,9 +28,16 @@ EventManager.prototype.subscribeTable = function(owner, name, cb) { }; EventManager.prototype.subscribeTx = function(id, cb) { var that = this; + + var schema_id = "" + if(that.chainsql.connect.schemaID !=undefined){ + schema_id = that.chainsql.connect.schemaID + } + var messageTx = { "command": "subscribe", - "transaction": id + "transaction": id, + schema_id: schema_id, }; if (!that.onMessage) { _onMessage(that); diff --git a/src/index.js b/src/index.js index cbbe08f..e91421b 100644 --- a/src/index.js +++ b/src/index.js @@ -1019,6 +1019,14 @@ ChainsqlAPI.prototype.prepareJson = function(){ }) } +/** + * 设置操作链的ID + * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; + */ +ChainsqlAPI.prototype.setSchema = function(schemaID){ + this.connect.setSchema(schemaID); +} + function callback(data, callback) { } diff --git a/src/ripple.js b/src/ripple.js index 93353e0..7fef145 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -73,6 +73,13 @@ Ripple.prototype.prepareJson = function () { txJson.source.maxAmount.value = (FloatOperation.accAdd(parseFloat(value), fee)).toString(); } } + + //self.connect + + if(self.ChainsqlAPI.connect.schemaID != undefined){ + self.ChainsqlAPI.api.schemaID = self.ChainsqlAPI.connect.schemaID; + } + self.ChainsqlAPI.api.preparePayment(self.ChainsqlAPI.connect.address, txJson, instructions) .then(function (data) { resolve(data); diff --git a/src/submit.js b/src/submit.js index 46cc813..9f45797 100644 --- a/src/submit.js +++ b/src/submit.js @@ -83,8 +83,6 @@ Submit.prototype.setCert = function () { } - - } }; diff --git a/src/tablePayment.js b/src/tablePayment.js index 39d7780..1b66b2a 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -81,11 +81,23 @@ function prepareTablePayment(payment, chainsqlApi) { } function prepareTable(ChainSQL, payment, resolve, reject) { + + if(ChainSQL.connect.schemaID != undefined){ + ChainSQL.api.schemaID = ChainSQL.connect.schemaID; + } + prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { // console.log(tx_json); getTxJson(ChainSQL, JSON.parse(tx_json.txJSON)).then(function (data) { var dropsPerByte = Math.ceil(1000000.0 / 1024);; + + + if(ChainSQL.ChainsqlAPI.connect.schemaID != undefined){ + ChainSQL.ChainsqlAPI.api.schemaID = ChainSQL.ChainsqlAPI.connect.schemaID ; + } + + ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ From d55643b341a39813a98229823785c60c2037f7aa Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 27 Oct 2020 18:24:24 +0800 Subject: [PATCH 10/53] add unit test code --- test/contract-tabletxs-test.js | 520 +++++++++++++++++++++++++++++++++ test/crypto-test.js | 63 ++++ test/gateway-test.js | 406 +++++++++++++++++++++++++ test/ripple-test.js | 73 +++++ test/server-test.js | 138 +++++++++ test/table-contract-test.js | 197 +++++++++++++ test/table-test.js | 192 ++++++++++++ 7 files changed, 1589 insertions(+) create mode 100644 test/contract-tabletxs-test.js create mode 100644 test/crypto-test.js create mode 100644 test/gateway-test.js create mode 100644 test/ripple-test.js create mode 100644 test/server-test.js create mode 100644 test/table-contract-test.js create mode 100644 test/table-test.js diff --git a/test/contract-tabletxs-test.js b/test/contract-tabletxs-test.js new file mode 100644 index 0000000..24597fa --- /dev/null +++ b/test/contract-tabletxs-test.js @@ -0,0 +1,520 @@ +'use strict' +const chai = require('chai'); +const assert = chai.assert; +const ChainsqlAPI = require('../src/index'); +const c = new ChainsqlAPI(); + +var root = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + +var owner = { + address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", + secret: "xnnUqirFepEKzVdsoBKkMf577upwT" +} + +var user = { + address: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv", + secret: "xnJn5J5uYz3qnYX72jXkAPVB3ZsER" +} +var userOperation = user; + +var user1 = { + address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", + secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" +} + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + +var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; +var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; + +var sTableName = "n1"; +var sTableNameNew = "table_new" +var rawTable = "[ \ + { \"field\": \"id\", \"type\": \"int\" }, \ + { \"field\": \"time\", \"type\": \"datetime\" }, \ + { \"field\": \"txHash\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"name\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"email\", \"type\": \"varchar\", \"length\": 100 }, \ + { \"field\": \"account\", \"type\": \"varchar\", \"length\": 40 } \ +]"; + +var rawInsert = "[ \ + { \"id\": 11, \"name\": \"zhangsan\", \"email\": \"123\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 22, \"name\": \"lisi\", \"email\": \"124\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 33, \"name\": \"wangwu\", \"email\": \"125\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" }, \ + { \"id\": 44, \"name\": \"zhaoliu\", \"email\": \"126\", \"account\": \"zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt\", \"time\": \"2018-10-18 14:31:00\" } \ +]"; + +var rawDelete = "{\"id\":1}" +var rawUpdate = "{ \"account\": \"134\" }" +var rawGet = "{\"id\": 2}" + + +var myContract; +var contractAddr; +const abi = '[{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"create","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"rawUpdate","type":"string"},{"name":"rawGet","type":"string"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"drop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"insert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"toWho","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"grant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"}],"name":"sqlTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"tableNameNew","type":"string"}],"name":"rename","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"tableName","type":"string"},{"name":"raw","type":"string"},{"name":"field","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tableName","type":"string"},{"name":"raw","type":"string"}],"name":"deletex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'; +const deployBytecode = '0x608060405234801561001057600080fd5b50611f58806100206000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306e63ff8146100ca578063198e2b8a1461022957806331445f171461038857806331c3e4561461059e5780635310b551146107945780636c02d6921461085c578063746ecd69146109db5780638b0a4ee114610b5a57806391025cb114610cd957806399489c2114610da15780639c7c722b14610f99578063cf22eb59146110f8578063ea0f5b7a14611387575b600080fd5b3480156100d657600080fd5b50610227600480360360408110156100ed57600080fd5b810190808035906020019064010000000081111561010a57600080fd5b82018360208201111561011c57600080fd5b8035906020019184600183028401116401000000008311171561013e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460018302840111640100000000831117156101d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506114e6565b005b34801561023557600080fd5b506103866004803603604081101561024c57600080fd5b810190808035906020019064010000000081111561026957600080fd5b82018360208201111561027b57600080fd5b8035906020019184600183028401116401000000008311171561029d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561030057600080fd5b82018360208201111561031257600080fd5b8035906020019184600183028401116401000000008311171561033457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061152d565b005b34801561039457600080fd5b5061059c600480360360808110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103e857600080fd5b8201836020820111156103fa57600080fd5b8035906020019184600183028401116401000000008311171561041c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460018302840111640100000000831117156104b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561051657600080fd5b82018360208201111561052857600080fd5b8035906020019184600183028401116401000000008311171561054a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611574565b005b3480156105aa57600080fd5b50610792600480360360608110156105c157600080fd5b81019080803590602001906401000000008111156105de57600080fd5b8201836020820111156105f057600080fd5b8035906020019184600183028401116401000000008311171561061257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561067557600080fd5b82018360208201111561068757600080fd5b803590602001918460018302840111640100000000831117156106a957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561070c57600080fd5b82018360208201111561071e57600080fd5b8035906020019184600183028401116401000000008311171561074057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506115c8565b005b3480156107a057600080fd5b5061085a600480360360208110156107b757600080fd5b81019080803590602001906401000000008111156107d457600080fd5b8201836020820111156107e657600080fd5b8035906020019184600183028401116401000000008311171561080857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061161b565b005b34801561086857600080fd5b506109d96004803603606081101561087f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111640100000000831117156108f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561095357600080fd5b82018360208201111561096557600080fd5b8035906020019184600183028401116401000000008311171561098757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611656565b005b3480156109e757600080fd5b50610b58600480360360608110156109fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b80359060200191846001830284011164010000000083111715610a6f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ad257600080fd5b820183602082011115610ae457600080fd5b80359060200191846001830284011164010000000083111715610b0657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061169e565b005b348015610b6657600080fd5b50610cd760048036036060811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610bba57600080fd5b820183602082011115610bcc57600080fd5b80359060200191846001830284011164010000000083111715610bee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c5157600080fd5b820183602082011115610c6357600080fd5b80359060200191846001830284011164010000000083111715610c8557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116e6565b005b348015610ce557600080fd5b50610d9f60048036036020811015610cfc57600080fd5b8101908080359060200190640100000000811115610d1957600080fd5b820183602082011115610d2b57600080fd5b80359060200191846001830284011164010000000083111715610d4d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611731565b005b348015610dad57600080fd5b50610f1e60048036036060811015610dc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e0157600080fd5b820183602082011115610e1357600080fd5b80359060200191846001830284011164010000000083111715610e3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e9857600080fd5b820183602082011115610eaa57600080fd5b80359060200191846001830284011164010000000083111715610ecc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061195e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f5e578082015181840152602081019050610f43565b50505050905090810190601f168015610f8b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fa557600080fd5b506110f660048036036040811015610fbc57600080fd5b8101908080359060200190640100000000811115610fd957600080fd5b820183602082011115610feb57600080fd5b8035906020019184600183028401116401000000008311171561100d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561107057600080fd5b82018360208201111561108257600080fd5b803590602001918460018302840111640100000000831117156110a457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b48565b005b34801561110457600080fd5b5061130c6004803603608081101561111b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561115857600080fd5b82018360208201111561116a57600080fd5b8035906020019184600183028401116401000000008311171561118c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156111ef57600080fd5b82018360208201111561120157600080fd5b8035906020019184600183028401116401000000008311171561122357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561128657600080fd5b82018360208201111561129857600080fd5b803590602001918460018302840111640100000000831117156112ba57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b8f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561134c578082015181840152602081019050611331565b50505050905090810190601f1680156113795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561139357600080fd5b506114e4600480360360408110156113aa57600080fd5b81019080803590602001906401000000008111156113c757600080fd5b8201836020820111156113d957600080fd5b803590602001918460018302840111640100000000831117156113fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561145e57600080fd5b82018360208201111561147057600080fd5b8035906020019184600183028401116401000000008311171561149257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d12565b005b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611528573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c094505050505015801561156f573d6000803e3d6000d15b505050565b8373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc596505050505050501580156115c1573d6000803e3d6000d15b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cc59650505050505050158015611615573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1681805190602001818184c192505050158015611652573d6000803e3d6000d15b5050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c3945050505050158015611698573d6000803e3d6000d15b50505050565b8273ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c49450505050501580156116e0573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1683838051906020018480519060200181818585888ac79550505050505015801561172b573d6000803e3d6000d15b50505050565bc83373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f5b7b226163636f756e74223a227a55343279445733667a466a47576f7364655681526020017f6a566173795073463459486a323234222c20226964223a31317d2c207b22616381526020017f636f756e74223a227a55343279445733667a466a47576f736465566a5661737981526020017f5073463459486a323234222c202020226964223a31327d5d00000000000000008152506078019050604051809103908181016040528181858588c394505050505015801561181a573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226964223a317d0000000000000000000000000000000000000000000000008152506008019050604051809103908181016040528181858588c4945050505050158015611891573d6000803e3d6000d15b503373ffffffffffffffffffffffffffffffffffffffff168180519060200160405180807f7b226163636f756e74223a2269643d3d32227d0000000000000000000000000081525060130190506040518091039081810160405260405180807f7b226964223a20327d00000000000000000000000000000000000000000000008152506009019050604051809103908181016040528181858589898cc59650505050505050158015611947573d6000803e3d6000d15b50c915801561195a573d6000803e3d6000d15b5050565b606060008473ffffffffffffffffffffffffffffffffffffffff1684805190602001858051906020018181858588c6945050505050905060008114151515611a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050600082cb9050606060008090505b83811015611b395760008090505b83811015611aea576060868383808284d0602001806040519081016040528181848688cd9450505050509050611a8c8482611d59565b93506001850382141515611adc57611ad9846040805190810160405280600281526020017f2c20000000000000000000000000000000000000000000000000000000000000815250611d59565b93505b508080600101915050611a56565b50611b2a826040805190810160405280600281526020017f3b0a000000000000000000000000000000000000000000000000000000000000815250611d59565b91508080600101915050611a48565b50809450505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c2945050505050158015611b8a573d6000803e3d6000d15b505050565b606060008573ffffffffffffffffffffffffffffffffffffffff1685805190602001868051906020018181858588c6945050505050905060008114151515611c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f476574207461626c652064617461206661696c65642c6d61796265207573657281526020017f206e6f7420617574686f72697a6564210000000000000000000000000000000081525060400191505060405180910390fd5b600081ca9050606060008090505b82811015611d0357606084828880519060200181818486cf6020018060405190810160405281818585888acc955050505050509050611cb28382611d59565b9250611cf3836040805190810160405280600181526020017f3b00000000000000000000000000000000000000000000000000000000000000815250611d59565b9250508080600101915050611c73565b50809350505050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1682805190602001838051906020018181858588c4945050505050158015611d54573d6000803e3d6000d15b505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611d9d5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8551811015611e63578581815181101515611dc757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e2657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611db0565b5060008090505b8451811015611f1d578481815181101515611e8157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611ee057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611e6a565b508195505050505050929150505600a165627a7a723058200b0dbd97123f4e63cdd05fb7f53186505f6425bd763465b61c74dc7f7a282eeb0029'; +//solidity code: solidity-example/solidity-TableTxs.sol + +var tagStep = { + active: 1, table_create: 2, table_create_operationRule: 3, + table_rename: 4, table_grant: 5, table_drop: 6, + table_insert: 7, table_insert_operationRule: 8, table_delete: 9, + table_update: 10, table_get: 11, table_transaction: 12, deployContract: 13 +} + +var wsAddress = 'ws://192.168.29.69:5003'; + +describe('contract table txs', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(smRoot); + }) + + it('active', async function(){ + + var amount = 2000 + let res = await c.pay(smUser.address, amount).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + + }) + + it('deployContract', async function(){ + + this.timeout(5000) + myContract = c.contract(JSON.parse(abi)); + let deployRes = await myContract.deploy( + { + ContractData: deployBytecode, + }).submit({ + Gas: '5000000', + }); + + assert.hasAllKeys(deployRes, ['status', 'tx_hash','contractAddress']) + assert.equal(deployRes.status,'validate_success') + + contractAddr = deployRes.contractAddress + }) + + it('create table', async function(){ + + //发交易调用合约 + let res = await myContract.methods.create(sTableName, rawTable).submit({ + Gas: 500000, + expect: "db_success" + }); + + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'db_success') + }) + + it('table insert', async function(){ + + // if (userOperation.address != owner.address) { + // let res = await myContract.methods.insert(owner.address, sTableName, rawInsert/*, "txHash"*/).submit({ + // Gas: 500000, + // expect: "db_success" + // }) + + // assert.hasAllKeys(res, ['status', 'tx_hash']) + // assert.equal(res.status,'db_success') + // } + // else { + let res = await myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + Gas: 500000, + expect: "db_success" + }) + + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'db_success') + //} + }) + + it('table grant', async function(){ + + // c.as(smRoot) + let res = await myContract.methods.grant(smUser.address, sTableName, flag).submit({ + Gas: 500000, + expect: "validate_success" + }) + + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'validate_success') + }) + + + // it('table insert', async function(){ + + // c.as(smUser) + // let res = await myContract.methods.insert(smRoot.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + // Gas: 500000, + // expect: "db_success" + // }) + + // assert.hasAllKeys(res, ['status', 'tx_hash']) + // assert.equal(res.status,'db_success') + + // // c.as(smRoot) + // // res = await myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField + // // Gas: 500000, + // // expect: "db_success" + // // }) + + // // assert.hasAllKeys(res, ['status', 'tx_hash']) + // // assert.equal(res.status,'db_success') + + // }) + + + it('table drop', async function(){ + + // c.as(owner) + let res = await myContract.methods.drop(sTableName).submit({ + Gas: 500000, + expect: "validate_success" + }); + assert.hasAllKeys(res, ['status', 'tx_hash']) + assert.equal(res.status,'validate_success') + }) + + +}) + + + + +// main(); +// async function main() { +// let res = await c.connect(wsAddress); +// console.log(" connect successfully.") +// c.setRestrict(true); + + +// /**************************************/ +// // userOperation = user; +// const contractAddr = "zEyJTYupmFGo3tWCts8uyzmkkmjJAwgS2u"; +// let nStep = tagStep.deployContract; +// // sTableName = sTableNameNew; +// // +// if (nStep != tagStep.active && nStep != tagStep.deployContract) { +// myContract = c.contract(JSON.parse(abi), contractAddr); +// } +// switch (nStep) { +// case tagStep.active: active(); break; +// case tagStep.deployContract: deployContract(); break; +// case tagStep.table_create: table_create(); break; +// case tagStep.table_create_operationRule: table_create_operationRule(); break; +// case tagStep.table_rename: table_rename(); break; +// case tagStep.table_grant: table_grant(); break; +// case tagStep.table_drop: table_drop(); break; +// case tagStep.table_insert: table_insert(); break; +// case tagStep.table_insert_operationRule: table_insert_operationRule(); break; +// case tagStep.table_delete: table_delete(); break; +// case tagStep.table_update: table_update(); break; +// case tagStep.table_get: table_get(); break; +// case tagStep.table_transaction: table_transaction(); break; +// default: break; +// } +// /**************************************/ +// } + +// async function deployContract() { +// c.as(owner) +// myContract = c.contract(JSON.parse(abi)); +// try { +// let deployRes = await myContract.deploy( +// { +// ContractData: deployBytecode, +// }).submit({ +// Gas: '5000000', +// // ContractValue: "10000000", +// }); +// console.log(" deployContract Res:", deployRes); +// if (deployRes.contractAddress != "undefined") { +// console.log(" contractAddress:", deployRes.contractAddress); +// } +// } catch (error) { +// console.log(error); +// } +// } + +// var active = async function () { +// c.as(root); +// var amount = 20000 +// console.log("----------- active >>>>>>>>>>>>>"); +// let res = await c.pay(owner.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n owner", owner.address, ":", res) +// res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n user", user.address, ":", res) +// res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n user1", user1.address, ":", res) +// console.log("\n----------- active <<<<<<<<<<<<<"); +// } + +// var table_create = async function () { +// c.as(owner) +// //发交易调用合约 +// try { +// myContract.methods.create(sTableName, rawTable).submit({ +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); +// }); +// /* +// //不发交易调用合约 +// myContract.methods.create(sTableName, rawTable).call({ +// Gas: 500000 +// }, (err, res) => { +// err ? console.log(" CreateTable res:", err) : console.log(" CreateTable res:", res); +// }); +// // */ +// } catch (error) { +// console.log(error); +// } +// } +// var table_create_operationRule = async function () { +// console.log(" no support in this version") +// /* +// c.as(owner) +// var rule = { +// 'Insert': { +// 'Condition': { 'txHash': '$tx_hash' } //Condition:指定插入操作可设置的默认值 +// } +// }; +// var option = { +// confidential: false, +// operationRule: rule +// }; +// try { +// myContract.methods.create(sTableName, rawTable, option).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" CreateTable operationRule res:", err) : console.log(" CreateTable operationRule res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// // */ +// } +// var table_rename = async function () { +// c.as(owner) +// try { +// myContract.methods.rename(sTableName, sTableNameNew).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" renameTable res:", err) : console.log(" renameTable res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } +// var table_grant = async function () { +// c.as(owner) +// try { +// myContract.methods.grant(grantAddr, sTableName, flag).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" grant res:", err) : console.log(" grant res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } +// var table_drop = async function () { +// c.as(owner) +// try { +// myContract.methods.drop(sTableName).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" dropTable res:", err) : console.log(" dropTable res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } +// var table_insert = async function () { +// c.as(userOperation) +// try { +// if (userOperation.address != owner.address) { +// myContract.methods.insert(owner.address, sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// }); +// } +// else { +// myContract.methods.insert(sTableName, rawInsert/*, "txHash"*/).submit({ //no support autoFillField +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// }); +// } +// } catch (error) { +// console.log(error); +// } +// } +// var table_insert_operationRule = async function () { +// console.log(" no support in this version") +// // c.as(userOperation) +// // try { +// // if(userOperation.address != owner.address) +// // { +// // myContract.methods.insert(owner.address, sTableName, rawInsert).submit({ //no support autoFillField +// // Gas: 500000, +// // expect: "validate_success" +// // }, (err, res) => { +// // err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// // }); +// // } +// // else{ +// // myContract.methods.insert(sTableName, rawInsert).submit({ //no support autoFillField +// // Gas: 500000, +// // expect: "validate_success" +// // }, (err, res) => { +// // err ? console.log(" insert res:", err) : console.log(" dropTable res:", res); +// // }); +// // } +// // } catch (error) { +// // console.log(error); +// // } +// } +// var table_delete = async function () { +// c.as(userOperation) +// try { +// if (userOperation.address != owner.address) { +// myContract.methods.deletex(owner.address, sTableName, rawDelete).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" deletex res:", err) : console.log(" deletex res:", res); +// }); +// } +// else { +// myContract.methods.deletex(sTableName, rawDelete).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" deletex res:", err) : console.log(" deletex res:", res); +// }); +// } +// } catch (error) { +// console.log(error); +// } +// } +// function tableUpdate(i) { +// try { +// var arrayRawUpdate = [ +// "{ \"account\": \"update id==2\" }", +// "{ \"account\": \"update email==123\" }", +// "{ \"account\": \"update email == 126 || name == wangwu\" }", +// "{ \"account\": \"update email == 124 && name == lisi\" }", +// // "{ \"account\": \"update all\" }", +// ] +// var arrayRawGet = [ +// "{\"id\": 2}", +// "{\"email\": \"123\"}", +// "{ \"email\": \"126\" }, { \"name\": \"wangwu\" }", //{ $or: [{ \"email\": \"126\" }, { \"name\": \"wangwu\" }] } +// "{ \"email\": \"124\" , \"name\": \"lisi\" }", //{ $and: [{ \"email\": \"124\" }, { \"name\": \"lisi\" }] } +// // "", //C++ dispose 2 avoid update all, so no support update a table without a WHERE that uses a KEY column +// ] +// let length = arrayRawGet.length; +// if (i < length) { +// rawUpdate = arrayRawUpdate[i]; +// rawGet = arrayRawGet[i]; +// if (userOperation.address != owner.address) { +// myContract.methods.update(owner.address, sTableName, rawUpdate, rawGet).submit({ +// Gas: 500000, +// expect: "db_success" +// }, (err, res) => { +// if (err) { +// console.log(" update", i, err); +// } +// else { +// console.log(" update", i, res); +// tableUpdate(i + 1); +// } +// }); +// } +// else { +// myContract.methods.update(sTableName, rawUpdate, rawGet).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// if (err) { +// console.log(" update", i, err); +// } +// else { +// console.log(" update", i, res); +// tableUpdate(i + 1); +// } +// }); +// } +// } +// } catch (error) { +// console.log(error); +// } +// } +// var table_update = async function () { +// c.as(userOperation) +// tableUpdate(0); +// } +// var table_get = async function () { +// c.as(owner) +// try { +// myContract.methods.get(owner.address, sTableName, "").call((err, str) => { +// err ? console.log(" get handle err:", err) : console.log(" get:", str); +// }); +// var str = await myContract.methods.get(owner.address, sTableName, "", "name").call(); +// console.log(" get with field:", str); +// } catch (error) { +// console.log(error) +// } +// // myContract.methods.table(sTableName).get().submit(); +// // console.log(" all record:", lll); +// // myContract.methods.table(sTableName).get({ $or: [{ email: "123" }, { name: "zhangsan" }] }).submit(); +// // console.log(" record (or)", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).submit(); +// // console.log(" regex record:", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["COUNT(*) as count"]).submit(); +// // console.log(" record count:", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields([]).submit(); +// // console.log(" record count:", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).limit({ index: 0, total: 1 }).withFields([]).submit(); +// // console.log(" record count(limit):", lll); +// // myContract.methods.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["account"]).submit(); +// // console.log(" record with fields:", lll); +// } +// var table_transaction = async function () { +// c.as(owner) +// try { +// myContract.methods.sqlTransaction(sTableName).submit({ +// Gas: 500000, +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(" transaction res:", err) : console.log(" transaction res:", res); +// }); +// } catch (error) { +// console.log(error); +// } +// } + diff --git a/test/crypto-test.js b/test/crypto-test.js new file mode 100644 index 0000000..680429c --- /dev/null +++ b/test/crypto-test.js @@ -0,0 +1,63 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); + +const c = new ChainsqlAPI(); + +function hex2a(hexx) { + var hex = hexx.toString();//force conversion + var str = ''; + for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2) + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + return str; +} + + +describe('crypto', () => { + + it('eciesEncrypt', async function(){ + + var wallet = c.generateAddress() + var msg = "hello world" + var cipher = c.eciesEncrypt(msg,wallet.publicKey) + var plainTxt = c.eciesDecrypt(cipher,wallet.secret); + assert.equal(msg,plainTxt.toString()) + }) + + + + it('eciesEncrypt', async function(){ + + var wallet = c.generateAddress() + var msg = "hello world" + var cipher = c.eciesEncrypt(msg,wallet.publicKey) + var plainTxt = c.eciesDecrypt(cipher,wallet.secret) + assert.equal(msg,plainTxt.toString()) + }) + + + it('symEncrypt && symDecrypt', async function(){ + + var msg = "hello world" + var symKey = "1111111111111111"; + var cipher = c.symEncrypt(symKey,msg) + var plainText = c.symDecrypt(symKey,cipher) + assert.equal(msg,plainText) + var cipherGM = c.symEncrypt(symKey,msg,"softGMAlg") + + var plainTextGM = c.symDecrypt(symKey,cipherGM,"softGMAlg") + assert.equal(msg,hex2a(plainTextGM)) + }) + + it('asymEncrypt && asymDecrypt', async function(){ + + var accountInfo = c.generateAddress({algorithm:"softGMAlg"}) + var msg = "hello world" + + var cipher = c.asymEncrypt(msg,accountInfo.publicKey) + var plainText = c.asymDecrypt(cipher,accountInfo.secret) + assert.equal(msg,hex2a(plainText)) + }) + +}) diff --git a/test/gateway-test.js b/test/gateway-test.js new file mode 100644 index 0000000..68be548 --- /dev/null +++ b/test/gateway-test.js @@ -0,0 +1,406 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); + +const c = new ChainsqlAPI(); + +function hex2a(hexx) { + var hex = hexx.toString();//force conversion + var str = ''; + for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2) + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + return str; +} + +var sCurrency = "aaa" + +var wsAddress = 'ws://192.168.29.69:5003'; + +var smRoot = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + +describe('gateway', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(smRoot); + }) + + + it('active', async function(){ + var amount = 20000 + let res = await c.pay(smUser.address, amount).submit({expect:'validate_success'}); + assert.equal(res.status,'validate_success') + }) + + it('init gateway', async function(){ + + var opt = { + enableRippling: true, + rate: 1.002, + min: 1, + max: 1.5 + } + + let res = await c.accountSet(opt).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + + }) + + it('trustSet gateway', async function(){ + + var amount = { + value: 30000, + currency: sCurrency, + issuer: smRoot.address + } + + c.as(smUser); + let res = await c.trustSet(amount).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + + }) + + it('payment gateway', async function(){ + + var amount = { + value: 50, + currency: sCurrency, + issuer: smRoot.address + } + + c.as(smRoot); + let res = await c.pay(smUser.address, amount).submit({ expect: 'validate_success' }) + assert.equal(res.status,'validate_success') + }) + + +}) + + + + +// 'use strict' +// const ChainsqlAPI = require('chainsql'); +// const c = new ChainsqlAPI(); + +// var root = { +// secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", +// address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +// } + +// var issuer = { +// secret: "xxXvas5HTwVwjpmGNLQDdRyYe2H6t", +// address: "z4ypskpHPpMDtHsZvFHg8eDEdTjQrYYYV6" +// } + +// var user = { +// address: "zpMZ2H58HFPB5QTycMGWSXUeF47eA8jyd4", +// secret: "xnnUqirFepEKzVdsoBKkMf577upwT" +// } + +// var user1 = { +// address: "zKQwdkkzpUQC9haHFEe2EwUsKHvvwwPHsv", +// secret: "xnJn5J5uYz3qnYX72jXkAPVB3ZsER" +// } +// var user2 = { +// address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", +// secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" +// } +// var user3 = { +// address: "zU42yDW3fzFjGWosdeVjVasyPsF4YHj224", +// secret: "xncmqYJG4P9iyaYUf6T81GHs9W1kn" +// } + +// var tagStep = { +// active: 1, gateWay: 2, escrow: 3, +// balances: 4, getLedger: 5, getTxs: 6 +// } +// var sCurrency = "aaa" + + +// var root = { +// secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", +// address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", +// publicKey: "pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM" +// } + +// const smUser2 = { +// secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", +// address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", +// publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +// //cBPfBDz4jW5vxCLdyuaQNJTEFnjTBFc7DVZjdbwjirABD6HUjZUj +// }; + + + +// main(); +// async function main() { +// // let res = await c.connect('ws://101.201.40.124:5006'); +// await c.connect('ws://127.0.0.1:6005'); + +// c.as(root); +// c.setRestrict(true); +// /**************************************/ +// //测试步骤 +// // let nStep = tagStep.active; +// // let nStep = tagStep.gateWay; +// // let nStep = tagStep.escrow; +// // let nStep = tagStep.balances; +// // let nStep = tagStep.getLedger; +// let nStep = tagStep.gateWay; + +// switch (nStep) { +// case tagStep.active: testActive(); break;// 激活若干账户 +// case tagStep.gateWay: testGateWay2(); break;//部署网管,信任,发行币转账 +// case tagStep.escrow: testEscrow(); break; +// case tagStep.balances: testBalances(); break;//账户余额 +// case tagStep.getTxs: testTransactions(); break; +// case tagStep.getLedger: testGetLedger(); break; +// default: break; +// } +// /**************************************/ +// } + +// var testActive = async function () { +// var amount = 20000 +// console.log("----------- active >>>>>>>>>>>>>"); +// let res = await c.pay(issuer.address, amount).submit({ expect: 'validate_success' }) +// console.log(" active issuer", issuer.address, ":", res) +// res = await c.pay(user.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user", user.address, ":", res) +// res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user1", user1.address, ":", res) +// res = await c.pay(user2.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user2", user2.address, ":", res) +// res = await c.pay(user3.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n active user3", user3.address, ":", res) +// console.log("\n----------- active <<<<<<<<<<<<<"); +// } + + +// var testGateWay2 = async function () { + +// try{ + +// let res; +// console.log("----------- GateWay2 >>>>>>>>>>>>>"); +// var opt = { +// enableRippling: true, +// rate: 1.002, +// min: 1, +// max: 1.5 +// } +// c.as(root); +// res = await c.accountSet(opt).submit({ expect: 'validate_success' }); +// console.log("\n accountSet issuer", root.address, ":", res) +// // +// var amount = { +// value: 30000, +// currency: sCurrency, +// issuer: issuer.address +// } + +// // +// c.as(smUser2); +// res = await c.trustSet(amount).submit({ expect: 'validate_success' }); +// console.log("\n trustSet smUser2", user.address, ":", res) + + +// c.as(root); +// amount.value = 10000; +// res = await c.pay(smUser2.address, amount).submit({ expect: 'validate_success' }) + +// console.log("\n transfer currency(root 2 smUser2)", root.address, smUser2.address, ":", res) + +// console.log("\n----------- GateWay <<<<<<<<<<<<<"); + +// }catch(e){ + +// console.error(e) +// } + + +// } + + +// var testGateWay = async function () { +// let res; +// console.log("----------- GateWay >>>>>>>>>>>>>"); +// var opt = { +// enableRippling: true, +// rate: 1.002, +// min: 1, +// max: 1.5 +// } +// c.as(issuer); +// res = await c.accountSet(opt).submit({ expect: 'validate_success' }); +// console.log("\n accountSet issuer", issuer.address, ":", res) +// // +// var amount = { +// value: 30000, +// currency: sCurrency, +// issuer: issuer.address +// } +// // +// c.as(user); +// res = await c.trustSet(amount).submit({ expect: 'validate_success' }); +// console.log("\n trustSet user", user.address, ":", res) +// c.as(root); +// res = await c.trustSet(amount).submit({ expect: 'validate_success' }); +// console.log("\n trustSet user1", user1.address, ":", res) +// // +// res = await c.api.getTrustlines(issuer.address); +// console.log("\n getTrustlines issuer", issuer.address, ":", res) + + + +// try{ +// c.as(issuer); + +// amount.value = 10; + +// res = await c.pay(root.address, amount).submit({ expect: 'validate_success'}) +// }catch(e){ +// console.error(e) + +// } + + +// console.log("\n transfer currency(issuer 2 user)", issuer.address, user.address, ":", res) +// c.as(user); +// amount.value = 10000; +// res = await c.pay(user1.address, amount).submit({ expect: 'validate_success' }) +// console.log("\n transfer currency(user 2 user1)", user.address, user1.address, ":", res) +// console.log("\n----------- GateWay <<<<<<<<<<<<<"); +// } + +// var testEscrow = async function () { +// console.log("----------- Escrow >>>>>>>>>>>>>"); +// let res; +// // var amount = "1000"; +// var amount = 1000; +// var amount = { +// value: 1000, +// currency: sCurrency, +// issuer: issuer.address +// } +// // +// let bCreate = false; +// let bFinish = false; +// let bCancel = true; +// // +// let nSeq = 11; +// if (bCreate) { +// c.as(user); +// var opt = { +// dateFormatTMFinish:"2018-10-26 15:49:00", +// dateFormatTMCancel:"2018-10-26 15:50:00" +// } +// res = await c.escrowCreate(user1.address, amount, opt).submit({ expect: 'validate_success' }); +// console.log("\n escrowCreate :", res) +// let res1 = await c.getTransaction(res.tx_hash); +// console.log("\n txDetail", res.tx_hash, ":", res1,"\nseq:",res1.sequence) +// nSeq = res1.sequence; +// } +// if (bFinish) { +// c.as(user1) +// res = await c.escrowExecute(user.address, nSeq).submit({ expect: 'validate_success' }); +// console.log("\n escrowExecute :", res) +// } +// if (bCancel) { +// c.as(user) +// res = await c.escrowCancel(user.address, nSeq).submit({ expect: 'validate_success' }); +// console.log("\n escrowCancel :", res) +// } +// console.log("\n----------- Escrow <<<<<<<<<<<<<"); +// } + +// var testBalances = async function () { +// let res = await c.api.getBalances(user.address); +// console.log(" ", user.address, "balances:", res); +// //issue coin +// var options = { +// currency: sCurrency +// }; +// res = await c.api.getBalances(user1.address, options); +// if (res.length > 0) { +// console.log(" issue", sCurrency, "coin balance:", res[0]); +// // console.log(" balance:", res[0].value); +// } +// //sys coin +// var options = { +// currency: "ZXC" +// }; +// res = await c.api.getBalances(user1.address, options); +// if (res.length > 0) { +// console.log(" system coin balances:", res[0]); +// // console.log(" balance:", res[0].value); +// } +// } + +// var testTransactions = async function () { +// let res; +// // +// let bAll_one = true; +// let bMore = true; +// // +// if (bAll_one) { +// res = await c.api.getTransactions(root.address); +// console.log(" Txs:", res); +// // +// if (res.length > 0) { +// let id = res[0].id; +// res = await c.api.getTransaction(id); +// console.log(" Tx", id, ":", res); +// } +// } +// // +// if (bMore) { +// let nLimit = 10; +// var options = { +// limit: nLimit +// }; +// while (true) { +// res = await c.api.getTransactions(root.address, options); +// if (res.length > 0) { +// console.log(" Txs:", res); +// } +// if (res.length < 1 || res.length != nLimit) { +// break; +// } +// options.start = res[nLimit - 1].id; +// } +// } +// } + +// var testGetLedger = async function () { +// let llll = await c.api.getLedgerVersion(); +// llll = await c.api.getLedger(); +// c.api.getLedgerVersion().then(function (data) { +// console.log("ledger version:", data); +// }).catch(function (err) { +// console.log("err:", err); +// }); +// var opt = { +// // ledgerVersion: 2005, +// // includeAllData: false, +// // includeTransactions: true, +// // includeState: false +// } +// c.api.getLedger(opt).then(function (data) { +// console.log("ledger:", data); +// }) +// .catch(function (err) { +// console.log("err:", err); +// }); +// } diff --git a/test/ripple-test.js b/test/ripple-test.js new file mode 100644 index 0000000..8cf3aad --- /dev/null +++ b/test/ripple-test.js @@ -0,0 +1,73 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); +const { exit } = require('process'); + +const c = new ChainsqlAPI(); + +var user = { + secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", + address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", + publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" +} + +var ed25519Root = { + secret: "xEdTsZdgjNGe1bJ2VLn22Yyz2wJSzny", + address: "z9UgyKDdJWzzu37U7zKuwTEdWDjXhcNMWo" +} + +var owner = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" + } + +var sm2Root = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + + +var wsAddress = 'ws://192.168.29.69:5003'; + + +describe('ripple', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(sm2Root); + }) + + it('active', async function(){ + var amount = 20000 + let rs = await c.pay(owner.address, amount).submit({expect:'validate_success'}); + assert.equal(rs.status,'validate_success') + }) + + // it('switch active', async function(){ + // var amount = 20000 + // let rs = await c.pay(owner.address, amount).submit({expect:'validate_success'}) + // assert.equal(rs.status,'validate_success') + + // amount = 10000 + // c.as(owner) + // rs = await c.pay(sm2Root.address, amount).submit({expect:'validate_success'}) + // assert.equal(rs.status,'validate_success') + // }) + + // it('create confidential', async function(){ + // var raw = [ + // {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, + // {'field':'name','type':'varchar','length':50,'default':null}, + // {'field':'age','type':'int'} + // ]; + // var option = { + // confidential: true + // }; + + // let rs = await c.createTable(sConfidentialTableName, raw, option).submit({expect:'db_success'}); + // assert.equal(rs.status,'db_success') + // }) + + +}) diff --git a/test/server-test.js b/test/server-test.js new file mode 100644 index 0000000..bb56eb6 --- /dev/null +++ b/test/server-test.js @@ -0,0 +1,138 @@ +'use strict' + + +const co = require('co') +const ChainsqlAPI = require('../src/index'); +const r = new ChainsqlAPI(); +var path = require('path'); +var basePath = path.join(require.resolve('chainsql-lib-test'), '../common'); +var common = require(basePath); +var crypto = require('../lib/crypto'); +const keypairs = require('chainsql-keypairs-test'); + + +describe('server', () => { + + it('server', async function(){ + + try { + + // await r.connect('ws://192.168.0.14:6006'); + + // var cipher = crypto.eciesEncrypt("hello","03B7FBF1AC149B0D297B7407CAB9636792333B8D8B8A4036B2D4DE2E6D69D435B5"); + // var keypair = keypairs.deriveKeypair("xxHgHoRAHdGZxy5gWUdMeUK7hWrgr"); + // var plain = crypto.eciesDecrypt(cipher,keypair.privateKey); + // console.log(plain); + + // //字段级加密 + // console.log("multi encrypt test:"); + // var listPublic = ["cBP7JPfSVPgqGfGXVJVw168sJU5HhQfPbvDRZyriyKNeYjYLVL8M", "cBPaLRSCwtsJbz4Rq4K2NvoiDZWJyL2RnfdGv5CQ2UFWqyJ7ekHM"]; + // var cip = yield crypto.encryptText("test",listPublic); + // console.log("cipher:" + cip); + // var text = yield crypto.decryptText(cip,"xpvPjSRCtmQ3G99Pfu1VMDMd9ET3W"); + // console.log("plain text:" + text); + // var text2 = yield crypto.decryptText(cip,"xnHAcvtn1eVLDskhxPKNrhTsYKqde"); + // console.log("plain text2:" + text2); + + // console.log("AesPadding Test"); + // var aesCipher = crypto.aesEncrypt("abcdefg","hello,world"); + // console.log(aesCipher); + // var aesDecrypted = crypto.aesDecrypt("abcdefg",aesCipher); + // console.log(aesDecrypted); + + // // 创建表 + // let rs = yield r.createTable("abc", [{ + // "field": "id", + // "type": "int", + // "length": 11, + // "PK": 1, + // "NN": 1, + // "UQ": 1, + // "AI": 1 + // }, { + // "field": "name", + // "type": "varchar", + // "length": 46, + // "default": "null" + // }],{confidential:false}) + // .submit(); + // console.log(rs) + + // 删除表 + // let rs = yield r.drop(tb); + + // 重命名 + // let rs = yield r.rename(tb,'users'); + // 授权权限 + // let rs = yield r.assign(tb, 'rETMNdu2UgPhLZzbnDUVRHhB6NEDahj53c', [r.perm.insert],'0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02'); + // console.log(rs) + //取消授权 + // let rs = yield r.assignCancle('users', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ['lsfUpdate']); + // 插入数据 + //let rs = yield r.table(tb).insert({name:'xiaopeng'}).submit(); + // let rs = yield r.table(tb).insert({name:'feipeng1'}).submit(); + //删除数据 + // let rs = yield r.table(tb).get({id:1}).delete().submit(); + // 获取数据 + //let rs = yield r.table(tb).get(['id','name']).submit(); + + // 测试一个条件的情况 + //let rs = yield r.table(tb).get({id:{$ge:1}}).withFields(['id','name']).submit(); + + // // 测试 or 条件 + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'}).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:{$eq:'feipeng1'}}).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get({$or:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + + // 测试 and 条件 + //let rs = yield r.table(tb).get({$and:[{id:{$ge:1}},{name:'feipeng1'}]}).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get([{id:{$ge:1},name:'feipeng1'}]).withFields(['id','name']).submit(); + //let rs = yield r.table(tb).get([{id:{$ge:1},name:{$eq:'feipeng1'}}]).withFields(['id','name']).submit(); + + // 测试 limit + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:1}}).withFields(['id','name']).submit(); + // order by asc + //let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:1}]}).withFields(['id','name']).submit(); + // order by desc + // let rs = yield r.table(tb).get({id:{$eq:1}},{name:'feipeng1'},{$limit:{index:0,total:2},$order:[{id:-1}]}).withFields(['id','name']).submit(); + + //更新数据 + // let rs = yield r.table(tb).update({name:'xiaopeng'},{id:2}).submit(); + // 获取所有交易 + // let rs = yield r.getTransactions({limit:10,types:['sqlStatement']}); + // + // console.log(rs) + // 事务操作 + /*var raw ='[{"OpType":1,"TableName":"ExampleName","Raw":[{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},{"field":"age","type":"int"}],"$IsExisted":1},{"OpType":2,"TableName":"ExampleName","$IsExisted":0},{"OpType":6,"TableName":"ExampleName","Raw":[{"id":1,"age":1},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":1,"name":"test"}},{"OpType":8,"TableName":"ExampleName","Raw":[{"id":3,"age":2},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":3,"age":2}},{"OpType":9,"TableName":"ExampleName","Raw":[{"id":1,"age":1}],"$RowCount":0,"Cond":{"id":1,"age":1}}]';*/ + /*var raw ='[{"OpType":1,"TableName":"ExampleName","Raw":[{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},{"field":"age","type":"int"}],"$IsExisted":1},{"OpType":6,"TableName":"ExampleName","Raw":[{"id":1,"age":1},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":1,"name":"test"}},{"OpType":8,"TableName":"ExampleName","Raw":[{"id":3,"age":2},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":3,"age":2}},{"OpType":9,"TableName":"ExampleName","Raw":[{"id":1,"age":1}],"$RowCount":0,"Cond":{"id":1,"age":1}}]';*/ + + // var raw = '[{"OpType":1,"Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","TableName":"ExampleName","Raw":[{"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1},{"field":"age","type":"int"}],"$IsExisted":1},{"OpType":6,"Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","Owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","TableName":"ExampleName","Raw":[{"id":1,"age":1},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":1,"name":"test"}},{"OpType":8,"Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","Owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","TableName":"ExampleName","Raw":[{"id":3,"age":2},{"id":2,"age":2}],"$RowCount":1,"Cond":{"id":3,"age":2}},{"OpType":9,"TableName":"ExampleName","Account":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Secret":"snoPBrXtMeMyMHUVTgbuqAfg1SUTb","Owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh","Raw":[{"id":1,"age":1}],"$RowCount":0,"Cond":{"id":1,"age":1}}]'; + // console.log(rs) + + // r.beginTran(); + + // r.create('user0144s4000', [{ + // "field": "id", + // "type": "int", + // "length": 11, + // "PK": 1, + // "NN": 1, + // "UQ": 1, + // "AI": 1 + // }, { + // "field": "name", + // "type": "varchar", + // "length": 46, + // "default": "null" + // }],{confidential:true}); + // r.table(tb).insert({id:33,name:'xiaopeng454'}); + // r.table(tb).insert({id:34,name:'feipeng14544'}); + // var data = yield r.commit(); + // console.log('data',data) + } catch (e) { + console.log(e) + } + + }) + +}) diff --git a/test/table-contract-test.js b/test/table-contract-test.js new file mode 100644 index 0000000..6b221e6 --- /dev/null +++ b/test/table-contract-test.js @@ -0,0 +1,197 @@ +"use strict"; + +//const fs = require ('fs'); +//const solc = require('solc'); +const ChainsqlAPI = require("../src/index"); +const c = new ChainsqlAPI(); + +const RootUser = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +}; +const abi = '[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferToUser","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"returnMixType","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newMem","type":"uint256"}],"name":"setMem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"returnString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getMsgSender","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTxOrigin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"userTransferUser","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getMem","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":true,"name":"number","type":"uint256"},{"indexed":false,"name":"result","type":"uint256"}],"name":"multiplylog","type":"event"}]'; +const deployBytecode = "0x6080604052610707806100136000396000f3006080604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635f7807a4146100a6578063645c9ac8146100f45780636606873b1461018b5780636cf43347146101c65780637a6ce2e114610256578063b8077e28146102b4578063c6888fa11461030b578063e8b3891e1461035a578063f05913081461039e578063f8b2cb4f146103c9575b005b6100f2600480360360408110156100bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061042e565b005b34801561010057600080fd5b50610109610479565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014f578082015181840152602081019050610134565b50505050905090810190601f16801561017c5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561019757600080fd5b506101c4600480360360208110156101ae57600080fd5b81019080803590602001909291905050506104c4565b005b3480156101d257600080fd5b506101db6104ce565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561021b578082015181840152602081019050610200565b50505050905090810190601f1680156102485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026257600080fd5b5061026b610531565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b3480156102c057600080fd5b506102c9610542565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031757600080fd5b506103446004803603602081101561032e57600080fd5b810190808035906020019092919050505061054a565b6040518082815260200191505060405180910390f35b61039c6004803603602081101561037057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610667565b005b3480156103aa57600080fd5b506103b36106b1565b6040518082815260200191505060405180910390f35b3480156103d557600080fd5b50610418600480360360208110156103ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106ba565b6040518082815260200191505060405180910390f35b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610474573d6000803e3d6000fd5b505050565b60006060600061029a9050806040805190810160405280601b81526020017f737472696e675465737432666f724d69785479706552657475726e000000000081525092509250509091565b8060008190555050565b60608060405190810160405280602981526020017f737472696e675465737431666f72616c6f6e67537472696e674d6f726574686181526020017f6e33324279746534310000000000000000000000000000000000000000000000815250905090565b600080336006809050915091509091565b600032905090565b60006001821115156105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d75737420696e7075742061206269676765722076616c7565207468616e206f81526020017f6e6500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600783029050827f414b7ab3d46ecc8ab359636c133f9a1b88ffc8c08e9560da2b3ef7949edf8ca33383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a280915050919050565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156106ad573d6000803e3d6000fd5b5050565b60008054905090565b60008173ffffffffffffffffffffffffffffffffffffffff163190509190505600a165627a7a723058206503ab514bf3f130f914693d97643dc702c6a46fa16526d2b59a62642b85e82d0029"; +const contractAddr = "zcdFPChLUNYXQTV6zr2osrWG8pV7Zyh8FL"; + + +var wsAddress = 'ws://192.168.29.136:6005'; + + +describe('smart-contract', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(RootUser); + }) + + it('deployContract', async function(){ + + + }) + +}) + + + + +// main(); + +// async function main(){ +// try { +// await c.connect(wsAddress); +// console.log("connected successfully"); + +// c.as(RootUser); +// // let contractCode = fs.readFileSync("./solidity-example/solidity-example.sol"); +// // let compileResult = solc.compile(contractCode.toString(), 1); +// // for (var contractName in compileResult.contracts) { +// // // code and ABI that are needed by web3 +// // console.log(contractName + ': ' + compileResult.contracts[contractName].bytecode); +// // deployBytecode = "0x" + compileResult.contracts[contractName].bytecode; +// // console.log(contractName + ': ' + compileResult.contracts[contractName].interface); +// // abi = compileResult.contracts[contractName].interface; +// // } + +// // deployContractAwait(); +// deployContract(); + +// // callContract(); +// } catch (error) { +// console.log(error); +// } +// } + +// function callContract(){ +// const myContract = chainsql.contract(JSON.parse(abi), contractAddr); +// /*use contract call way*/ +// // contractCall(myContract); + +// /*methods.events.eventlog*/ +// // contractEvent(myContract); + +// /*use contract submit way*/ +// contractSubmit(myContract); + +// // callContractWithMsgValue(myContract); + +// /*get function encodeABI*/ +// // getFuncEncodeABI(myContract); + +// /*methods.function.auto*/ +// // contractAuto(myContract); +// } + +// function contractSubmit(myContract){ +// /*methods.function.submit*/ +// chainsql.payToContract(contractAddr, 2000, 30000000).submit({ +// expect: "validate_success" +// }).then(data => { +// console.log(data); +// }).catch(err => { +// console.log(err); +// }); +// // Promise +// // myContract.methods.transferToUser("zLtH4NFSqDFioq5zifriKKLf8xcyyw7VCf", 12000000).submit({ +// // Gas: 30000000, +// // ContractValue : "20000000", +// // expect: "validate_success" +// // }).then(data => { +// // console.log(data); +// // }).catch(err => { +// // console.log(err); +// // }); + +// //callback +// // myContract.methods.userTransferUser("zPif8u9YqL8NhHxXGHKxopAaFMZ3rwHF6s").submit({ +// // Gas: 30000000, +// // ContractValue: "12000000", +// // expect: "validate_success" +// // }, function (err, res) { +// // err ? console.log(err) : console.log(res); +// // }); +// } + +// function contractEvent(myContract){ +// myContract.events.multiplylog((err, res) => { +// err ? console.log(err) : console.log(res); +// }); +// } + +// function callContractWithMsgValue(contractObj){ +// contractObj.methods.userTransferUser("zU8gAWTXZgLmaF1XVR8briCdnWXJsT8njM").submit({ +// Gas: 500000, +// ContractValue: "111111", +// expect: "validate_success" +// }, (err, res) => { +// err ? console.log(err) : console.log(res); +// }); +// } + +// function contractCall(contractObj){ +// /*methods.function.call*/ +// contractObj.methods.getMsgSender().call(function (err, res) { +// err ? console.log(err) : console.log(res); +// }); +// } + +// function getFuncEncodeABI(contractObj){ +// /*methods.function.encodeABI*/ +// let funInputData = contractObj.methods.setMem(16).encodeABI(); +// console.log(funInputData); +// } + +// function deployContract(){ +// const myContract = chainsql.contract(JSON.parse(abi)); +// // Promise +// // myContract.deploy({ +// // ContractData : deployBytecode, +// // arguments : [666] +// // }).submit({ +// // ContractValue : "10000000", +// // Gas : 400000 +// // }).then(data => { +// // console.log(data); +// // }).catch(err => { +// // console.log(err); +// // }); + +// // callback +// myContract.deploy({ +// ContractData : deployBytecode, +// arguments : [666] +// }).submit({ +// ContractValue : "10000000", +// Gas : 400000 +// }, function (err, res) { +// err ? console.log(err) : console.log(res); + +// /* you can call contract function directly here!*/ +// // myContract.methods.setMem(16).submit({ +// // Gas: 500000 +// // }, (err, res) => { +// // err ? console.log(err) : console.log(res); +// // }); +// }); +// } + +// async function deployContractAwait(){ +// const myContract = chainsql.contract(JSON.parse(abi)); +// try { +// let deployRes = await myContract.deploy({ +// ContractData : deployBytecode, +// arguments : [666] +// }).submit({ +// ContractValue : "10000000", +// Gas : 400000 +// }); + +// console.log(deployRes); +// myContract.methods.setMem(16).submit({ +// Gas:500000 +// }, (err, res) => { +// err ? console.log(err) : console.log(res); +// }); +// } catch (error) { +// console.log(error); +// } +// } \ No newline at end of file diff --git a/test/table-test.js b/test/table-test.js new file mode 100644 index 0000000..0b58903 --- /dev/null +++ b/test/table-test.js @@ -0,0 +1,192 @@ +'use strict' // eslint-disable-line strict + +const assert = require('assert') +const ChainsqlAPI = require('../src/index'); +const { exit } = require('process'); + +const c = new ChainsqlAPI(); + +var user = { + secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", + address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", + publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" +} + +var ed25519Root = { + secret: "xEdTsZdgjNGe1bJ2VLn22Yyz2wJSzny", + address: "z9UgyKDdJWzzu37U7zKuwTEdWDjXhcNMWo" +} + +var owner = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" + } + +var sm2Root = { + secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", + address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" +} + +const smUser = { + secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", + address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", + publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" +}; + + +var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; + +var sTableName = "n1"; +var sConfidentialTableName = "table_jm2"; +var sOperRuleTableName = "table_hjkz"; + +var wsAddress = 'ws://192.168.29.69:5003'; + + +var raw = [ + {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, + {'field':'name','type':'varchar','length':50,'default':null}, + {'field':'age','type':'int'} +]; + + +describe('table', () => { + + it('init', async function(){ + await c.connect(wsAddress); + c.as(sm2Root); + }) + + it('create table', async function(){ + + var option = { + confidential: false + }; + let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + + it('insert', async function(){ + var insertRaw = [ + {'id':11,'age': 333,'name':'hello'}, + {'id':22,'age': 444,'name':'sss'}, + {'id':33,'age': 555,'name':'rrr'} + ]; + var rs = await c.table(sTableName).insert(insertRaw).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + it('update', async function(){ + var rs = await c.table(sTableName).get({'id': 2}).update({'age':200}).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + + it('test grant', async function(){ + + var flag = { insert: true, update: true } + let rs = await c.grant(sTableName, smUser.address, flag,smUser.publicKey).submit({ expect: 'db_success' }); + assert.equal(rs.status,'db_success') + }) + + it('test insert after grant', async function(){ + + c.as(smUser); + c.use(sm2Root.address); + var raw = [ + {'id':34,'age': 333,'name':'hello'}, + {'id':35,'age': 444,'name':'sss'}, + {'id':36,'age': 555,'name':'rrr'} + ] + var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + it('delete', async function(){ + // 切换回原来的账户 + c.as(sm2Root); + var rs = await c.table(sTableName).get({'id': 3}).delete().submit({expect:'db_success'}); + assert.equal(rs.status,'db_success') + }) + + it('drop', async function(){ + + // 切换回原来的账户 + c.as(sm2Root); + var rs =await c.dropTable(sTableName).submit({ expect: 'db_success' }); + assert.equal(rs.status,'db_success') + }) + + + // it('create confidential', async function(){ + // var raw = [ + // {'field':'id','type':'int','length':11,'PK':1,'NN':1,'default':''}, + // {'field':'name','type':'varchar','length':50,'default':null}, + // {'field':'age','type':'int'} + // ]; + // var option = { + // confidential: true + // }; + + // let rs = await c.createTable(sConfidentialTableName, raw, option).submit({expect:'db_success'}); + // assert.equal(rs.status,'db_success') + // }) + + // it('create operationRule', async function(){ + + // var raw = [ + // {'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1}, + // {'field':'name','type':'varchar','length':50,'default':null}, + // {'field':'age','type':'int'}, + // {'field':'account','type':'varchar','length':64} + // ] + // var rule = { + // 'Insert':{ + // 'Condition':{'account':'$account'}, + // 'Count':{'AccountField':'account','CountLimit':5}, + // }, + // 'Update':{ + // 'Condition':{'$or':[{'age':{'$le':28}},{'id':2}]}, + // 'Fields':['age'] + // }, + // 'Delete':{ + // 'Condition':{'$and':[{'age':'$lt18'},{'account':'$account'}]} + // }, + // 'Get':{ + // 'Condition':{'id':{'$ge':3}} + // } + // }; + // var option = { + // confidential: false, + // operationRule: rule + // } + // // 创建 行级控制表 + // let rs = await c.createTable(sOperRuleTableName, raw, option).submit({expect:'db_success'}); + // assert.equal(rs.status,'db_success') + + // }) + + +// it('test operationRule', async function(){ + +// var insertRaw = [ +// {'id':1,'age': 333,'name':'hello'}, +// {'id':2,'age': 444,'name':'sss'}, +// {'id':3,'age': 555,'name':'rrr'}, +// {'id':4,'age': 333,'name':'hello'}, +// {'id':5,'age': 444,'name':'sss'}, +// {'id':6,'age': 555,'name':'rrr'}, +// ]; + +// // 如果我想这一条必须失败的处理写法? +// var rs = await c.table(sOperRuleTableName).insert(insertRaw).submit({expect:'db_success'}); +// assert.equal(rs.status,'db_success') + +// }) + + + + + +}) From 7f3e35bedeabd32d421a28b9c160fb0e27f66fab Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 27 Oct 2020 19:13:46 +0800 Subject: [PATCH 11/53] upgrade version to 0.70.1(Overwrite wrong version 0.70.0) --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2f14cda..06d2532 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "chainsql-test", - "version": "0.6.70", + "name": "chainsql", + "version": "0.70.1", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -8,7 +8,7 @@ }, "dependencies": { "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.11", + "chainsql-keypairs": "^0.10.16", "chainsql-lib": "^0.17.44", "co": "^4.6.0", "elliptic": "^5.1.0", From 038ce9b6b7502c0cde1c537bc2187c3f7140db13 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 4 Jan 2021 11:50:47 +0800 Subject: [PATCH 12/53] add add,del,modify,get interface of schema --- src/index.js | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 219 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index e91421b..19eccfc 100644 --- a/src/index.js +++ b/src/index.js @@ -19,6 +19,7 @@ const Connection = require('./connect'); const Table = require('./table'); const Contract = require('./smartContract'); const util = require('../lib/util'); +const { utils } = require('elliptic'); const opType = require('../lib/config').opType; const convertStringToHex = util.convertStringToHex; const getCryptAlgTypeFromAccout = util.getCryptAlgTypeFromAccout; @@ -42,7 +43,10 @@ class ChainsqlAPI extends Submit { select: 'lsfSelect', execute: 'lsfExecute' }; - this.transaction = false; + this.transaction = false; + this.schemaCreateTx = false; + this.schemaModifyTx = false; + this.cache = []; this.strictMode = false; this.needVerify = 1; @@ -1007,7 +1011,38 @@ ChainsqlAPI.prototype.verify = function (messageHex, signature, publicKey) { ChainsqlAPI.prototype.prepareJson = function(){ let that = this; return new Promise((resolve, reject) => { - if (that.payment.opType === opType['t_grant']) { + + if(that.schemaCreateTx || that.schemaModifyTx){ + var payment = that.payment; + that.api.prepareTx(payment).then(function (data) { + + var txJson = JSON.parse(data.txJSON); + var dropsPerByte = Math.ceil(1000000.0 / 1024); + that.api.getServerInfo().then(res => { + + if(res.validatedLedger.dropsPerByte != undefined){ + dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); + } + + txJson.Fee = util.calcFee(txJson,dropsPerByte); + data.txJSON = txJson; + that.schemaCreateTx = false; + that.schemaModifyTx = false; + resolve(data) + }).catch(err => { + that.schemaCreateTx = false; + that.schemaModifyTx = false; + reject(error) + }); + + }).catch(function (error) { + that.schemaCreateTx = false; + that.schemaModifyTx = false; + reject(error) + }); + + } + else if (that.payment.opType === opType['t_grant']) { handleGrantPayment(that).then(() => { that.api.prepareTable(that, that.payment, resolve, reject); }).catch(error => { @@ -1024,9 +1059,190 @@ ChainsqlAPI.prototype.prepareJson = function(){ * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; */ ChainsqlAPI.prototype.setSchema = function(schemaID){ - this.connect.setSchema(schemaID); + var connection = this.api ? this.api.connection : this.connect.api.connection; + if(connection._schema_id === undefined ){ + throw new Error("The current version does not support setSchema"); + } + connection._schema_id = schemaID; } +ChainsqlAPI.prototype.getSchemaList = function(options){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + + var params = {}; + params.command = 'schema_list'; + + if(options !== undefined && options.account !== undefined){ + params.account = options.account; + } + + if(options !== undefined && options.running !== undefined){ + params.running = options.running; + } + + connection.request(params).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + +ChainsqlAPI.prototype.getSchemaInfo = function(schemaID){ + var connection = this.api ? this.api.connection : this.connect.api.connection; + return new Promise(function(resolve, reject){ + connection.request({ + command: 'schema_info', + schema:schemaID + }).then(function(data){ + resolve(data); + }).catch(function(err){ + reject(err); + }); + }); +}; + + +ChainsqlAPI.prototype.createSchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaName !== undefined) && (schemaInfo.WithState !== undefined) && + (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && + (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + + if(!bValid){ + throw new Error("Invalid schemaInfo parameter"); + } + + // 继承自主链的状态 + // 锚定区块的hash值 + + var peerlists = [] + var i = 0; + var len = schemaInfo.PeerList.length + for(; i < len; i++) { + var hexPeer = convertStringToHex(schemaInfo.PeerList[i].Peer.Endpoint) + + var item = { + Peer:{ + Endpoint:hexPeer + } + } + peerlists.push(item) + } + + this.schemaCreateTx = true; + + var schemaCreateTxJson = { + Account: this.connect.address, + SchemaName:convertStringToHex(schemaInfo.SchemaName), + SchemaStrategy: schemaInfo.WithState? 2:1, + SchemaAdmin: this.connect.address, + Validators: schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaCreate' + }; + + + if(schemaCreateTxJson.SchemaStrategy === 2 ){ + + if(schemaInfo.AnchorLedgerHash === undefined ){ + throw new Error("Missing field AnchorLedgerHash"); + } + schemaCreateTxJson.AnchorLedgerHash = schemaInfo.AnchorLedgerHash; + } + + this.payment = schemaCreateTxJson; + return this; + +}; + + +ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ + + let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaID !== undefined) && (schemaInfo.ModifyType !== undefined) && + (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && + (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + + if(!bValid){ + throw new Error("Invalid modifySchema parameter"); + } + + // var validators = [] + // var i = 0 + // var len = schemaInfo.Validators.length + + // for(; i < len; i++) { + // var hexValidator = convertStringToHex(schemaInfo.Validators[i].Validator.PublicKey) + + // var item = { + // Validator:{ + // PublicKey:hexValidator + // } + // } + // validators.push(item) + // } + + var peerlists = [] + var i = 0; + var len = schemaInfo.PeerList.length + for(; i < len; i++) { + var hexPeer = convertStringToHex(schemaInfo.PeerList[i].Peer.Endpoint) + + var item = { + Peer:{ + Endpoint:hexPeer + } + } + peerlists.push(item) + } + + var opType = 1; + if(schemaInfo.ModifyType === "schema_del"){ + opType = 2 + }else if(schemaInfo.ModifyType === "schema_add"){ + opType = 1 + }else{ + throw new Error("Invalid schemaInfo.ModifyType"); + } + + var schemaModifyTxJson = { + Account: this.connect.address, + SchemaID: schemaInfo.SchemaID, + OpType: opType, + Validators:schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaModify' + }; + + // 修改子链 + this.schemaModifyTx = true; + + // let payment = { + // Account: that.connect.address, + // SchemaID:"595FC1AA0C73D735C3362A0E9976A64E024C86976E08C02D299DB344CF674650", + // OpType: 1, + // Validators:[ + // { + // Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1A"} + // } + // ], + // PeerList:[ + // { + // Peer:{ Endpoint:convertStringToHex("192.168.29.116:7017") } + // } + + // ], + // TransactionType: 'SchemaModify' + // }; + + this.payment = schemaModifyTxJson; + return this; + +}; + + + function callback(data, callback) { } From 64873761dbb0e45e63da40b0330ae1a87a201e43 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 8 Jan 2021 10:56:19 +0800 Subject: [PATCH 13/53] add unit test code of schema --- test/test.js | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/test/test.js b/test/test.js index 42f054c..ee1e9ec 100644 --- a/test/test.js +++ b/test/test.js @@ -34,7 +34,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:6005'); + await c.connect('ws://127.0.0.1:8017'); //await c.connect('ws://101.201.40.124:5006'); console.log('连接成功'); @@ -140,10 +140,10 @@ async function testAccount(){ } async function testChainsql(){ - // await testCreateTable(); + //await testCreateTable(); // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); + // await testCreateTable1(); // await testInsert(); // await testUpdate(); // await testDelete(); @@ -161,8 +161,46 @@ async function testChainsql(){ //现在底层不允许直接删除所有记录这种操作了 // await testDeleteAll(); + + // + await testSchema(); } +//创建一个加密的表,table为要创建的表,confidential为是否要加密 +var testSchema = async function() { + + try{ + + // 不继承状态 + let schemaInfo = { + SchemaName:"hello", + WithState:false, + SchemaAdmin:user.address, + Validators:[ + { + Validator:{PublicKey:"02BD87A95F549ECF607D6AE3AEC4C95D0BFF0F49309B4E7A9F15B842EB62A8ED1B"} + } + ], + PeerList:[ + { + Peer:{ Endpoint:"192.168.29.108:5125"} + } + ] + } + + let ret = await c.createSchema(schemaInfo).submit({expect:'validate_success'}) + //assert.strictEqual(ret.status,'validate_success') + // 继承状态 + + console.log("test CreateSchema" , ret) + + + }catch(e){ + console.error(e) + } + +}; + function subTable(tb, owner) { var event = c.event; event.subscribeTable(owner,tb,function(err, data) { From 0285adbe7f0d6abe7fcdd1cee680d2f671cff16a Mon Sep 17 00:00:00 2001 From: ruancheng Date: Fri, 8 Jan 2021 18:49:00 +0800 Subject: [PATCH 14/53] 1 add `LONGTEXT` data type supported 2 overwrite getTransaction 3 add `tableSet` to reduce the interaction time with chainsql nodes 4 add unit test code of `tableSet` and `getTransaction` --- lib/validate.js | 1 + src/index.js | 6 ++-- src/submit.js | 4 +-- src/table.js | 88 ++++++++++++++++++++++++++++++++++----------- src/tablePayment.js | 36 +++++++++++-------- test/test.js | 69 ++++++++++++++++++++++++++--------- 6 files changed, 147 insertions(+), 57 deletions(-) diff --git a/lib/validate.js b/lib/validate.js index 0353fa8..bd85b09 100644 --- a/lib/validate.js +++ b/lib/validate.js @@ -37,6 +37,7 @@ function create(name,obj) { case "text": case "datetime": case "date": + case "longtext": break; case "varchar": case "char": diff --git a/src/index.js b/src/index.js index ba32a54..a5bfa7a 100644 --- a/src/index.js +++ b/src/index.js @@ -507,11 +507,11 @@ ChainsqlAPI.prototype.getAccountTransactions = function (address, opts, cb) { } }; -ChainsqlAPI.prototype.getTransaction = function (hash, cb) { +ChainsqlAPI.prototype.getTransaction = function (hash,meta,meta_chain,cb) { if ((typeof cb) != 'function') { - return this.api.getTransaction(hash); + return this.api.getTransaction(hash,meta,meta_chain); } else { - this.api.getTransaction(hash).then(function (data) { + this.api.getTransaction(hash,meta,meta_chain).then(function (data) { cb(null, data); }).catch(function (err) { cb(err); diff --git a/src/submit.js b/src/submit.js index 46cc813..3969baf 100644 --- a/src/submit.js +++ b/src/submit.js @@ -18,8 +18,8 @@ Submit.prototype.submit = function (expectOpt) { let self = this; return new Promise(function (resolve, reject) { try { - self.prepareJson().then(function (prepared) { - self.txJSON = prepared.txJSON; + self.prepareJson().then(function (preparedJson) { + self.txJSON = preparedJson; self.setCert(); let signedRet = self.signTx(); self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); diff --git a/src/table.js b/src/table.js index 089152e..6d14d4f 100644 --- a/src/table.js +++ b/src/table.js @@ -19,7 +19,9 @@ class Table extends Submit { this.exec = ''; this.field = null; this.connect = ChainsqlAPI.connect; - this.cache = []; + this.cache = []; + this.nameInDB = ''; + this.confidential = true; } submit (cb) { @@ -166,6 +168,18 @@ Table.prototype.assert = function(json) { return this; } +Table.prototype.tableSet = function(json) { + + if(json.nameInDB !== undefined){ + this.nameInDB = json.nameInDB; + } + + if(json.confidential !== undefined){ + this.confidential = json.confidential; + } + return this; +} + function hasLimit(item) { for (var key in item) { if (key === '$limit') { @@ -392,7 +406,8 @@ Table.prototype.prepareJson = function() { strictMode: that.strictMode, tables: [{ Table: { - TableName: convertStringToHex(that.tab), + TableName: convertStringToHex(that.tab), + NameInDB: that.nameInDB } }], tsType: 'SQLStatement' @@ -405,30 +420,61 @@ Table.prototype.prepareJson = function() { prepareTable(that, payment, resolve, reject); }); } -function prepareTable(ChainSQL, payment, resolve, reject) { - var connect = ChainSQL.connect; - getUserToken(connect.api.connection, connect.scope, connect.address, ChainSQL.tab).then(function (token) { - token = token[ChainSQL.connect.scope + ChainSQL.tab]; - if (token && token != '') { - var secret = decodeToken(ChainSQL, token); - var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ - - let algType = "aes"; - if(ChainSQL.connect.secret === "gmAlg"){ - algType = "gmAlg"; - }else if(regSoftGMSeed.test(ChainSQL.connect.secret)){ - algType = "softGMAlg"; + + +function tryEncryptRaw(ChainSQL, payment) { + + var that = ChainSQL; + var raw = payment.raw; + return new Promise(function (resolve, reject) { + + if(! that.confidential){ + resolve( convertStringToHex(raw) ); + return ; + } + + // confidential table + + var connect = that.connect; + getUserToken(connect.api.connection, connect.scope, connect.address, that.tab).then(function (token) { + token = token[that.connect.scope + that.tab]; + + var ciperRaw; + if (token && token != '') { + var secret = decodeToken(that, token); + var regSoftGMSeed = /^[a-zA-Z1-9]{51,51}/ + + let algType = "aes"; + if(that.connect.secret === "gmAlg"){ + algType = "gmAlg"; + }else if(regSoftGMSeed.test(that.connect.secret)){ + algType = "softGMAlg"; + } + ciperRaw = crypto.symEncrypt(secret, raw, algType).toUpperCase(); + } else { + ciperRaw = convertStringToHex(raw); } - payment.raw = crypto.symEncrypt(secret, payment.raw, algType).toUpperCase(); - } else { - payment.raw = convertStringToHex(payment.raw); - } - - connect.api.prepareTable(connect, payment, resolve, reject); + + resolve(ciperRaw); + }).catch(function(error) { + reject(error); + }); + + }); +} + + +function prepareTable(ChainSQL, payment, resolve, reject) { + + var connect = ChainSQL.connect; + tryEncryptRaw(ChainSQL,payment).then(function (raw) { + payment.raw = raw; + connect.api.prepareTable(connect, payment, resolve, reject); }).catch(function(error) { reject(error); }); + } function handleGetRecord(ChainSQL, object, resolve, reject) { diff --git a/src/tablePayment.js b/src/tablePayment.js index 39d7780..95038ec 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -82,33 +82,39 @@ function prepareTablePayment(payment, chainsqlApi) { function prepareTable(ChainSQL, payment, resolve, reject) { prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { - // console.log(tx_json); - getTxJson(ChainSQL, JSON.parse(tx_json.txJSON)).then(function (data) { - + var dropsPerByte = Math.ceil(1000000.0 / 1024);; ChainSQL.api.getServerInfo().then(res => { if(res.validatedLedger.dropsPerByte != undefined){ - dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); } - - data.tx_json.Fee = calcFee(data.tx_json,dropsPerByte); - data.txJSON = data.tx_json; - delete data.tx_json; - resolve(data); + + // 1 calculate fee + var txJson = JSON.parse(tx_json.txJSON); + txJson.Fee = calcFee(txJson,dropsPerByte); + + if( txJson.Tables.length === 1 && txJson.Tables[0].Table.NameInDB !== '' ){ + resolve(txJson); + return ; + } + + // 2 get table's NameInDB + getTxJson(ChainSQL, txJson).then(function (data) { + resolve(data.tx_json); + }).catch(function (error) { + reject(error); + }); }).catch(err => { reject(err); }); + }).catch(err => { + reject(err); + }); + - }).catch(function (error) { - reject(error); - }); - }).catch(function (error) { - reject(error); - }); } module.exports = prepareTable; \ No newline at end of file diff --git a/test/test.js b/test/test.js index 42f054c..75b13e8 100644 --- a/test/test.js +++ b/test/test.js @@ -25,7 +25,7 @@ var issuer = { address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" } -var sTableName = "fasefa"; +var sTableName = "test666"; var sTableName2 = "b1"; var sReName = "boy1234"; var sTableName3 = "hijack12"; @@ -34,7 +34,7 @@ main(); async function main(){ try { - await c.connect('ws://127.0.0.1:6005'); + await c.connect('ws://127.0.0.1:6006'); //await c.connect('ws://101.201.40.124:5006'); console.log('连接成功'); @@ -50,7 +50,7 @@ async function main(){ //await testSubscribe(); - // await testRippleAPI(); + //await testRippleAPI(); // await testAccount(); await testChainsql(); @@ -61,6 +61,23 @@ async function main(){ } } +async function testGetTransaction(){ + + var txHash = 'DC9782AFF31D495108FFB751E9B32C2DEFBCC7A3846CB1D8CB0E789F1CCC93E8'; + + let rs = await c.getTransaction(txHash); + console.log( "meta:false ; meta_chain true " , JSON.stringify( rs ) ) ; + + rs = await c.getTransaction(txHash,true); + console.log( "meta:true ; meta_chain true " , JSON.stringify( rs ) ) ; + + rs = await c.getTransaction(txHash,false,false); + console.log( "meta:false ; meta_chain false " ,JSON.stringify( rs ) ) ; +} + + + + var testSubscribe = async function(){ subTable(sTableName,owner.address); setTimeout(function(){ @@ -99,6 +116,7 @@ async function subTx() { },5000); }); } + function testSubscribeTx(hash){ var event = c.event; event.subscribeTx(hash,function(err, data) { @@ -126,8 +144,8 @@ async function testRippleAPI(){ // await testGetLedgerVersion(); // await testGetLedger(); - await testGetAccountTransactions(); - // await testGetTransaction(); +// await testGetAccountTransactions(); + await testGetTransaction(); // await testGetServerInfo(); // await testUnlList(); // await testEscrow(); @@ -139,11 +157,34 @@ async function testAccount(){ await activateAccount(account.address); } + + +async function testTableSet(){ + + var raw = [ + {'id':12345,'age': 333,'name':'hello'} + ]; + try { + + var nameInDB = await c.getTableNameInDB(owner.address,sTableName); + var tableProperty = {}; + tableProperty.nameInDB = nameInDB; + tableProperty.confidential = false; + + var rs = await c.table(sTableName).tableSet(tableProperty).insert(raw).submit({expect:'db_success'}); + console.log("testInsert",rs); + } catch (error) { + console.error(error); + } +} + async function testChainsql(){ + + // await testCreateTable(); - // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); + // 创建另一张表,用来测试rename,drop + // await testCreateTable1(); // await testInsert(); // await testUpdate(); // await testDelete(); @@ -161,6 +202,8 @@ async function testChainsql(){ //现在底层不允许直接删除所有记录这种操作了 // await testDeleteAll(); + + await testTableSet(); } function subTable(tb, owner) { @@ -191,7 +234,8 @@ var testCreateTable = async function() { var raw = [ {'field':'id','type':'int','length':11,'PK':1,'NN':1}, {'field':'name','type':'varchar','length':50,'default':""}, - {'field':'age','type':'int'} + {'field':'age','type':'int'}, + {'field':'age1','type':'longtext'} ] var option = { confidential: false @@ -219,7 +263,7 @@ var testCreateTable1 = async function() { } }; -//重复插入的情况下报异常 +//重复插入的情况下报异常 var testInsert = async function() { var raw = [ {'id':1,'age': 333,'name':'hello'}, @@ -400,14 +444,7 @@ async function testGetAccountTransactions(){ // var rs = await callback2Promise(c.getTransactions,opt); // console.log(rs); } -async function testGetTransaction(){ - // let rs = await c.getTransaction('3E02AA296A348F10C1F54D2EF0CBBDA9A6D389F66EFFBA936F1842506FACD4EA'); - // console.log(rs); - c.getTransaction('B4FB648883D73D4EB2D3A9E6059F1D0CF97105445F06B763A9DAB9FA66AA2EFC',callback); - // var rs = await callback2Promise(c.api.getTransaction,opt); - // console.log(rs); -} async function testGetServerInfo(){ // let rs = await c.getServerInfo(); // console.log(rs); From 2427af4e67832c897bc1ef94a2e677b32664def5 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 19 Jan 2021 17:34:28 +0800 Subject: [PATCH 15/53] delete extra comment --- src/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index 19eccfc..379f6df 100644 --- a/src/index.js +++ b/src/index.js @@ -1109,14 +1109,12 @@ ChainsqlAPI.prototype.createSchema = function(schemaInfo){ let bValid = (schemaInfo !== undefined) && (schemaInfo.SchemaName !== undefined) && (schemaInfo.WithState !== undefined) && (schemaInfo.Validators !== undefined) && (schemaInfo.Validators instanceof Array) && (schemaInfo.PeerList !== undefined) && (schemaInfo.PeerList instanceof Array); + if(!bValid){ throw new Error("Invalid schemaInfo parameter"); - } - - // 继承自主链的状态 - // 锚定区块的hash值 - + } + var peerlists = [] var i = 0; var len = schemaInfo.PeerList.length From d03d6598c47750082929241f309e9250b051f67b Mon Sep 17 00:00:00 2001 From: ruancheng Date: Tue, 19 Jan 2021 18:06:55 +0800 Subject: [PATCH 16/53] update version to 1.0.0 --- lib/error.js | 2 +- lib/util.js | 2 +- package.json | 4 ++-- src/index.js | 2 +- src/ripple.js | 2 +- src/smartContract.js | 2 +- src/submit.js | 2 +- src/tablePayment.js | 2 +- src/txPayment.js | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/error.js b/lib/error.js index cd1ae33..32fdb44 100644 --- a/lib/error.js +++ b/lib/error.js @@ -1,6 +1,6 @@ "use strict"; -const chainsqldError = require('chainsql-lib-test').ChainsqlLibCommon.errors.ChainsqldError; +const chainsqldError = require('chainsql-lib').ChainsqlLibCommon.errors.ChainsqldError; function chainsqlError( errMsg ) { let errName = "apiGeneralErr"; diff --git a/lib/util.js b/lib/util.js index 3b6d65e..abb0861 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,6 +1,6 @@ 'use strict'; const path = require('path'); -const common = require('chainsql-lib-test').ChainsqlLibCommon; +const common = require('chainsql-lib').ChainsqlLibCommon; const keypairs = require('chainsql-keypairs-test'); const cryptoo = require('crypto'); const crypto = require('./crypto'); diff --git a/package.json b/package.json index 1453622..f5bdff7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-test", - "version": "0.6.71", + "version": "1.0.0", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -9,7 +9,7 @@ "dependencies": { "bignumber.js": "^2.4.0", "chainsql-keypairs-test": "^0.10.16", - "chainsql-lib-test": "^0.17.52", + "chainsql-lib": "~1.0.0", "co": "^4.6.0", "elliptic": "^5.1.0", "hash.js": "^1.0.3", diff --git a/src/index.js b/src/index.js index 3fbc92f..b4cf70c 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ const keypairs = require('chainsql-keypairs-test'); const EventManager = require('./eventManager') const _ = require('lodash'); -const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); const chainsqlError = require('../lib/error'); diff --git a/src/ripple.js b/src/ripple.js index 9030a08..7fef145 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -2,7 +2,7 @@ var util = require('../lib/util'); var Submit = require('./submit'); const FloatOperation = require('../lib/floatOperation'); -var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { diff --git a/src/smartContract.js b/src/smartContract.js index 0ec476e..862acaa 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -3,7 +3,7 @@ var util = require('../lib/util'); const _ = require('lodash'); -var chainsqlLibUtils = require('chainsql-lib-test').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; const keypairs = require('chainsql-keypairs-test'); const chainsqlUtils = require('../lib/util'); const chainsqlError = require('../lib/error'); diff --git a/src/submit.js b/src/submit.js index d82d47f..9f45797 100644 --- a/src/submit.js +++ b/src/submit.js @@ -1,6 +1,6 @@ 'use strict' var util = require('../lib/util'); -const RippleAPI = require('chainsql-lib-test').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; const Connection = require('./connect'); class Submit { diff --git a/src/tablePayment.js b/src/tablePayment.js index 44e1dc1..f021d62 100644 --- a/src/tablePayment.js +++ b/src/tablePayment.js @@ -4,7 +4,7 @@ var _ = require('lodash'); const path = require('path'); const getTxJson = require('../lib/util').getTxJson; const calcFee = require('../lib/util').calcFee; -var utils = require('chainsql-lib-test').ChainsqlLibUtil; +var utils = require('chainsql-lib').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; diff --git a/src/txPayment.js b/src/txPayment.js index 8eb7343..09c4951 100644 --- a/src/txPayment.js +++ b/src/txPayment.js @@ -2,7 +2,7 @@ var _ = require('lodash'); const path = require('path'); -var utils = require('chainsql-lib-test').ChainsqlLibUtil; +var utils = require('chainsql-lib').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; From 3eec9027593d9ea6c93a99841b4acec8d9ea36c7 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 25 Jan 2021 13:39:33 +0800 Subject: [PATCH 17/53] 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 061fe9d6f942ea5c159f02cf956749608f3b6152 Mon Sep 17 00:00:00 2001 From: ruancheng Date: Mon, 25 Jan 2021 13:47:30 +0800 Subject: [PATCH 18/53] 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 19/53] 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 20/53] 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 21/53] 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 22/53] 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 23/53] 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 24/53] 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 25/53] 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 26/53] 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 27/53] 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 28/53] 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 29/53] 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 30/53] 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 31/53] 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 32/53] 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 33/53] 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 34/53] 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 35/53] 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 36/53] 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 37/53] 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 38/53] 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 39/53] 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 55ed9df5fd142f755a9e8c16acc82a80cc1b71b3 Mon Sep 17 00:00:00 2001 From: "DESKTOP-IGP0G3D\\Administrator" Date: Wed, 14 Apr 2021 14:35:16 +0800 Subject: [PATCH 40/53] upload version wechat-applet --- lib/crypto.js | 280 +------ package.json | 16 +- solidity-example/solidity-TableTxs.sol | 158 ---- solidity-example/solidity-example.sol | 54 -- src/index.js | 12 - src/smartContract.js | 1035 ------------------------ test/contract-tabletxs-test.js | 520 ------------ test/server-test.js | 138 ---- test/server.js | 153 ---- test/smartContractTest.js | 177 ---- test/table-contract-test.js | 197 ----- test/test.js | 1 - test/testContractGatewayTxs.js | 307 ------- test/testContractTableTxs.js | 413 ---------- test/testSchema.js | 201 ----- test/testSign.js | 117 --- test/testwss.js | 24 + 17 files changed, 28 insertions(+), 3775 deletions(-) delete mode 100644 solidity-example/solidity-TableTxs.sol delete mode 100644 solidity-example/solidity-example.sol delete mode 100644 src/smartContract.js delete mode 100644 test/contract-tabletxs-test.js delete mode 100644 test/server-test.js delete mode 100644 test/server.js delete mode 100644 test/smartContractTest.js delete mode 100644 test/table-contract-test.js delete mode 100644 test/testContractGatewayTxs.js delete mode 100644 test/testContractTableTxs.js delete mode 100644 test/testSchema.js delete mode 100644 test/testSign.js create mode 100644 test/testwss.js diff --git a/lib/crypto.js b/lib/crypto.js index 9becf93..a05db3c 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -2,16 +2,10 @@ // requires const keypairs = require('chainsql-keypairs'); -const hashjs = require('hash.js'); -const elliptic = require('elliptic'); -const Secp256k1 = elliptic.ec('secp256k1'); -const addressCodec = require('chainsql-address-codec'); - //var debug = require('debug')('crypto'); var crypto = require('crypto'); var sjcl = require('sjcl'); -var ProtoBuf = require("protobufjs") var zlib = require('zlib'); const _ = require('lodash'); @@ -26,118 +20,6 @@ var IVLength = 16; // bytes var ACCOUNT_PUBLIC = 35; var PUBLICKEY_LENGTH = 33; -function eciesEncrypt(message, publicKey) { - var plainMsgBuf = Buffer.from(message, 'utf8'); - - if(!publicKey) - throw new Error('eciesEncrypt publicKey is undefined'); - - if(publicKey.length != 2 * PUBLICKEY_LENGTH){ - var decodedPublic = decodePublic(publicKey); - publicKey = Bytes2HexString(decodedPublic); - } - var ecdsaRecipientPublicKey = Secp256k1.keyFromPublic(publicKey, 'hex'); - - // Generate ephemeral key-pair - const seed = keypairs.generateSeed(); - const ephKeyPair = keypairs.deriveKeypair(seed); - var ephPrivKey = Secp256k1.keyFromPrivate(ephKeyPair.privateKey, 'hex'); - var Rb = ephKeyPair.publicKey; - //console.log("ephKeyPair.publicKey:",Rb); - - //const alice = crypto.createECDH('secp256k1'); - //alice.setPrivateKey(ephPrivKey.getPrivate('hex'), 'hex'); - //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(); - //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); - var hmacKey = kdfOutput.slice(AESKeyLength, AESKeyLength + HMACKeyLength); - //console.log('[aesKey] ', new Buffer(aesKey).toString('hex')); - //console.log('[hmacKey] ', new Buffer(hmacKey, 'hex')); - var iv = crypto.randomBytes(IVLength); - var D = hmac(hmacKey, plainMsgBuf); - var cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(aesKey), iv); - var plainBuf = Buffer.concat([Buffer.from(D), plainMsgBuf]); - //console.log('[decryptedBytes] ', plainBuf.toString('hex')+" len="+plainBuf.length); - var encryptedBytes = cipher.update(plainBuf); - encryptedBytes = Buffer.concat([encryptedBytes, cipher.final()]); - //console.log('[iv] ', iv.toString('hex')+" len="+iv.length); - //console.log('[D] ', new Buffer(D).toString('hex')+" len="+D.length); - //console.log('[encryptedBytes] ', encryptedBytes.toString('hex')+" len="+encryptedBytes.length); - return Buffer.concat([Buffer.from(Rb, 'hex'), iv, encryptedBytes]).toString('hex'); -} - -function eciesDecrypt(messageHex, privateKey) { - var level = 256; - var Rb_len = 33; - var D_len = level >> 3; - var cipherText = Buffer.from(messageHex, 'hex'); - var ct_len = cipherText.length; - - if (ct_len < Rb_len + IVLength + D_len + AESBlockLength) - throw new Error("Illegal cipherText length: " + ct_len + " must be >= " + (Rb_len + IVLength + D_len + AESBlockLength)); - - var Rb = cipherText.slice(0, Rb_len); // ephemeral public key bytes - var iv = cipherText.slice(Rb_len, Rb_len + IVLength); - //console.log('[iv] ', iv.toString('hex')+" len="+iv.length); - var EM = cipherText.slice(Rb_len + IVLength); // encrypted content bytes - //console.log('[encryptedBytes] ', EM.toString('hex')+" len="+EM.length); - var ecdsa = Secp256k1; - //convert bytes to usable key object - //var ephPubKey = ecdsa.keyFromPublic(ephKeyPair.publicKey, 'hex'); - 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(); - //var kdfOutput = hkdf(Z.toArray(), ECIESKDFOutput, null, null); - var aesKey = kdfOutput.slice(0, AESKeyLength); - var hmacKey = kdfOutput.slice(AESKeyLength, AESKeyLength + HMACKeyLength); - //console.log('[aesKey] ', new Buffer(aesKey, 'hex')); - //console.log('[hmacKey] ', new Buffer(hmacKey, 'hex')); - - var cipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(aesKey), iv); - var decryptedBytes = cipher.update(EM); - decryptedBytes = Buffer.concat([decryptedBytes, cipher.final()]); - //console.log('[decryptedBytes] ', decryptedBytes.toString('hex')+" len="+decryptedBytes.length); - var D = decryptedBytes.slice(0, D_len); - var plainMsgBuf = Buffer.from(decryptedBytes.slice(D_len)); - - var recoveredD = hmac(hmacKey, plainMsgBuf); - //debug('recoveredD: ', new Buffer(recoveredD).toString('hex')); - if (D.compare(Buffer.from(recoveredD)) != 0) { - // debug("D="+D.toString('hex')+" vs "+new Buffer(recoveredD).toString('hex')); - throw new Error("HMAC verify failed"); - } - //console.log("plainMsg: ",plainMsgBuf.toString()); - return plainMsgBuf; -} - - - -function hmac(key, bytes) { - //debug('key: ', JSON.stringify(key)); - //debug('bytes: ', JSON.stringify(bytes)); - var hmac = new sjcl.misc.hmac(bytesToBits(key), sjcl.hash.sha256); - hmac.update(bytesToBits(bytes)); - var result = hmac.digest(); - //debug("result: ", bitsToBytes(result)); - return bitsToBytes(result); -} - -function decodePublic(publicKey){ - var decoded = addressCodec.decode(publicKey, ACCOUNT_PUBLIC); - return decoded.slice(1,1+PUBLICKEY_LENGTH); -} /** * byte型转换十六进制 * @param b @@ -260,167 +142,7 @@ var aesDecrypt = function(secret, encryptedHex) { return decryptedBytes.toString(); }; -function simpleEncrypt(plainBytes,publicKey,ephPrivKey){ - var Z = ephPrivKey.derive(publicKey.pub); - var kdfOutput = hashjs.sha512().update(Z.toArray()).digest(); - var aesKey = kdfOutput.slice(0, AESKeyLength); - - var iv = crypto.randomBytes(IVLength); - var cipher = crypto.createCipheriv('aes-256-cbc',Buffer.from(aesKey), iv); - //console.log('[decryptedBytes] ', plainBuf.toString('hex')+" len="+plainBuf.length); - var encryptedBytes = cipher.update(plainBytes); - encryptedBytes = Buffer.concat([encryptedBytes, cipher.final()]); - - return Buffer.concat([iv, encryptedBytes]); -} - -function simpleDecrypt(cipherBytes,privateKey,ephPubKey){ - var iv = cipherBytes.slice(0, IVLength); - var EM = cipherBytes.slice(IVLength); // encrypted content bytes - - var Z = privateKey.derive(ephPubKey.pub); - var kdfOutput = hashjs.sha512().update(Z.toArray()).digest(); - //var kdfOutput = hkdf(Z.toArray(), ECIESKDFOutput, null, null); - var aesKey = kdfOutput.slice(0, AESKeyLength); - var cipher = crypto.createDecipheriv('aes-256-cbc',Buffer.from(aesKey), iv); - var decryptedBytes = cipher.update(EM); - decryptedBytes = Buffer.concat([decryptedBytes, cipher.final()]); - - return decryptedBytes; -} - -function quarterSha512(pubBytes){ - var hash = hashjs.sha512().update(pubBytes).digest(); - return hash.slice(0,16); -} - -const zlibCompressText = function(text){ - return new Promise(function(resolve,reject){ - zlib.deflate(text,function(err,res){ - if(err){ - return reject(err); - } - resolve(res); - }) - }) -} - -const zlibDeCompressText = function(text){ - return new Promise(function(resolve,reject){ - zlib.unzip(text,function(err,res){ - if(err){ - return reject(err); - } - resolve(res); - }) - }) -} - -var encryptText = function(plainText,listPublic){ - if(listPublic.length == 0){ - throw new ("PublicKey list is empty"); - } - //AES encrypt - var password = crypto.randomBytes(AESKeyLength); - var aesCipher = aesEncrypt(password,plainText); - - // - 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= 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; - } -}; - -/** - * Deploys a contract and fire events based on its state: transactionHash, receipt - * - * All event listeners will be removed, once the last possible event is fired ("error", or "receipt") - * - * @method deploy - * @param {Object} options - * @param {Function} callback - * @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); - - - // 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); -}; - -/** - * Adds event listeners and creates a subscription. - * - * @method _on - * @param {String} event - * @param {Object} options - * @param {Function} 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); -}; - -/** - * Gets the event signature and outputformatters - * - * @method _generateEventOptions - * @param {Object} event - * @param {Object} options - * @param {Function} callback - * @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 - }; -}; - -/** - * Checks that no listener with name "newListener" or "removeListener" is added. - * - * @method _checkListener - * @param {String} type - * @param {String} event - * @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.'); - } -}; - -/** - * returns the an object with call, send, estimate functions - * - * @method _createTxObject - * @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; -}; - -/** - * Executes a call, transact or estimateGas on a contract function - * - * @method _executeMethod - * @param {String} type the type this execute function should execute - * @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); - } - } -}; - -function errFuncGlobal(errMsg, callback){ - 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); - }); -} - -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); - }); -} -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); -} -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; -} -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); - }); -} - -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); - }); - } -} - -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); - }); - }); -} - -function calculateCtrAddr(ctrOwnerAddr, sequence){ - 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; -} - -function encodeChainsqlAddrParam(types, result){ - 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; -} - -/** - * Get the callback and modiufy the array if necessary - * - * @method _getCallback - * @param {Array} 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! - } -}; - -/** - * Generates the options for the execute call - * - * @method _processExecuteArguments - * @param {Array} args - * @param {Promise} defer - */ -Contract.prototype._processExecuteArguments = function _processExecuteArguments(args/*, defer*/) { - var processedArgs = {}; - - processedArgs.type = args.shift(); - - // 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 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; - - 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.'); - - 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 processedArgs; -}; - -module.exports = Contract; \ No newline at end of file diff --git a/test/contract-tabletxs-test.js b/test/contract-tabletxs-test.js deleted file mode 100644 index 24597fa..0000000 --- a/test/contract-tabletxs-test.js +++ /dev/null @@ -1,520 +0,0 @@ -'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/server-test.js b/test/server-test.js deleted file mode 100644 index bb56eb6..0000000 --- a/test/server-test.js +++ /dev/null @@ -1,138 +0,0 @@ -'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/server.js b/test/server.js deleted file mode 100644 index 9d95924..0000000 --- a/test/server.js +++ /dev/null @@ -1,153 +0,0 @@ -'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'); - -co(function*() { - 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'); - // console.log('连接成功') - // var tb = 'test13323333'; - - // r.as({ - // "secret": "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - // "address": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" - // }); - // r.setRestrict(true); - - // // var data = yield r.api.getLedger(); - // // console.log(data); - // r.api.getLedger({ledgerVersion:1732000}).then(function(data){ - // console.log(data); - // }).catch(function(err){ - // console.log(err); - // }); - - - 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) - } -}) - -console.log("llls") \ No newline at end of file diff --git a/test/smartContractTest.js b/test/smartContractTest.js deleted file mode 100644 index 931627c..0000000 --- a/test/smartContractTest.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; - -//const fs = require ('fs'); -//const solc = require('solc'); -const ChainsqlAPI = require("../src/index"); -const chainsql = 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"; - - -main(); - -async function main(){ - try { - await chainsql.connect("ws://127.0.0.1:6006"); - console.log("connected successfully"); - - chainsql.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-contract-test.js b/test/table-contract-test.js deleted file mode 100644 index 6b221e6..0000000 --- a/test/table-contract-test.js +++ /dev/null @@ -1,197 +0,0 @@ -"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/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/testContractGatewayTxs.js b/test/testContractGatewayTxs.js deleted file mode 100644 index d716b90..0000000 --- a/test/testContractGatewayTxs.js +++ /dev/null @@ -1,307 +0,0 @@ -'use strict' -const ChainsqlAPI = require('../src/index'); -const c = new ChainsqlAPI(); - -var root = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" -} - -const userGateway = { - secret: "xx9viuN9bsUxJxUGuJ8ehmzuT7BfB", - address: "zL296sU2wCdBCCEQirwKDgrp7EnjcTBzVq" -}; - -const userA = { - secret: "xcfUcfbzpjtSUCcTCeXJFjrTkhpXj", - address: "zhp1ebWV3sZmntMgpPDdSdM6xATb1Mgyzc" -}; -const userB = { - secret: "xxbUtZQWXmJgLwqqgnEFY9cJvVyfr", - address: "zGSyDNzNbQeuKS3L8gf2MBLAVsSShfm9Wi" -}; - - -var myContract; - -const contractAddr = "zwvgh6WAr3GbjsopgpQmhciHjcPwC7LU8h"; - -const abi = '[{"constant":true,"inputs":[{"name":"contractAddr","type":"address"},{"name":"sCurrency","type":"string"},{"name":"power","type":"uint64"},{"name":"gateWay","type":"address"}],"name":"trustLimit","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"string"},{"name":"sCurrency","type":"string"},{"name":"gateWay","type":"address"}],"name":"trustSet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"accountTo","type":"address"},{"name":"value","type":"string"},{"name":"sendMax","type":"string"},{"name":"sCurrency","type":"string"},{"name":"gateWay","type":"address"}],"name":"pay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"contractAddr","type":"address"},{"name":"sCurrency","type":"string"},{"name":"power","type":"uint64"},{"name":"gateWay","type":"address"}],"name":"gatewayBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contractAddr","type":"address"},{"name":"accountTo","type":"address"},{"name":"value","type":"string"},{"name":"sendMax","type":"string"},{"name":"sCurrency","type":"string"},{"name":"gateWay","type":"address"}],"name":"gatewayPay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"uFlag","type":"uint32"},{"name":"bSet","type":"bool"}],"name":"accountSet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sRate","type":"string"},{"name":"minFee","type":"string"},{"name":"maxFee","type":"string"}],"name":"setTransferFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"sCurrency","type":"string"},{"name":"power","type":"uint64"},{"name":"gateWay","type":"address"}],"name":"trustLimit","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contractAddr","type":"address"},{"name":"value","type":"string"},{"name":"sCurrency","type":"string"},{"name":"gateWay","type":"address"}],"name":"trustSet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"sCurrency","type":"string"},{"name":"power","type":"uint64"},{"name":"gateWay","type":"address"}],"name":"gatewayBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]'; -const deployBytecode = '0x608060405234801561001057600080fd5b50611239806100206000396000f3006080604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806334bcb956146100a6578063399d32c0146101d65780634262b061146103555780636e7146be1461058b578063bd1e7722146106bb578063e66256b014610911578063e7092c191461095e578063f5b960ab14610b54578063f812ecd314610c64578063f824e6f814610e03575b005b3480156100b257600080fd5b506101c0600480360360808110156100c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561010657600080fd5b82018360208201111561011857600080fd5b8035906020019184600183028401116401000000008311171561013a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803567ffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f13565b6040518082815260200191505060405180910390f35b3480156101e257600080fd5b50610353600480360360608110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102ad57600080fd5b8201836020820111156102bf57600080fd5b803590602001918460018302840111640100000000831117156102e157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b005b34801561036157600080fd5b50610589600480360360a081101561037857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103b557600080fd5b8201836020820111156103c757600080fd5b803590602001918460018302840111640100000000831117156103e957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561044c57600080fd5b82018360208201111561045e57600080fd5b8035906020019184600183028401116401000000008311171561048057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104e357600080fd5b8201836020820111156104f557600080fd5b8035906020019184600183028401116401000000008311171561051757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fa5565b005b34801561059757600080fd5b506106a5600480360360808110156105ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156105eb57600080fd5b8201836020820111156105fd57600080fd5b8035906020019184600183028401116401000000008311171561061f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803567ffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611000565b6040518082815260200191505060405180910390f35b3480156106c757600080fd5b5061090f600480360360c08110156106de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561073b57600080fd5b82018360208201111561074d57600080fd5b8035906020019184600183028401116401000000008311171561076f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107d257600080fd5b8201836020820111156107e457600080fd5b8035906020019184600183028401116401000000008311171561080657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561086957600080fd5b82018360208201111561087b57600080fd5b8035906020019184600183028401116401000000008311171561089d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611047565b005b34801561091d57600080fd5b5061095c6004803603604081101561093457600080fd5b81019080803563ffffffff1690602001909291908035151590602001909291905050506110a3565b005b34801561096a57600080fd5b50610b526004803603606081101561098157600080fd5b810190808035906020019064010000000081111561099e57600080fd5b8201836020820111156109b057600080fd5b803590602001918460018302840111640100000000831117156109d257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a3557600080fd5b820183602082011115610a4757600080fd5b80359060200191846001830284011164010000000083111715610a6957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610acc57600080fd5b820183602082011115610ade57600080fd5b80359060200191846001830284011164010000000083111715610b0057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506110e2565b005b348015610b6057600080fd5b50610c4e60048036036060811015610b7757600080fd5b8101908080359060200190640100000000811115610b9457600080fd5b820183602082011115610ba657600080fd5b80359060200191846001830284011164010000000083111715610bc857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803567ffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611135565b6040518082815260200191505060405180910390f35b348015610c7057600080fd5b50610e0160048036036080811015610c8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610cc457600080fd5b820183602082011115610cd657600080fd5b80359060200191846001830284011164010000000083111715610cf857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610d5b57600080fd5b820183602082011115610d6d57600080fd5b80359060200191846001830284011164010000000083111715610d8f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061117b565b005b348015610e0f57600080fd5b50610efd60048036036060811015610e2657600080fd5b8101908080359060200190640100000000811115610e4357600080fd5b820183602082011115610e5557600080fd5b80359060200191846001830284011164010000000083111715610e7757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803567ffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111c7565b6040518082815260200191505060405180910390f35b6000808573ffffffffffffffffffffffffffffffffffffffff16858051906020018667ffffffffffffffff16868082858588d5945050505050905080915050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1683805190602001848051906020018580838387878ad495505050505050158015610f9f573d6000803e3d6000d15b50505050565b3373ffffffffffffffffffffffffffffffffffffffff168585805190602001868051906020018780519060200188888888888888888888d798505050505050505050158015610ff8573d6000803e3d6000d15b505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff16858051906020018667ffffffffffffffff16868082858588d6945050505050905080915050949350505050565b8573ffffffffffffffffffffffffffffffffffffffff168585805190602001868051906020018780519060200188888888888888888888d79850505050505050505015801561109a573d6000803e3d6000d15b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168263ffffffff16821515808284d2925050501580156110dd573d6000803e3d6000d15b505050565b3373ffffffffffffffffffffffffffffffffffffffff168380519060200184805190602001858051906020018181858589898cd3965050505050505015801561112f573d6000803e3d6000d15b50505050565b6000803373ffffffffffffffffffffffffffffffffffffffff16858051906020018667ffffffffffffffff16868082858588d59450505050509050809150509392505050565b8373ffffffffffffffffffffffffffffffffffffffff1683805190602001848051906020018580838387878ad4955050505050501580156111c0573d6000803e3d6000d15b5050505050565b6000803373ffffffffffffffffffffffffffffffffffffffff16858051906020018667ffffffffffffffff16868082858588d694505050505090508091505093925050505600a165627a7a723058200ef04cabf78c5e8e07ec161162783cdbc3ccdacdc6f9e10828e961030b69a8a00029'; -//solidity code: solidity-example/solidity-GatewayTxs.sol - -var tagStep = { - active: 1, deployContract: 2, callContract: 3 -} - -main(); -async function main() { - - let res = await c.connect('ws://192.168.29.115:6005'); - console.log(" connect successfully.") - c.setRestrict(true); - - let nStep = tagStep.callContract; - - if(nStep == tagStep.active ){ - - active(); - }else if(nStep == tagStep.deployContract){ - - deployContract(); - }else{ - - c.as(root); - myContract = c.contract(JSON.parse(abi), contractAddr); - - - try{ - - // await accountSet(); - // await setTransferFee(); - // await trustSet(); - // await trustSetContract(); - // await trustLimit(); - // await trustLimitContract(); - // await payCurrency(); - - await payCurrencyContract(); - await gatewayBalanceContract(); - - }catch(error){ - - console.log(error); - - } - - - console.log(" end ") - } - - - - /**************************************/ -} - -async function deployContract() { - c.as(root) - myContract = c.contract(JSON.parse(abi)); - try { - let deployRes = await myContract.deploy( - { - ContractData: deployBytecode, - }).submit({ - Gas: '5000000', - - }); - 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(userGateway.address, amount).submit({ expect: 'validate_success' }) - console.log("\n userGateway", userGateway.address, ":", res) - res = await c.pay(userA.address, amount).submit({ expect: 'validate_success' }) - console.log("\n userA", userA.address, ":", res) - res = await c.pay(userB.address, amount).submit({ expect: 'validate_success' }) - console.log("\n userB", userB.address, ":", res) - console.log("\n----------- active <<<<<<<<<<<<<"); -} - -async function accountSet() { - c.as(userGateway); - - try { - let res = await myContract.methods.accountSet(8, true).submit({ - Gas: 500000, - expect: "validate_success" - }); - - console.log(" account_set res:", res) - - } catch (error) { - console.log(error); - } - - -} - -async function setTransferFee() { - c.as(userGateway) - //发交易调用合约 - try { - let res = await myContract.methods.setTransferFee("1.002", "10","20").submit({ - Gas: 500000, - expect: "validate_success" - }); - - console.log(" setTransferFee res:", res); - } catch (error) { - console.log(error); - } -} - -//用户 设置信任网关代币以及代币的额度 -async function trustSet() { - - c.as(userA); - let res = await myContract.methods.trustSet("10000","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" userA trustSet result:", res); - - c.as(userB); - res = await myContract.methods.trustSet("10000","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" userB trustSet result:", res); -} - - -// 合约 设置信任网关代币以及代币的额度 -async function trustSetContract() { - - c.as(userA); - let res = await myContract.methods.trustSet(contractAddr,"10000","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" trustSetContract result:", res); -} - -//查询网关的信任代币信息,传入代币名称、网关地址、精度,传入0时,nodejs返回小数点前数值,传入1时,返回值乘以10的一次方的结果,传入2时返回乘以10的二次方的结果... -//以此类推,因为solidity的返回值为int类型,不支持浮点 -async function trustLimit() { - c.as(userA); - //参数:代币名称、额度、网关地址 - let res = await myContract.methods.trustLimit("AAA",0,userGateway.address).call({ - Gas: 50000000 - }); - - console.log(" userA trustLimit result:", res); - - - - c.as(userB); - //参数:代币名称、额度、网关地址 - res = await myContract.methods.trustLimit("AAA",0,userGateway.address).call({ - Gas: 50000000 - }); - - console.log(" userB trustLimit result:", res); -} - -async function trustLimitContract() { - c.as(userA); - //参数:合约地址,代币名称,额度,网关地址 - let res = await myContract.methods.trustLimit(contractAddr,"AAA",0,userGateway.address).call({ - Gas: 50000000 - }); - - console.log(" trustLimitContract result:", res); -} - - -async function gatewayBalance() { - - c.as(userA); - let result = await myContract.methods.gatewayBalance("AAA",0,userGateway.address).call({ - Gas: 50000000 - }); - - console.log(" userA gatewayBalance:", result); - - c.as(userB); - result = await myContract.methods.gatewayBalance("AAA",0,userGateway.address).call({ - Gas: 50000000 - }); - - console.log(" userB gatewayBalance:", result); - - result = await myContract.methods.gatewayBalance(contractAddr,"AAA",0,userGateway.address).call({ - Gas: 50000000 - }); - - console.log(" contractAddr gatewayBalance:", result); -} - - -async function gatewayBalanceContract() { - c.as(userA); - let res = await myContract.methods.gatewayBalance(contractAddr,"AAA",0,userGateway.address).call({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" gatewayBalance result:", res); -} - - -// 普通用户 转账代币 -async function payCurrency() { - - c.as(userGateway); - //转入账户,代币数量,消耗代币的最大值,代币名称,网关地址 - var res = await myContract.methods.pay(userA.address,"500","800","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" userGateway to userA ", res); - - res = await myContract.methods.pay(userB.address,"500","800","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" userGateway to userB ", res); - - c.as(userA); - res = await myContract.methods.pay(userB.address,"500","800","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - - console.log(" userA to userB ", res); - - await gatewayBalance(); - -} - -// 合约 转账代币 -async function payCurrencyContract() { - - c.as(userGateway); - let res = await myContract.methods.pay(contractAddr,"500","800","AAA",userGateway.address).submit({ - Gas: 50000000, - expect:"validate_success" - }); - console.log(" userGateway to contractAddr ", res); - - //合约地址,转入账户,代币数量,消耗代币的最大值,代币名称,网关地址 - res = await myContract.methods.gatewayPay(contractAddr,userB.address,"50","80","AAA",userGateway.address).submit({ - Gas: 50000000 - }); - - console.log(" contractAddr to userB ", res); - res = await myContract.methods.gatewayPay(contractAddr,userA.address,"50","80","AAA",userGateway.address).submit({ - Gas: 50000000 - }); - - console.log(" contractAddr to userA ", res); - - await gatewayBalance(); -} \ No newline at end of file diff --git a/test/testContractTableTxs.js b/test/testContractTableTxs.js deleted file mode 100644 index 9fd3b82..0000000 --- a/test/testContractTableTxs.js +++ /dev/null @@ -1,413 +0,0 @@ -'use strict' -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 smRoot = { - secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", - address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj" -} - -const smUser = { - secret: "pw5MLePoMLs1DA8y7CgRZWw6NfHik7ZARg8Wp2pr44vVKrpSeUV", - address: "zKzpkRTZPtsaQ733G8aRRG5x5Z2bTqhGbt", - publicKey: "pYvKjFb71Qrx26jpfMPAkpN1zfr5WTQoHCpsEtE98ZrBCv2EoxEs4rmWR7DcqTwSwEY81opTgL7pzZ2rZ3948vHi4H23vnY3" -}; - - -var userOperation = user; - -var user1 = { - address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", - secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" -} - -var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; -var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; - -var sTableName = "n3"; -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\": 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 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":"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 = { - 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 smRoot = { - secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", - address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", - publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9UYaSVLp29RhtxxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' -} - - -main(); -async function main() { - - 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 = "zGAcwQoo5xqHKy42waq9d2Tb6Myn2MyvJf"; - let nStep = tagStep.table_transaction; - // 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(smRoot) - 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(smRoot); - var amount = 20000 - console.log("----------- 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(smRoot) - //发交易调用合约 - 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(smRoot) - try { - myContract.methods.grant(smUser.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_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(smUser) - try { - // 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); - // }); - // } - } 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(smUser) - c.use(smRoot.address) - try { - myContract.methods.sqlTransaction(smRoot.address,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/testSchema.js b/test/testSchema.js deleted file mode 100644 index 9056d24..0000000 --- a/test/testSchema.js +++ /dev/null @@ -1,201 +0,0 @@ -'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 diff --git a/test/testSign.js b/test/testSign.js deleted file mode 100644 index ebbbd4f..0000000 --- a/test/testSign.js +++ /dev/null @@ -1,117 +0,0 @@ -"use strict"; - -// const RippleAPI = new require('ripple-lib').RippleAPI; -// const api = new RippleAPI({server: ""}); -const ChainsqlAPI = require('../src/index'); -const c = new ChainsqlAPI(); -const co = require('co') - -var user = { - secret: "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - address: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - publickKey: "aBQG8RQAzjs1eTKFEAQXr2gS4utcDiEC9wmi7pfUPTi27VCahwgw" -}; - -co(function*(){ - - // yield c.connect('ws://139.198.11.189:6006'); - yield c.connect('ws://127.0.0.1:6007'); - console.log('连接成功') - - let info = yield c.api.getAccountInfo("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); - console.log(info); - c.getLedgerVersion(function(err,data){ - var payment = { - "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount":"1000000000", - "Destination": "rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q", - "TransactionType": "Payment", - "Sequence": info.sequence, - "LastLedgerSequence":data + 5, - "Fee":"50" - } - let signedRet = c.sign(payment,user.secret); - console.log(signedRet); - 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); - // }).catch(function(err){ - // console.log(err); - // }) - // },5000); - }); - - - - -// return; -// info = yield c.api.getAccountInfo("rsM2GxUgR6jhEDijLTymqrwKZqtGSKj7RQ"); -// var signerListSet = { -// "TransactionType": "SignerListSet", -// "Account": "rsM2GxUgR6jhEDijLTymqrwKZqtGSKj7RQ", -// "SignerQuorum": 3, -// "SignerEntries": [ -// { -// "SignerEntry": { -// "Account": "rDsFXt1KRDNNckSh3exyTqkQeBKQCXawb2", -// "SignerWeight": 2 -// } -// }, -// { -// "SignerEntry": { -// "Account": "rPeRx9WUAivWPpqJnT1ZkDV5r845Rui1Mp", -// "SignerWeight": 1 -// } -// }, -// { -// "SignerEntry": { -// "Account": "rL9UctLXeQmvdX6T7JR4yNz2dmgtN8awzq", -// "SignerWeight": 1 -// } -// } -// ], -// "Sequence": info.sequence, -// "Fee":"100" -// }; - -// signedRet = c.sign(signerListSet,"snfAitAq37xgeBMBv8YHNsWiczoBP"); -// console.log("SignerListSet:"); -// console.log(signedRet); -// subRet = yield c.api.submit(signedRet.signedTransaction); -// console.log("submit SignerListSet:"); -// console.log(subRet); - -// info = yield c.api.getAccountInfo("rB8A3mG8ZarktJte6vnHuDPv9bp3N6Jh42"); -// var trustSet = { -// "TransactionType": "TrustSet", -// "Account": "rB8A3mG8ZarktJte6vnHuDPv9bp3N6Jh42", -// "Flags": 262144, -// "LimitAmount": { -// "currency": "GRD", -// "issuer": "rnbVkKgxyGa6jfYyzyNPwWCLeoc7DEsgLi", -// "value": "100" -// }, -// "Sequence": info.sequence, -// "SigningPubKey": "", -// "Fee": "30000" -// }; -// var option = {signAs:"rDsFXt1KRDNNckSh3exyTqkQeBKQCXawb2"}; -// let signForRet = c.signFor(trustSet,"saNWbrQwrZa9F24zeYZnnK4dPqWkw",option); -// subRet = yield c.api.submit(signedRet.signedTransaction); -// console.log("submit multisign:"); -// console.log(subRet); -}) diff --git a/test/testwss.js b/test/testwss.js new file mode 100644 index 0000000..61bdff3 --- /dev/null +++ b/test/testwss.js @@ -0,0 +1,24 @@ +'use strict' + +const ChainsqlAPI = require('../src/index'); +// ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); +const c = new ChainsqlAPI(); + +var owner = { + secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", + address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" +} + + +main(); + +async function main(){ + try { + await c.connect('wss://192.168.29.69:6006'); + c.as(owner); + let rs = await c.pay(account,2000).submit({expect:'validate_success'}); + console.log(rs); + }catch(e){ + console.error(e); + } +} \ No newline at end of file From fd5002373a12708733070e8263001b2142015d8d Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 22 Apr 2021 15:48:14 +0800 Subject: [PATCH 41/53] rm table for wechat applet --- package.json | 7 +- src/index.js | 365 ----------------- src/table.js | 503 ------------------------ src/tablePayment.js | 127 ------ test/callback2Promise.js | 28 -- test/crypto-test.js | 63 --- test/gateway-test.js | 406 ------------------- test/ripple-test.js | 73 ---- test/table-test.js | 192 --------- test/test.js | 758 ------------------------------------ test/testCrypto.js | 22 -- test/testRipple.js | 235 ----------- test/testSignatureVerify.js | 57 --- test/testTable.js | 298 -------------- test/testTxSign.js | 83 ---- test/test_chainsql_scene.js | 429 -------------------- test/testwss.js | 24 -- 17 files changed, 1 insertion(+), 3669 deletions(-) delete mode 100644 src/table.js delete mode 100644 src/tablePayment.js delete mode 100644 test/callback2Promise.js delete mode 100644 test/crypto-test.js delete mode 100644 test/gateway-test.js delete mode 100644 test/ripple-test.js delete mode 100644 test/table-test.js delete mode 100644 test/test.js delete mode 100644 test/testCrypto.js delete mode 100644 test/testRipple.js delete mode 100644 test/testSignatureVerify.js delete mode 100644 test/testTable.js delete mode 100644 test/testTxSign.js delete mode 100644 test/test_chainsql_scene.js delete mode 100644 test/testwss.js diff --git a/package.json b/package.json index 56153cc..1bc1fc3 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,12 @@ "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { - "test": "mocha" }, "dependencies": { "chainsql-keypairs": "^0.11.1", - "chainsql-lib": "^1.0.3", + "chainsql-lib-applet": "^1.0.8", "lodash": "^4.17.21" }, - "devDependencies": { - "mocha": "~2.3.3", - "chai": "^4.2.0" - }, "repository": { "type": "git", "url": "git+https://github.com/chainsql/node-chainsql-api" diff --git a/src/index.js b/src/index.js index cd5f26e..d71e41b 100644 --- a/src/index.js +++ b/src/index.js @@ -10,13 +10,11 @@ const Ripple = require('./ripple'); 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 Connection = require('./connect'); -const Table = require('./table'); const util = require('../lib/util'); const { utils } = require('elliptic'); const opType = require('../lib/config').opType; @@ -140,16 +138,6 @@ ChainsqlAPI.prototype.setRestrict = function (mode) { ChainsqlAPI.prototype.setNeedVerify = function (isNeed) { isNeed ? this.needVerify = 1 : this.needVerify = 0; } -ChainsqlAPI.prototype.table = function (name) { - this.tab = new Table(name, this); - if (this.transaction) { - this.tab.transaction = this.transaction; - this.tab.cache = this.cache; - } - this.tab.strictMode = this.strictMode; - this.tab.event = this.event; - return this.tab; -} ChainsqlAPI.prototype.generateAddress = function () { @@ -187,55 +175,6 @@ ChainsqlAPI.prototype.generateAddress = function () { return account; } -// active account -function paymentSetting(ChainSQL, account, resolve, reject) { - try { - let userInfo = { - "domain": "www.peersafe.com", - "memos": [{ - "type": "USERINFO", - "format": "plain/text", - "data": "" - }] - }; - //设置用户信息 - userInfo.memos[0].data = JSON.stringify(_.omit(data, ['pwd'])); - ChainSQL.api.prepareSettings(account.address, userInfo) - .then(function (data) { - //console.log('prepareSettings: ', JSON.stringify(data)); - try { - let signedRet = ChainSQL.api.sign(data.txJSON, account.secret); - return ChainSQL.api.submit(signedRet.signedTransaction); - } - catch (error) { - //console.log('sign prepareSettings failure.', JSON.stringify(error)); - reject(error); - } - }) - .then(function (data) { - //console.log('sign prepareSetting: ', JSON.stringify(data)); - if (data.resultCode === 'tesSUCCESS') { - resolve({ - status: 0, - message: '' - }); - } else { - reject({ - status: -1, - message: data.resultMessage - }); - } - }) - .catch(function (error) { - reject(error); - }); - } - catch (error) { - reject(error); - } - -} - ChainsqlAPI.prototype.pay = function (account, amount, memos) { let ripple = new Ripple(this); return ripple.preparePayment(account, amount, memos); @@ -271,228 +210,6 @@ ChainsqlAPI.prototype.escrowCancel = function (sOwnerAddr, nCreateEscrowSeq) { return ripple.escrowCancel(sOwnerAddr, nCreateEscrowSeq); } -ChainsqlAPI.prototype.createTable = function (name, raw, inputOpt) { - validate.create(name,raw); - var opt = inputOpt ? inputOpt : {}; - let that = this; - var confidential = false; - if (opt.confidential) { - confidential = opt.confidential; - } - // console.log(JSON.stringify(opt.operationRule)); - if (that.transaction) { - var json = { - OpType: opType['t_create'], - TableName: name, - Raw: raw, - confidential: confidential, - OperationRule: opt.operationRule ? convertStringToHex(JSON.stringify(opt.operationRule)) : undefined - }; - - this.cache.push(json); - return; - } else { - let payment = { - address: that.connect.address, - opType: opType['t_create'], - tables: [{ - Table: { - TableName: convertStringToHex(name) - } - }], - raw: JSON.stringify(raw), - tsType: 'TableListSet', - operationRule: opt.operationRule ? JSON.stringify(opt.operationRule) : undefined - }; - - if (confidential) { - 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(); - }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(); - } - - // - console.log("after :",payment.raw); - - payment.token = token.toUpperCase(); - - console.log("token :",payment.token); - } else { - payment.raw = convertStringToHex(payment.raw); - } - if (payment.operationRule) { - payment.operationRule = convertStringToHex(payment.operationRule); - } - this.payment = payment; - return this; - } -} - -ChainsqlAPI.prototype.recreateTable = function (name) { - let that = this; - if (that.transaction) { - var json = { - OpType: opType['t_recreate'], - TableName: name, - confidential: confidential - }; - this.cache.push(json); - return; - } else { - let payment = { - address: that.connect.address, - opType: opType['t_recreate'], - tables: [{ - Table: { - TableName: convertStringToHex(name) - } - }], - tsType: 'TableListSet' - }; - this.payment = payment; - return this; - } -} - -ChainsqlAPI.prototype.dropTable = function (name) { - let that = this; - if (that.transaction) { - this.cache.push({ - OpType: opType['t_drop'], - TableName: name - }); - return; - } else { - let payment = { - address: that.connect.address, - opType: opType['t_drop'], - tables: [{ - Table: { - TableName: convertStringToHex(name) - } - }], - tsType: 'TableListSet' - }; - this.payment = payment; - 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") - } - let that = this; - if (that.transaction) { - this.cache.push({ - OpType: opType['t_rename'], - TableName: name, - Raw: raw - }); - return; - } else { - let payment = { - address: that.connect.address, - opType: opType['t_rename'], - tables: [{ - Table: { - TableName: convertStringToHex(oldName), - TableNewName: convertStringToHex(newName) - } - }], - tsType: 'TableListSet' - } - - this.payment = payment; - return this; - } -} -ChainsqlAPI.prototype.grant = function (name, user, flags, publicKey) { - if (!(name && user && flags)) throw chainsqlError('args is not enough'); - if (!util.checkUserMatchPublicKey(user, publicKey)) { - throw chainsqlError('Publickey does not match User'); - } - - let that = this; - if (that.transaction) { - this.cache.push({ - OpType: opType['t_grant'], - TableName: name, - Raw: [flags], - publicKey: publicKey, - User: user - }); - return; - } else { - let payment = { - address: that.connect.address, - opType: opType['t_grant'], - tables: [{ - Table: { - TableName: convertStringToHex(name) - } - }], - raw: convertStringToHex(JSON.stringify([flags])), - user: user, - tsType: 'TableListSet', - name: name, - publicKey: publicKey - }; - this.payment = payment; - return this; - } -} - ChainsqlAPI.prototype.getAccountInfo = function (address, cb) { if ((typeof cb) === "undefined") { return this.api.getAccountInfo(address); @@ -816,35 +533,6 @@ ChainsqlAPI.prototype.commit = function (cb) { } }; -function handleGrantPayment(ChainSQL) { - return new Promise((resolve, reject) => { - if (ChainSQL.payment.opType != opType['t_grant']) - reject(chainsqlError('Type of payment must be t_grant')); - - var name = ChainSQL.payment.name; - var publicKey = ChainSQL.payment.publicKey; - getUserToken(ChainSQL.api.connection, ChainSQL.connect.address, ChainSQL.connect.address, name).then(function (data) { - var token = data[ChainSQL.connect.address + name]; - if (token != '') { - var secret = decodeToken(ChainSQL, token); - try { - token = generateToken(publicKey, secret).toUpperCase(); - } catch (e) { - reject(chainsqlError('your publicKey is not validate')); - } - ChainSQL.payment.token = token; - console.log("token : ",token) - } - delete ChainSQL.payment.name; - delete ChainSQL.payment.publicKey; - - resolve(); - }).catch(error => { - reject(error); - }); - }) -} - ChainsqlAPI.prototype.sign = function (json, secret, option) { if (!json.Fee) { json.Fee = "50"; @@ -1105,23 +793,6 @@ ChainsqlAPI.prototype.prepareJson = function(){ reject(error) }); - }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); - } } }) } @@ -1242,21 +913,6 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ 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; @@ -1293,31 +949,10 @@ 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; - }; - - function callback(data, callback) { } diff --git a/src/table.js b/src/table.js deleted file mode 100644 index 34adee7..0000000 --- a/src/table.js +++ /dev/null @@ -1,503 +0,0 @@ -'use strict' -const opType = require('../lib/config').opType; -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) { - super().ChainsqlAPI = ChainsqlAPI; - this.tab = name; - this.query = []; - this.exec = ''; - this.field = null; - this.connect = ChainsqlAPI.connect; - this.cache = []; - this.nameInDB = ''; - this.confidential = true; - this.txsHashFillField = null; - } - - submit (cb) { - var connect = this.connect; - var that = this; - - if (that.exec == 'r_get') { - if (Object.prototype.toString.call(this.query[0]) !== '[object Array]') { - this.query.unshift([]); - } - - if ((typeof cb) != 'function') { - return new Promise(function (resolve, reject) { - handleGetRecord(that, cb, resolve, reject); - }); - } else { - handleGetRecord(that, cb, null, null); - } - } else { - let cbResult = util.parseCb(cb); - if(cbResult.isFunction) { - super.submit(cbResult.expectOpt).then(result => { - cb(null, result); - }).catch(error => { - cb(error, null); - }); - } else { - return new Promise((resolve, reject) => { - super.submit(cbResult.expectOpt).then(result => { - resolve(result); - }).catch(error => { - reject(error); - }); - }); - } - } - } -} - -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 (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); - }) - } else { - this.query.push(raw); - } - if (JSON.stringify(raw).length > 512000) { - throw chainsqlError('Insert too much value,the total value of inserted must not over 512KB') - } - this.exec = 'r_insert'; - if (this.transaction) { - this.cache.push({ - Owner: this.connect.scope, - TableName: this.tab, - Raw: this.query, - OpType: opType[this.exec] - }) - return this; - } else { - return this; - } -} - -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); - - if (field) { - this.field = field; - } - - if (txsHashFillField) { - this.txsHashFillField = txsHashFillField; - } - - this.exec = 'r_update'; - if (this.transaction) { - this.cache.push({ - Owner: this.connect.scope, - TableName: this.tab, - Raw: this.query, - OpType: opType[this.exec] - }) - return; - } else { - return this; - } -} -Table.prototype.delete = function() { - if (!this.tab) throw chainsqlError('you must appoint the table name'); - //if (this.exec !== 'r_get') throw new Error('Object can not hava function delete'); - this.exec = 'r_delete'; - if (this.transaction) { - this.cache.push({ - Owner: this.connect.scope, - TableName: this.tab, - Raw: this.query, - OpType: opType[this.exec] - }) - return; - } else { - return this; - } -} -Table.prototype.assert = function(raw) { - if (!this.transaction) throw chainsqlError('you must begin the transaction first'); - if (!this.tab) throw chainsqlError('you must appoint the table name'); - if (this.transaction) { - this.cache.push({ - Owner: this.connect.scope, - TableName: this.tab, - Raw: that.query, - OpType: opType[this.exec] - }) - return; - } - /*else{ - return this; - }*/ -} -Table.prototype.get = function(raw) { - if (!this.tab) throw chainsqlError('you must appoint the table name'); - if (this.exec !== '') throw chainsqlError('Object can not hava function get'); - if (Object.prototype.toString.call(arguments[0]) === '[object Array]') { - this.query = arguments[0]; - } else { - this.query = Array.prototype.slice.call(arguments); - } - this.exec = 'r_get'; - return this; -} -Table.prototype.withFields = function(field) { - if (this.exec !== 'r_get') throw chainsqlError('Object can not hava function filterWith'); - this.query.unshift(field); - return this; -} -Table.prototype.assert = function(json) { - this.exec = 't_assert'; - this.query.unshift(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') { - var value = item[key]; - var has_index = false; - var has_total = false; - for (var k in value) { - if (k === 'index') - has_index = true; - if (k === 'total') - has_total = true; - } - if (has_index === true && has_total === true) - return true; - } - } - return false; -} - -function hasOrder(item) { - for (var key in item) { - if (key === '$order' && item[key] instanceof Array) { - return true; - } - } - return false; -} - -function hasGroupBy(item) { - for (var key in item) { - if (key === '$group' && item[key] instanceof Array) { - return true; - } - } - return false; -} - -function hasHaving(item) { - for (var key in item) { - if (key === '$$having' && item[key] instanceof Object) { - return true; - } - } - return false; -} - -function hasExtraCond(item) { - if (hasLimit(item) - || hasOrder(item) - || hasGroupBy(item) - || hasHaving(item)) { - return true; - } - return false; -} - -Table.prototype.limit = function(limit) { - if(limit){ - if(typeof(limit.index) != 'number') - throw chainsqlError('limit.index must be a number') - if(typeof(limit.total) != 'number') - throw chainsqlError('limit.total must be a number') - } - if (this.exec !== 'r_get') - throw chainsqlError('Object can not hava function limit'); - - var flag = 0; - var indx = 0; - this.query.forEach(function(item) { - if (hasLimit(item)) { - flag = flag | 1; - return; - } - - //if (hasOrder(item)) { - // flag = flag | 2; - // return; - //} - if (hasExtraCond(item)) { - flag = flag | 2; - return; - } - indx++; - }); - - if (flag == 0) { - this.query.push({}); - indx = this.query.length - 1; - } - - this.query[indx]['$limit'] = limit; - return this; -} - -Table.prototype.order = function(orderObject) { - if (this.exec !== 'r_get') - throw chainsqlError('Object can not hava function limit'); - - var index = 0; - var flag = 0; - this.query.forEach(function(item) { - if (hasOrder(item)) { - flag = flag | 2; - return; - } - - //if (hasLimit(item)) { - // flag = flag | 1; - // return; - //} - if (hasExtraCond(item)) { - flag = flag | 1; - return; - } - index++; - }); - - if (flag === 0) { - this.query.push({}); - index = this.query.length - 1; - } - - var orders = []; - if (Object.prototype.toString.call(orderObject) === '[object Object]') { - orders.push(orderObject); - } else if (Object.prototype.toString.call(orderObject) === '[object Array]') { - orderObject.forEach(function(e) { - orders.push(e); - }); - } - - if ((flag & 2) === 2) { - var temp_this = this; - orders.forEach(function(e) { - temp_this.query[index]['$order'].push(e); - }); - } else { - this.query[index]['$order'] = orders; - } - - return this; -} - -Table.prototype.groupby = function(group) { - if (this.exec !== 'r_get') - throw chainsqlError('Object can not hava function groupby'); - - if (Object.prototype.toString.call(group) != '[object Array]') - throw chainsqlError('Argument of groupby must be string array.'); - - var index = 0; - var flag = 0; - this.query.forEach(function(item) { - if (hasGroupBy(item)) { - flag = flag | 2; - return; - } - - if (hasExtraCond(item)) { - flag = flag | 1; - return; - } - index++; - }); - - if (flag === 0) { - this.query.push({}); - index = this.query.length - 1; - } - - if ((flag & 2) === 2) { - var temp_this = this; - group.forEach(function(e) { - temp_this.query[index]['$group'].push(e); - }); - } else { - this.query[index]['$group'] = group; - } - - return this; -} - -Table.prototype.having = function(value) { - console.log(this.exec) - if (this.exec !== 'r_get') - throw chainsqlError('Object can not hava function having'); - - if (Object.prototype.toString.call(value) != '[object Object]') - throw chainsqlError('Argument of groupby must be Object.'); - - var flag = 0; - var indx = 0; - this.query.forEach(function(item) { - if (hasHaving(item)) { - flag = flag | 1; - return; - } - - if (hasExtraCond(item)) { - flag = flag | 2; - return; - } - indx++; - }); - - if (flag == 0) { - this.query.push({}); - indx = this.query.length - 1; - } - - this.query[indx]['$having'] = value; - return this; -} - -Table.prototype.prepareJson = function() { - var connect = this.connect; - var that = this; - - var payment = { - address: connect.address, - owner: connect.scope, - opType: opType[that.exec], - raw: JSON.stringify(that.query), - strictMode: that.strictMode, - tables: [{ - Table: { - TableName: convertStringToHex(that.tab), - NameInDB: that.nameInDB - } - }], - 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); - }); -} - -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) { - - var isFunction = false; - if ((typeof object) === 'function') - isFunction = true; - - var cb = function(error, data) { - if (isFunction) { - object(error, data); - } else { - if (error) { - reject(error); - } else { - resolve(data); - } - } - }; - - var connect = ChainSQL.connect; - //console.log('select \n\t', JSON.stringify(ChainSQL.query)); - var json = { - Account: connect.address, - Owner: connect.scope, - Tables: [{ - Table: { - TableName: ChainSQL.tab - } - }], - Raw: JSON.stringify(ChainSQL.query) - }; - util.getValidatedLedgerIndex(connect).then(function (ledgerVersion) { - json.LedgerIndex = ledgerVersion; - return util.signData(JSON.stringify(json), ChainSQL.connect.secret); - }).then(function (signed) { - return connect.api.connection.request({ - command: 'r_get', - publicKey: signed.publicKey, - signature: signed.signature, - signingData: JSON.stringify(json), - tx_json: json - }); - }).then(function (data) { - cb(null, data); - }).catch(function (err) { - cb(err, null); - }); -} - -module.exports = Table; \ No newline at end of file diff --git a/src/tablePayment.js b/src/tablePayment.js deleted file mode 100644 index 297e5da..0000000 --- a/src/tablePayment.js +++ /dev/null @@ -1,127 +0,0 @@ -'use strict'; - -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 validate = utils.common.validate; -var toRippledAmount = utils.common.toRippledAmount; -var paymentFlags = utils.common.txFlags.Payment; -var ValidationError = utils.common.errors.ValidationError; - - -function isXRPToXRPPayment(payment) { - var sourceCurrency = _.get(payment, 'source.maxAmount.currency', _.get(payment, 'source.amount.currency')); - var destinationCurrency = _.get(payment, 'destination.amount.currency', _.get(payment, 'destination.minAmount.currency')); - return sourceCurrency === 'ZXC' && destinationCurrency === 'ZXC'; -} - -function isIOUWithoutCounterparty(amount) { - return amount && amount.currency !== 'ZXC' && amount.counterparty === undefined; -} - -function applyAnyCounterpartyEncoding(payment) { - // Convert blank counterparty to sender or receiver's address - // (Ripple convention for 'any counterparty') - // https://ripple.com/build/transactions/ - // #special-issuer-values-for-sendmax-and-amount - // https://ripple.com/build/ripple-rest/#counterparties-in-payments - _.forEach([payment.source, payment.destination], function(adjustment) { - _.forEach(['amount', 'minAmount', 'maxAmount'], function(key) { - if (isIOUWithoutCounterparty(adjustment[key])) { - adjustment[key].counterparty = adjustment.address; - } - }); - }); -} - -function createMaximalAmount(amount) { - var maxXRPValue = '100000000000'; - var maxIOUValue = '9999999999999999e80'; - var maxValue = amount.currency === 'ZXC' ? maxXRPValue : maxIOUValue; - return _.assign({}, amount, { - value: maxValue - }); -} - -function createPaymentTransaction(paymentArgument) { - var payment = _.cloneDeep(paymentArgument); - - var txJSON = { - TransactionType: payment.tsType, - Tables: payment.tables, - TableNewName: payment.tableNewName, - OpType: payment.opType, - Raw: payment.raw, - Account: payment.address, - Owner: payment.owner, - Flags: payment.flags, - User:payment.user, - AutoFillField:payment.autoFillField, - Token:payment.token, - StrictMode: payment.strictMode, - OperationRule: payment.operationRule, - TxsHashFillField:payment.txsHashFillField, - } - return txJSON; -} - -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 }); - let err = checkTablePayment(payment) - if( err != "") return Promise.reject(err); - var txJSON = createPaymentTransaction(payment); - return utils.prepareTransaction(txJSON, chainsqlApi, instructions); -} - -function prepareTable(ChainSQL, payment, resolve, reject) { - - - prepareTablePayment(payment, ChainSQL.api).then(function (tx_json) { - - var dropsPerByte = Math.ceil(1000000.0 / 1024);; - - ChainSQL.api.getServerInfo().then(res => { - - if(res.validatedLedger.dropsPerByte != undefined){ - dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); - } - - // 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 !== undefined - && txJson.Tables[0].Table.NameInDB !== ''){ - - resolve({txJSON:txJson}); - return ; - } - - // 2 get table's NameInDB - getTxJson(ChainSQL, txJson).then(function (data) { - resolve({txJSON:data.tx_json}); - }).catch(function (error) { - reject(error); - }); - - }).catch(err => { - reject(err); - }); - - }).catch(err => { - reject(err); - }); - - -} - -module.exports = prepareTable; \ No newline at end of file diff --git a/test/callback2Promise.js b/test/callback2Promise.js deleted file mode 100644 index 95eb1c6..0000000 --- a/test/callback2Promise.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -var callback2Promise = function(func,opt){ - var self = this; - var f = func; - return new Promise(function(resolve,reject){ - try{ - if(opt){ - func(opt,function(err,data){ - if(err) - reject(err); - resolve(data); - }) - }else{ - (function(err,data){ - if(err) - reject(err); - resolve(data); - }) - } - - }catch(e){ - reject(e); - } - }); -} - -module.exports = callback2Promise; \ No newline at end of file diff --git a/test/crypto-test.js b/test/crypto-test.js deleted file mode 100644 index 680429c..0000000 --- a/test/crypto-test.js +++ /dev/null @@ -1,63 +0,0 @@ -'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 deleted file mode 100644 index 68be548..0000000 --- a/test/gateway-test.js +++ /dev/null @@ -1,406 +0,0 @@ -'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 deleted file mode 100644 index 8cf3aad..0000000 --- a/test/ripple-test.js +++ /dev/null @@ -1,73 +0,0 @@ -'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/table-test.js b/test/table-test.js deleted file mode 100644 index 0b58903..0000000 --- a/test/table-test.js +++ /dev/null @@ -1,192 +0,0 @@ -'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') - -// }) - - - - - -}) diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 56fdec0..0000000 --- a/test/test.js +++ /dev/null @@ -1,758 +0,0 @@ -'use strict' - -const fs = require("fs"); - -const ChainsqlAPI = require('../src/index'); -// ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); -const c = new ChainsqlAPI(); - -var user = { - secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", - address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", - publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" -} - - var owner = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" - } - -var issuer = { - secret: "xxEiFWFxpUARr9tq1XfvkykyR97iK", - address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" -} - -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 = "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://192.168.29.69:46006'); - - // 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) - console.log('连接成功'); - c.as(owner); - - // 读取证书文件 - // 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 testSubscribe(); - - //await testRippleAPI(); - // await testAccount(); - await testChainsql(); - - //await c.disconnect(); - console.log('运行结束'); - }catch(e){ - console.error(e); - } -} - -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(){ - unsubTable(sTableName,owner.address); - },5000); - await subTx(); -} - -function testUnSubscribe(){ - unsubTable(sTableName,owner.address); -} - -async function subTx() { - //获取账户信息 - let info = await c.api.getAccountInfo("zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh"); - console.log(info); - //获取当前区块号 - c.getLedgerVersion(function(err,data){ - var payment = { - "Account": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", - "Amount":"1000000000", - "Destination": "zHyz3V6V3DZ2fYdb6AUc5WV4VKZP1pAEs9", - "TransactionType": "Payment", - "Sequence": info.sequence, - "LastLedgerSequence":data + 5, - "Fee":"50" - } - let signedRet = c.sign(payment,owner.secret); - c.api.submit(signedRet.signedTransaction).then(function(data){ - console.log(data); - }); - //订阅 - testSubscribeTx(signedRet.id); - setTimeout(function(){ - testUnSubscribeTx(signedRet.id); - },5000); - }); -} - -function testSubscribeTx(hash){ - var event = c.event; - event.subscribeTx(hash,function(err, data) { - if(err) - console.log(err); - else - console.log("subtx return:", data) - }).then(function(data) { - console.log('subTx success.'); - }).catch(function(error) { - console.log('subTx error:' + error); - }); -} - -function testUnSubscribeTx(hash){ - var event = c.event; - event.unsubscribeTx(hash).then(function(data) { - console.log('unsubTx success.'); - }).catch(function(error) { - console.log('unsubTx error:' + error); - }); -} - -async function testRippleAPI(){ - // await testGetLedgerVersion(); - // await testGetLedger(); - -// await testGetAccountTransactions(); - await testGetTransaction(); - // await testGetServerInfo(); - // await testUnlList(); - // await testEscrow(); -} - -async function testAccount(){ - var account = await generateAccount(); - console.log("new account:",account); - 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 testInsert() - // await testDelete(); - // await testRename(); - // await testGet(); - // await testGetBySql(); - // await testGetBySqlUser(); - // await testDrop(); - // await testGrant(); - // await testTxs(); - // await insertAfterGrant(); - // await testOperationRule(); - // await testAccountTables(); - // await testTableAuth(); - - //现在底层不允许直接删除所有记录这种操作了 - // await testDeleteAll(); - - // await testTableSet(); - - // await testModifyTable(); -} - -//创建一个加密的表,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) { - if(err) - console.log(err); - else - console.log(data) - }).then(function(data) { - console.log('subTable success.'); - }).catch(function(error) { - console.log('subTable error:' + error); - }); -} - -function unsubTable(tb, owner) { - var event = c.event; - event.unsubscribeTable(owner, tb).then(function(data) { - console.log('unsubTable success.'); - }).catch(function(error) { - console.log('unsubTable error:' + error); - }); -} - -//创建一个加密的表,table为要创建的表,confidential为是否要加密 -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'} - ] - var option = { - confidential: true - } - // 创建表 - let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); - console.log("testCreateTable" , rs) -}; - -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":"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 - }; - // 创建表 - try { - let rs = await c.createTable(sTableName, raw, option).submit({expect:'db_success'}); - console.log("testCreateTable1" , rs); - } catch (error) { - console.error(error); - } -}; - -var testInsert = async function() { - var raw = [ - {'id':7}, - {'id':8}, - {'id':9} - ]; - try { - var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); - console.log("testInsert ",rs); - } catch (error) { - console.error(error); - } -} - -var testUpdate = async function(){ - try { - 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); - } -} - -var testDelete = async function(){ - var rs = await c.table(sTableName).get({'id': 3}).delete().submit({expect:'db_success'}); - console.log("testDelete" ,rs) -} - -var testRename= async function(){ - try { - var rs = await c.renameTable(sTableName,sReName).submit({expect:'db_success'}); - console.log("testRename",rs); - } catch (error) { - console.error(error); - } -}; -var testGet = async function(){ - const raw = { id:1 }; - const res = await c.table(sTableName).get(raw).submit().catch(err => { - return console.error(err); - }); - - //求和 - // const res = await c.table(sTableName).get(raw).withFields(["SUM(id)"]).submit(); - - // const res = await c.table(sTableName).get({name:'wifi'}).order({id:-1}).limit({index:0,total:1}).withFields([]).submit(); - // const res = await c.table(sTableName).get().withFields(["COUNT(*)"]).submit(); - console.log("testGet",res); -} - -var testGetBySql = async function(){ - var tableNameInDB = await c.getTableNameInDB(owner.address, sTableName); - var tableName = "t_" + tableNameInDB; - var rs = await c.getBySqlAdmin("select * from " + tableName); - console.log(rs); -} - -var testGetBySqlUser = async function(){ - var tableNameInDB = await c.getTableNameInDB(owner.address,"wiki"); - var tableName = "t_" + tableNameInDB; - var rs = await c.getBySqlUser("select * from " + tableName); - console.log(rs); -} - -var testDrop = async function(){ - var rs = await c.dropTable(sTableName).submit({expect:'db_success'}); - console.log("testDrop",rs); -} - -//重复授权可能出异常,测一下 -var testGrant = async function(){ - try { - 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); - } -}; - -var insertAfterGrant = async function(){ - c.as(user); - c.use(owner.address); - var raw = [ - {'age': 333,'name':'hello'}, - {'age': 444,'name':'sss'}, - {'age': 555,'name':'rrr'} - ] - var rs = await c.table(sTableName).insert(raw).submit({expect:'db_success'}); - console.log("insertAfterGrant",rs); - // 切换回原来的账户 - 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.as(smRoot) - c.beginTran(); - //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) { - console.error(error); - } -} - -var testOperationRule = async function(){ - var raw = [ - {'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1,'AI':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(sTableName3, raw, option).submit({expect:'db_success'}); - console.log("testOperationRule",rs) - // let rs = await c.table(sTableName3).get().order({id:-1}).submit(); - // console.log(rs); -} - -var generateAccount = async function(){ - return c.generateAddress(); -} - -var activateAccount = async function(account){ - let rs = await c.pay(account,2000).submit({expect:'validate_success'}); - console.log(rs); -} - -async function testGetLedgerVersion(){ - c.getLedgerVersion(callback); - // var index = await c.callback2Promise(c.getLedgerVersion); - // console.log(index); -} -async function testGetLedger(){ - var opt = { - ledgerVersion :666, // || 'validated', - includeAllData : false, - includeTransactions : true, - includeState : false - } - c.getLedger(opt,callback); - // var rs = await callback2Promise(c.getLedger,opt); - // console.log(rs); -} - -async function testGetAccountTransactions(){ - // var opt = { - // minLedgerVersion : 1,// || -1, - // // -1 is equivalent to most recent available validated ledger - // limit:20, - // maxLedgerVersion : 500 - // } - const opt = {limit:12}; - // const opt = {start:"2282CC29603E5141EAC96B25FF4BF10E896103A06F7C055FCA90C9956B6C98F9"}; - c.getAccountTransactions(owner.address, opt, callback); - // var rs = await callback2Promise(c.getTransactions,opt); - // console.log(rs); -} - -async function testGetServerInfo(){ - // let rs = await c.getServerInfo(); - // console.log(rs); - c.getServerInfo(callback); - // var rs = await callback2Promise(c.api.getServerInfo); - // console.log(rs); -} - -async function testEscrow(){ - const address = user.address; - var hash= ""; - const escrowCreation = { - destination: "zHYfrrZyyfAMrNgm3akQot6CuSmMM6MLda", - amount: { - // counterparty:issuer.address, - value:"1000", - currency:"ZXC" - }, - allowExecuteAfter: "2018-08-15T11:06:50.000Z", - allowCancelAfter: "2018-08-15T11:08:50.000Z" - }; - return c.api.prepareEscrowCreation(address, escrowCreation) - .then(data =>{ - // console.log('preparePayment: ', data); - try { - let signedRet = c.api.sign(data.txJSON, user.secret); - hash = signedRet.id; - return c.api.submit(signedRet.signedTransaction); - } catch (error) { - console.log('sign escrow failure.', JSON.stringify(error)); - } - }).then(function(data) { - if (data.resultCode === 'tesSUCCESS') { - //paymentSetting(ChainSQL, account, resolve, reject); - data.tx_hash = hash; - // resolve(data); - console.log(data); - } else { - console.log('submit escrow: ', JSON.stringify(data)); - // reject(data); - } - }).catch(function(error) { - console.log(error); - }); -} - -async function testUnlList(){ - // c.getUnlList(callback); - let rs = await c.getUnlList(); - console.log(rs); -} - -function callback(err,data){ - if(err){ - console.error(err); - }else{ - console.log(JSON.stringify(data)); - } -} - -async function testAccountTables() -{ - try { - let retRequest = await c.getAccountTables("zn4X2eXBBaWtkJkxvXLBczQ1mRdpUCfXH3",true); - console.log(retRequest); - } catch (error) { - console.error(error); - } -} - -async function testTableAuth(){ - try { - let retRequest = await c.getTableAuth(owner.address,"b1",[]); - console.log(retRequest); - } catch (error) { - console.error(error); - } - -} - -async function testDateTime() -{ - //var account = await generateAccount(); - //console.log("new account:",account); - - var accountMain = { - secret: "xhuw4WDjwy85rpoJVd8kcj5SRBXmn", - address: "zPrcbkv779Hb94TJL35gF87owkQpHzJc4d" - } - /* - var accountMain = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" - }*/ -/* - c.as({ - secret: "xxCosoAJMADiy6kQFVgq1Nz8QewkU", - address: "zPcimjPjkhQk7a7uFHLKEv6fyGHwFGQjHa" - }) - - let retPay = await c.pay("zPrcbkv779Hb94TJL35gF87owkQpHzJc4d",200).submit() - console.log(retPay); - - let info = await c.api.getAccountInfo("zPrcbkv779Hb94TJL35gF87owkQpHzJc4d"); - console.log(info); -*/ - - c.as(accountMain) - /* - var raw = [ - {'field':'name','type':'varchar','length':50,'default':null}, - {'field':'creatTM','type':'datetime'} - ] - var option = { - confidential: false - } - // 创建表 - let rs = await c.createTable("testDateTime", raw, option).submit({expect:'db_success'}); - console.log("testCreateTable" , rs) - */ - - /* - - var dateNew = new Date(); - var sDate = dateNew.toString(); - var sData2 = dateNew.toLocaleString() - //console.log(sData2) - var raw = [ - {'name':'hello2','creatTM':dateNew } - ] - console.log(dateNew) - - - var rs = await c.table("testDateTime").insert(raw).submit({expect:'db_success'}); - console.log("testInsert",rs); - */ - - /* - var dateNew = new Date(); - var sDate = dateNew.toString(); - var sDateLocale1 = dateNew.toLocaleString() - console.log(sDate) - console.log(sDateLocale1) - - - var data2 = new Date(sDateLocale1) - var sDataLoca2 = data2.toLocaleString() - var hour2 = data2.getHours() - console.log(sDataLoca2) - console.log(hour2) - */ - - - - - var rs = await c.table("testDateTime").get().limit({index:0,total:20}).withFields([]).submit(); - // var rs = await c.table(sTableName).get().withFields(["COUNT(*)"]).submit(); - console.log("testGet",rs.lines); - -} \ No newline at end of file diff --git a/test/testCrypto.js b/test/testCrypto.js deleted file mode 100644 index ecd3213..0000000 --- a/test/testCrypto.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict' -const ChainsqlAPI = require('../src/index'); -// ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); -const c = new ChainsqlAPI(); - - -main(); - -async function main(){ - try { - var wallet = c.generateAddress(); - var cipher = c.eciesEncrypt("hello",wallet.publicKey); - console.log("cipher:",cipher); - var origin = c.eciesDecrypt(cipher,wallet.secret); - console.log("plaintext:",origin.toString()); - - //await c.disconnect(); - console.log('运行结束'); - }catch(e){ - console.error(e); - } -} diff --git a/test/testRipple.js b/test/testRipple.js deleted file mode 100644 index d48008e..0000000 --- a/test/testRipple.js +++ /dev/null @@ -1,235 +0,0 @@ -'use strict' -const ChainsqlAPI = require('../src/index'); -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" - -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'); - - c.as(root); - c.setRestrict(true); - /**************************************/ - let nStep = tagStep.escrow; - switch (nStep) { - case tagStep.active: testActive(); break;// 激活若干账户 - case tagStep.gateWay: testGateWay(); 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 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) - - // - 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 <<<<<<<<<<<<<"); -} - -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/testSignatureVerify.js b/test/testSignatureVerify.js deleted file mode 100644 index 593f06a..0000000 --- a/test/testSignatureVerify.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; - -const ChainsqlAPI = require('../src/index'); - -const assert = require('assert'); -const c = new ChainsqlAPI(); - -var user = { - secret: "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - address: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - publickKey: "aBQG8RQAzjs1eTKFEAQXr2gS4utcDiEC9wmi7pfUPTi27VCahwgw" -}; - -main(); - - function testSign(){ - - var secret = "xnoz9Le8yENN7U3fWxoeMymnT31XD"; - var hexMsg = Buffer.from("hello world").toString('hex'); - var signature = c.signFromString(hexMsg,secret); - - - assert.equal(signature,"3045022100BDC5E1154B68B6A9FFD7F7CA36CF3B79D0BF0EDF186D09D460E537EAB9BEB31002204F54BCE76918B4F7415319E62B19A2B1F7200234F049FBD524C61EB5DD4965AA"); - } - - function testVerify(){ - - var secret = "xnoz9Le8yENN7U3fWxoeMymnT31XD"; - var wallet = c.generateAddress(secret); - - console.log(wallet); - var hexStr = Buffer.from("hello world").toString('hex'); - - var signature = "3045022100BDC5E1154B68B6A9FFD7F7CA36CF3B79D0BF0EDF186D09D460E537EAB9BEB31002204F54BCE76918B4F7415319E62B19A2B1F7200234F049FBD524C61EB5DD4965AA"; - - var bVerifyOK = c.verify(hexStr,signature,wallet.publicKey); - - assert.equal(bVerifyOK,true); - -} - - -async function main(){ - - try { - - testSign(); - testVerify(); - - return ; - - }catch(e){ - console.error(e); - } - -} - diff --git a/test/testTable.js b/test/testTable.js deleted file mode 100644 index da6e1c1..0000000 --- a/test/testTable.js +++ /dev/null @@ -1,298 +0,0 @@ -'use strict' -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 = owner; - -var user2 = { - address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", - secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" -} - -var smRoot = { - secret: "p97evg5Rht7ZB7DbEpVqmV3yiSBMxR3pRBKJyLcRWt7SL5gEeBb", - address: "zN7TwUjJ899xcvNXZkNJ8eFFv2VLKdESsj", - publicKey: 'pYvWhW4azFwanovo5MhL71j5PyTWSJi2NVurPYUrE9U…txxQB7xeGvFmdjbtKRzBQ4g9bCW5hjBQSeb7LePMwFM' -} - - -const smUser7 ={ - secret:"pwRdHmA4cSUKKtFyo4m2vhiiz5g6ym58Noo9dTsUU97mARNjevj", - address: "zMXMtS2C36J1p3uhTxRFWV8pEhHa8AMMSL", - publicKey: "pYvXDbsUUr5dpumrojYApjG8nLfFMXhu3aDvxq5oxEa4ZSeyjrMzisdPsYjfxyg9eN3ZJsNjtNENbzXPL89st39oiSp5yucU" -} - -var grantAddr = "0xzzzzzzzzzzzzzzzzzzzzBZbvji"; - -var sTableName = "hjkz9"; -var sTableNameNew = "table_new" -var tableRaw = [ - { '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 insertRaw = [ -// { 'id': 1, 'name': 'zhangsan', 'email': '123', 'account': root.address, 'time': '2018-10-18 14:31:00', 'txHash': "txHash" }, -// { 'id': 2, 'name': 'lisi', 'email': '124', 'account': root.address, 'time': '2018-10-18 14:31:00', 'txHash': "txHash" }, -// { 'id': 3, 'name': 'wangwu', 'email': '125', 'account': root.address, 'time': '2018-10-18 14:31:00', 'txHash': "txHash" }, -// { 'id': 4, 'name': 'zhaoliu', 'email': '126', 'account': root.address, 'time': '2018-10-18 14:31:00', 'txHash': "txHash" } -// ]; - -var insertRaw = [ - { 'id': 1, 'name': 'zhangsan', 'email': '123', 'account': root.address, 'time': '2018-10-18 14:31:00' }, - { 'id': 2, 'name': 'lisi', 'email': '124', 'account': root.address, 'time': '2018-10-18 14:31:00' }, - { 'id': 3, 'name': 'wangwu', 'email': '125', 'account': root.address, 'time': '2018-10-18 14:31:00' }, - { 'id': 4, 'name': 'zhaoliu', 'email': '126', 'account': root.address, 'time': '2018-10-18 14:31:00' } -]; - -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 -} - -var wsAddr = 'ws://192.168.29.69:8006' - -main(); -async function main() { - 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_operationRule; - // userOperation = user; - switch (nStep) { - case tagStep.active: active(); 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; - } - /**************************************/ -} - -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(user2.address, amount).submit({ expect: 'validate_success' }) - console.log("\n user2", user2.address, ":", res) - console.log("\n----------- active <<<<<<<<<<<<<"); -} - -var table_create = async function () { - c.as(smRoot) - try { - 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 () { - - - 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) - let lll = await c.renameTable(sTableName, sTableNameNew).submit({ expect: 'db_success' }); - console.log(" table_rename :", lll); -} -var table_grant = async function () { - c.as(owner) - var flag = { insert: true, update: true } - let lll = await c.grant(sTableName, grantAddr, flag).submit({ expect: 'db_success' }); - console.log(" table_grant :", lll); -} -var table_drop = async function () { - c.as(owner) - let lll = await c.dropTable(sTableName).submit({ expect: 'db_success' }); - console.log(" dropTable", sTableName, lll); -} -var table_insert = async function () { - 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); - } catch (error) { - console.log(" insert error: ", error); - } -}; -var table_insert_operationRule = async function () { - c.as(smRoot) - // c.use(owner.address) - let lll = await c.table(sTableName).insert(insertRaw).submit({ expect: 'db_success' }); - console.log(" insert", lll); -} -var table_delete = async function () { - c.as(userOperation) - c.use(owner.address) - var rs = await c.table(sTableName).get({ 'id': 3 }).delete().submit({ expect: 'db_success' }); - console.log("testDelete", rs) -} -var table_update = async function () { - c.as(userOperation) - c.use(owner.address) - let lll = await c.table(sTableName).get({ name: { $regex: '/s/' } }).update({ account: "update regex 's'" }).submit({ expect: 'db_success' }); - console.log(" update (regix)1:", lll); - // - lll = await c.table(sTableName).get({ email: 125 }).update({ account: "email==125" }).submit({ expect: 'db_success' }); - console.log(" update (==)2:", lll); - // - lll = await c.table(sTableName).get({ $or: [{ email: "126" }, { name: "zhangsan" }] }).update({ account: "update email == 123 || name == zhangsan" }).submit({ expect: 'db_success' }); - console.log(" update (or)3", lll); -} -var table_get = async function () { - c.as(userOperation) - c.use(owner.address) - let lll = await c.table(sTableName).get().submit(); - console.log(" all record:", lll); - lll = await c.table(sTableName).get().withFields(["SUM(id) as sum"]).submit(); - console.log(" all record sum(id):", lll); - if (lll.lines.length > 0) { - console.log(" sum:", lll.lines[0].sum) - } - lll = await c.table(sTableName).get({ $or: [{ email: "123" }, { name: "zhangsan" }] }).submit(); - console.log(" record (or)", lll); - lll = await c.table(sTableName).get({ name: { $regex: '/s/' } }).submit(); - console.log(" regex record:", lll); - lll = await c.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["COUNT(*) as count"]).submit(); - console.log(" record count:", lll); - lll = await c.table(sTableName).get({ name: { $regex: '/s/' } }).withFields([]).submit(); - console.log(" record count:", lll); - lll = await c.table(sTableName).get({ name: { $regex: '/s/' } }).limit({ index: 0, total: 1 }).withFields([]).submit(); - console.log(" record count(limit):", lll); - lll = await c.table(sTableName).get({ name: { $regex: '/s/' } }).withFields(["account"]).submit(); - console.log(" record with fields:", lll); -} -var table_transaction = async function () { - c.as(userOperation) - c.beginTran(); - c.createTable(sTableName, tableRaw); - c.grant(sTableName, user.address, { insert: true, update: true }, user.publicKey) - c.table(sTableName).insert(insertRaw); - c.table(sTableName).get().update({ account: "updateTxs" }); - c.table(sTableName).get({ 'id': 3 }).delete() - var rs = await c.commit({ expect: 'db_success' }); - console.log(" table_transaction", rs); -} - diff --git a/test/testTxSign.js b/test/testTxSign.js deleted file mode 100644 index 586a2ff..0000000 --- a/test/testTxSign.js +++ /dev/null @@ -1,83 +0,0 @@ -'use strict' - - -const ChainsqlAPI = require('../src/index'); - -const c = new ChainsqlAPI(); - - -var user = { - secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", - address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", - publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" -} - -var owner = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" -} - -var sTableName = "tTable1"; - -main(); - -async function main() { - try { - - await c.connect('ws://127.0.0.1:6006'); - console.log('连接成功'); - c.as(owner); - await testTxSign(); - - console.log('测试结束'); - } catch (e) { - console.error(e); - } -} - -async function testTxSign() { - - var rawCreate = [ - { 'field': 'id', 'type': 'int', 'length': 11, 'PK': 1, 'NN': 1 }, - { 'field': 'name', 'type': 'varchar', 'length': 50, 'default': "" }, - { 'field': 'age', 'type': 'int' } - ] - var option = { - confidential: false - } - - var rawInsert = [ - { 'id': 1, 'age': 333, 'name': 'hello' }, - { 'id': 2, 'age': 444, 'name': 'sss' }, - { 'id': 3, 'age': 555, 'name': 'rrr' } - ]; - - var rawGrant = { select: true, insert: false, update: false, delete: true }; - - try { - - // payment - let paymentSign = await c.pay(user.address, 2000).txSign(); - console.log("payment Tx sign : " + JSON.stringify (paymentSign)); - - // create table - // let createTableSign = await c.createTable(sTableName, rawCreate, option).txSign(); - // console.log("create table Tx sign : " + JSON.stringify(createTableSign)); - - // insert/grant 等 签名交易的生成需要保证表已存在 - // let insertTableSign = await c.table(sTableName).insert(rawInsert).txSign(); - // console.log("insert table Tx sign : " + JSON.stringify(insertTableSign)); - - // grant - var grantSign = await c.grant(sTableName, user.address, rawGrant, user.publicKey).txSign(); - console.log("insert table Tx sign : " + JSON.stringify(grantSign)); - - } catch (error) { - console.error(error); - } - - -} - - - diff --git a/test/test_chainsql_scene.js b/test/test_chainsql_scene.js deleted file mode 100644 index cf9d449..0000000 --- a/test/test_chainsql_scene.js +++ /dev/null @@ -1,429 +0,0 @@ -const ChainsqlAPI = require('../src/index'); -const api = new ChainsqlAPI(); - -const functionEntry = function(fun, arguments) { - this.fun = fun; - this.arguments = arguments; -} - -const functionChain = function(callback) { - this.callback = callback; - this.functionlist = []; // list of functionEntry - this.stack_head = -1; - this.stack_tail = -1; - this.default_callback = null; -} - -functionChain.prototype.push = function(entry) { - this.functionlist.push(entry); - this.stack_tail++; -} - -functionChain.prototype.pop = function() { - if ((this.stack_head++) > this.stack_tail) { - return null; - } - - return this.functionlist[this.stack_head]; -} - -functionChain.prototype.setDefaultCallback = function(callback) { - this.default_callback = callback; -} - -functionChain.prototype.callDefaultCallback = function() { - if (this.default_callback) { - this.default_callback.fun(this.default_callback.arguments.tableName); - } -} - -funcChain = new functionChain(); - -var user = { - secret: "ssnqAfDUjc6Bkevd1Xmz5dJS5yHdz", - address: "rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q", - publickKey: "02F039E54B3A0D209D348F1B2C93BE3689F2A7595DDBFB1530499D03264B87A61F" -}; - -function setup_invoke(tableName) { - - funcChain.push(new functionEntry(createTable,{tableName:tableName})); - - funcChain.push(new functionEntry(createAccountAndActive,{tableName:''})); - - funcChain.push(new functionEntry(assign,{tableName:tableName,user:user})); - - funcChain.push(new functionEntry(insertRecord,{tableName:tableName})); - funcChain.push(new functionEntry(expectValue, - {tableName:tableName, - expect:[{id:1,age:3,name:'peersafe'}, - {id:2,age:10,name:'guichuideng'}], - message:'insert'})); - - funcChain.push(new functionEntry(updateRecord,{tableName:tableName})); - funcChain.push(new functionEntry(expectValue, - {tableName:tableName, - expect:[{id:1,age:3,name:'zongxiang'}, - {id:2,age:10,name:'guichuideng'}], - message:'update.'})); - - funcChain.push(new functionEntry(deleteRecord,{tableName:tableName})); - funcChain.push(new functionEntry(expectValue,{tableName:tableName,expect:[{id:2,age:10,name:'guichuideng'}],message:'delete.'})); - - funcChain.push(new functionEntry(transaction,{tableName:tableName})); - funcChain.push(new functionEntry(expectValue, - {tableName:tableName, - expect:[{id:2,age:10,name:'guichuideng'}, - {id:4,age:33,name:'zhouxingchi'}], - message:'transaction.'})); - - newTableName = 'new_' + tableName; - funcChain.push(new functionEntry(renameTable,{tableName:tableName,newTableName:newTableName})); - - funcChain.push(new functionEntry(dropTable,{tableName:newTableName})); - - -} - -Function.prototype.getName = function(){ - return this.name || this.toString().match(/function\s*([^(]*)\(/)[1] -} - -function invoke() { - var f = funcChain.pop(); - if(f != null) { - if (f.fun.getName() === 'assign') { - f.fun(f.arguments.tableName,f.arguments.user); - } else if (f.fun.getName() === 'renameTable') { - f.fun(f.arguments.tableName,f.arguments.newTableName); - } else { - f.fun(f.arguments.tableName); - } - } -} - -function invoke_expect() { - var f = funcChain.pop(); - if(f != null) { - f.fun(f.arguments.tableName,f.arguments.expect, f.arguments.message); - } -} - -api.connect('ws://127.0.0.1:6006',function(error, data) { - if (error) { - console.log('Connect ChainSQL failure.' + error) - exit(); - } else { - console.log('Connect ChainSQL successfully. ') - } - - api.as({ - "secret": "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - "address": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" - }); - - var tableName = 'abcefg'; - setup_invoke(tableName); - invoke(); - - //createTable_using_callback(tableName); - //dropTable_using_callback(tableName); -}); - -function exit() { - process.exit() -} - -function createTable(tableName) { - api.setRestrict(false); - api.createTable(tableName, [{ - "field": "id", - "type": "int", - "length": 11, - "PK": 1, - "NN": 1, - "UQ": 1, - "AI": 1 - }, { - "field": "age", - "type": "int", - "length": 11, - "default": 0 - }, { - "field": "name", - "type": "varchar", - "length": 46, - "default": "null" - }], { - confidential: false - }).submit({ - expect: 'validate_success' - }).then(function(data) { - if (data.status === 'validate_success') { - console.log('ok : create table.'); - // insert record - invoke(); - } - }).catch(function(e) { - console.log('failure: create table. ' + JSON.stringify(e)); - exit(); - }); -} - -function createTable_using_callback(tableName) { - api.setRestrict(false); - api.createTable(tableName, [{ - "field": "id", - "type": "int", - "length": 11, - "PK": 1, - "NN": 1, - "UQ": 1, - "AI": 1 - }, { - "field": "age", - "type": "int", - "length": 11, - "default": 0 - }, { - "field": "name", - "type": "varchar", - "length": 46, - "default": "null" - }], { - confidential: false - }).submit(function(error, data) { - if(error) { - console.log('createTable_using_callback ', error); - } else { - console.log('createTable_using_callback ', data); - } - }); -} - -function dropTable(tableName) { - api.dropTable(tableName) - .submit({ - expect: 'validate_success' - }).then(function(data) { - if (data.status === 'validate_success') { - console.log('ok : drop table.'); - exit(); - } - }).catch(function(e) { - console.log('failure: drop table. ' + JSON.stringify(e)); - exit(); - }); -} - -function dropTable_using_callback(tableName) { - api.dropTable(tableName) - .submit(function(error, data) { - if(error) { - console.log('dropTable_using_callback ', error); - } else { - console.log('dropTable_using_callback ', data); - } - }); -} - -function renameTable(oldTableName, newTableName) { - api.renameTable(oldTableName,newTableName) - .submit({ - expect: 'validate_success' - }).then(function(data) { - if (data.status === 'validate_success') { - console.log('ok : rename table.'); - invoke(); - } - }).catch(function(e) { - console.log('failure: rename table. ' + JSON.stringify(e)); - exit(); - }); -} - -function insertRecord(tableName) { - api.table(tableName).insert([{ - age: 3, - name: 'peersafe' - },{ - age: 10, - name: 'guichuideng' - }]).submit({ - expect: 'db_success' - }).then(function(data) { - if (data.status === 'db_success') { - // invoke expectValue - invoke_expect(); - } - }).catch(function(e) { - console.log('failure: insert table. ' + JSON.stringify(e)); - exit(); - }) -} - -function updateRecord(tableName) { - api.table(tableName).get({ - id: 1 - }).update({ - name: 'zongxiang' - }).submit({ - expect: 'db_success' - }).then(function(data) { - if (data.status === 'db_success') { - //console.log("update record successfully."); - // invoke expectValue - invoke_expect(); - } - }).catch(function(e) { - //console.log("update record unsuccessfully." + JSON.stringify(e)); - console.log('failure: update table. ' + JSON.stringify(e)); - exit(); - }); -} - -function deleteRecord(tableName) { - api.table(tableName).get({ - id: 1 - }).delete().submit({ - expect: 'db_success' - }).then(function(data) { - if (data.status === 'db_success') { - //console.log("delete record successfully."); - invoke_expect(); - } - }).catch(function(e) { - console.log('failure: delete record. ' + JSON.stringify(e)); - exit(); - }) -} - -function expectValue(tableName, expect, message) { - if (Object.prototype.toString.call(expect) != '[object Array]') { - console.log('type is ', Object.prototype.toString.call(expect)); - throw new Error('Type of expect must be array in function `expectValue`.'); - } - - api.table(tableName).get([]) - .submit(function(err, result) { - var data = result.lines; - if (err) { - console.log(err) - } else { - if (expect.length != data.length) { - console.log('failure: ' + message); - console.log('Expect count of record is ' + expect.length + ',but it is ' + data.length); - console.log(data); - exit(0); - } - - compare = function(left, right) { - if (/*left.id === right.id && */ left.age === right.age && left.name === right.name) { - return true; - } - return false; - }; - - var exception = false; - var exception_indx = 0; - for (exception_indx = 0; exception_indx < expect.length; exception_indx++) { - var expect_value = expect[exception_indx]; - var real_value = data[exception_indx]; - if (compare(expect_value,real_value) == false) { - exception = true; - break; - } - } - - if (exception) { - console.log('failure: ' + message); - console.log('\texpect: ' + JSON.stringify(expect[exception_indx])); - console.log('\treal : ' + JSON.stringify(data[exception_indx])); - exit(0); - } else { - console.log('ok : ' + message); - invoke(); - } - } - }); -} - -function assign(tableName, user) { - api.grant(tableName, user.address, { - update: true - }, user.publickKey).submit({ - expect: 'validate_success' - }).then(function(data) { - if (data.status === 'validate_success') { - console.log('ok : assign.'); - invoke(); - } - }).catch(function(e) { - console.log('failure: assign. ' + JSON.stringify(e)); - exit(); - }) -} - -function transaction(tableName) { - api.beginTran(); - api.table(tableName).insert({ - age: 33, - name: 'dahuaxiyou' - }); - - api.table(tableName).get({ - age: 33 - }).update({ - name: 'zhouxingchi' - }); - - try { - api.commit({ - expect: 'db_success', - }).then(function(data) { - if (data.status === 'db_success') { - invoke_expect(); - } - }).catch(function(error){ - console.log('failure: transaction. ' + error); - }) - } catch (e) { - console.log('ok : transaction. exception: ', e); - }; - - /* - try { - api.commit(function(error, data) { - if (error) { - console.log('ok : transaction. exception: ', e); - } else { - if (data.status === 'db_success') { - invoke_expect(); - } - } - }); - } catch (e) { - console.log('ok : transaction. exception: ', e); - }; - */ -} - -function createAccountAndActive() { - var account = api.generateAddress(); - //console.log(account); - api.activeAccount(account) - .then(function(data) { - if (data.status == 0) { - console.log(JSON.stringify(account)); - console.log('ok : activeAccount.', JSON.stringify(data)); - invoke(); - } else { - console.log('failure : activeAccount.', JSON.stringify(data)); - exit(); - } - }) - .catch(function(error) { - console.log('failure : activeAccount.', JSON.stringify(error)); - exit(); - }); -} diff --git a/test/testwss.js b/test/testwss.js deleted file mode 100644 index 61bdff3..0000000 --- a/test/testwss.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' - -const ChainsqlAPI = require('../src/index'); -// ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); -const c = new ChainsqlAPI(); - -var owner = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" -} - - -main(); - -async function main(){ - try { - await c.connect('wss://192.168.29.69:6006'); - c.as(owner); - let rs = await c.pay(account,2000).submit({expect:'validate_success'}); - console.log(rs); - }catch(e){ - console.error(e); - } -} \ No newline at end of file From 3660054542495bc9e59801d643465e088ef0ca43 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 22 Apr 2021 16:23:10 +0800 Subject: [PATCH 42/53] update version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bc1fc3..8cbefcd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.1", + "version": "1.0.2", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From ccbde9f09059a764b9a837cbc147a59915365415 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 22 Apr 2021 16:26:58 +0800 Subject: [PATCH 43/53] rm sjcl and update version --- lib/crypto.js | 33 --------------------------------- package.json | 2 +- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/lib/crypto.js b/lib/crypto.js index a05db3c..5a62121 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -4,9 +4,6 @@ const keypairs = require('chainsql-keypairs'); //var debug = require('debug')('crypto'); var crypto = require('crypto'); -var sjcl = require('sjcl'); - -var zlib = require('zlib'); const _ = require('lodash'); @@ -39,36 +36,6 @@ const Bytes2HexString = (b)=> { return hexs; } -function bitsToBytes(arr) { - var out = [], - bl = sjcl.bitArray.bitLength(arr), - i, tmp; - for (i = 0; i < bl / 8; i++) { - if ((i & 3) === 0) { - tmp = arr[i / 4]; - } - out.push(tmp >>> 24); - tmp <<= 8; - } - return out; -} -/** Convert from an array of bytes to a bitArray. */ -function bytesToBits(bytes) { - var out = [], - i, tmp = 0; - for (i = 0; i < bytes.length; i++) { - tmp = tmp << 8 | bytes[i]; - if ((i & 3) === 3) { - out.push(tmp); - tmp = 0; - } - } - if (i & 3) { - out.push(sjcl.bitArray.partial(8 * (i & 3), tmp)); - } - return out; -} - function paddingPass(password,keyLen){ if(password.length < keyLen){ var pass =Buffer.from(password); diff --git a/package.json b/package.json index 8cbefcd..6d48275 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.2", + "version": "1.0.3", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From e197f2f23827fbe2644b98c28ee3007fd043340f Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 22 Apr 2021 16:33:43 +0800 Subject: [PATCH 44/53] use chainsql-lib-applet --- lib/error.js | 2 +- lib/util.js | 2 +- package.json | 2 +- src/index.js | 2 +- src/ripple.js | 2 +- src/submit.js | 2 +- src/txPayment.js | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/error.js b/lib/error.js index 32fdb44..ca39f24 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-applet').ChainsqlLibCommon.errors.ChainsqldError; function chainsqlError( errMsg ) { let errName = "apiGeneralErr"; diff --git a/lib/util.js b/lib/util.js index 338856f..1da537c 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-applet').ChainsqlLibCommon; const keypairs = require('chainsql-keypairs'); const cryptoo = require('crypto'); const crypto = require('./crypto'); diff --git a/package.json b/package.json index 6d48275..06a6394 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.3", + "version": "1.0.4", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index d71e41b..ee3854d 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ const keypairs = require('chainsql-keypairs'); const EventManager = require('./eventManager') const _ = require('lodash'); -const RippleAPI = require('chainsql-lib').ChainsqlLibAPI; +const RippleAPI = require('chainsql-lib-applet').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 7fef145..7072954 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-applet').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { diff --git a/src/submit.js b/src/submit.js index 858e472..6988119 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-applet').ChainsqlLibAPI; const Connection = require('./connect'); class Submit { diff --git a/src/txPayment.js b/src/txPayment.js index 09c4951..2db415f 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-applet').ChainsqlLibUtil; var validate = utils.common.validate; var toRippledAmount = utils.common.toRippledAmount; var paymentFlags = utils.common.txFlags.Payment; From 2c8985f8332523343bd7a0bf5f53497348bc0d19 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 29 Dec 2021 15:38:34 +0800 Subject: [PATCH 45/53] support smartcontract --- .gitignore | 1 + package.json | 7 +- src/connect.js | 4 - src/eventManager.js | 16 +- src/index.js | 21 +- {lib => src/lib}/config.js | 0 {lib => src/lib}/crypto.js | 0 {lib => src/lib}/error.js | 0 {lib => src/lib}/floatOperation.js | 0 {lib => src/lib}/util.js | 9 +- {lib => src/lib}/validate.js | 0 {proto => src/proto}/MultiEncrypt.proto | 0 src/ripple.js | 20 +- src/smartContract.js | 1110 +++++++++++++++++++++++ src/submit.js | 4 +- 15 files changed, 1152 insertions(+), 40 deletions(-) rename {lib => src/lib}/config.js (100%) rename {lib => src/lib}/crypto.js (100%) rename {lib => src/lib}/error.js (100%) rename {lib => src/lib}/floatOperation.js (100%) rename {lib => src/lib}/util.js (97%) rename {lib => src/lib}/validate.js (100%) rename {proto => src/proto}/MultiEncrypt.proto (100%) create mode 100644 src/smartContract.js diff --git a/.gitignore b/.gitignore index d35d381..1bdefaf 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ jspm_packages # Optional npm cache directory .npm +package-lock.json # Optional REPL history .node_repl_history diff --git a/package.json b/package.json index 06a6394..30c349b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.4", + "version": "1.0.5", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -8,7 +8,10 @@ "dependencies": { "chainsql-keypairs": "^0.11.1", "chainsql-lib-applet": "^1.0.8", - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "web3-core-helpers": "1.0.0-beta.36", + "web3-eth-abi": "1.0.0-beta.36", + "web3-utils": "1.0.0-beta.36" }, "repository": { "type": "git", 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..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; @@ -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, + "transaction": id }; if (!that.onMessage) { _onMessage(that); @@ -255,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); diff --git a/src/index.js b/src/index.js index ee3854d..620a7ee 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,17 +7,18 @@ const _ = require('lodash'); const RippleAPI = require('chainsql-lib-applet').ChainsqlLibAPI; const Submit = require('./submit'); const Ripple = require('./ripple'); -const chainsqlError = require('../lib/error'); +const chainsqlError = require('./lib/error'); _.assign(RippleAPI.prototype, { prepareTx: require('./txPayment') }) const addressCodec = require('chainsql-address-codec'); -const validate = require('../lib/validate') +const validate = require('./lib/validate') const Connection = require('./connect'); -const util = require('../lib/util'); +const Contract = require('./smartContract'); +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; @@ -138,6 +139,10 @@ ChainsqlAPI.prototype.setRestrict = function (mode) { ChainsqlAPI.prototype.setNeedVerify = function (isNeed) { isNeed ? this.needVerify = 1 : this.needVerify = 0; } +ChainsqlAPI.prototype.contract = function(jsonInterface, address, options) { + this.contractObj = new Contract(this, jsonInterface, address, options); + return this.contractObj; +} ChainsqlAPI.prototype.generateAddress = function () { @@ -210,6 +215,11 @@ ChainsqlAPI.prototype.escrowCancel = function (sOwnerAddr, nCreateEscrowSeq) { return ripple.escrowCancel(sOwnerAddr, nCreateEscrowSeq); } +ChainsqlAPI.prototype.payToContract = function (contractAddr, value, gas) { + let ripple = new Ripple(this); + return ripple.payToContract(contractAddr, value, gas); +} + ChainsqlAPI.prototype.getAccountInfo = function (address, cb) { if ((typeof cb) === "undefined") { return this.api.getAccountInfo(address); @@ -948,7 +958,6 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ // 修改子链 this.schemaModifyTx = true; - this.payment = schemaModifyTxJson; return this; }; 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 100% rename from lib/crypto.js rename to src/lib/crypto.js diff --git a/lib/error.js b/src/lib/error.js similarity index 100% rename from lib/error.js rename to src/lib/error.js diff --git a/lib/floatOperation.js b/src/lib/floatOperation.js similarity index 100% rename from lib/floatOperation.js rename to src/lib/floatOperation.js diff --git a/lib/util.js b/src/lib/util.js similarity index 97% rename from lib/util.js rename to src/lib/util.js index 1da537c..81d2f64 100644 --- a/lib/util.js +++ b/src/lib/util.js @@ -337,14 +337,9 @@ function checkExpect(opt) { } function checkSubError(data){ - if (data.status == 'db_error' - || data.status == 'validate_error' - || data.status == 'db_timeout' + if (data.status == 'validate_error' || data.status == 'validate_timeout' - || data.status == 'db_noDbConfig' - || data.status == 'db_noSyncConfig' - || data.status == 'db_noAutoSync' - || data.status == 'db_noTableExistInDB'){ + || data.status.substring(0,3) == 'db_'){ return true; }else{ return false; diff --git a/lib/validate.js b/src/lib/validate.js similarity index 100% rename from lib/validate.js rename to src/lib/validate.js 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 7072954..c54428f 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-applet').ChainsqlLibUtil; class Ripple extends Submit { @@ -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); @@ -219,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/src/smartContract.js b/src/smartContract.js new file mode 100644 index 0000000..6aa6ba7 --- /dev/null +++ b/src/smartContract.js @@ -0,0 +1,1110 @@ +"use strict"; + +var util = require('./lib/util'); + +const _ = require('lodash'); +var chainsqlLibUtils = require('chainsql-lib-applet').ChainsqlLibUtil; +const keypairs = require('chainsql-keypairs'); +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; + +const preDefOptions = ["ContractData", "arguments", "ContractValue", "Gas", "expect"]; +/** + * Contract constructor for creating new contract instance + * + * @method Contract + * @constructor + * @param {Array} jsonInterface + * @param {String} address + * @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!'); + } + + 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 = {}; + + // set address + Object.defineProperty(this.options, 'address', { + set: function(value){ + if(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; + }); + + return _this._jsonInterface; + }, + get: function(){ + return _this._jsonInterface; + }, + 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; +}; + +/** + * Use default values, if options are not available + * + * @method _getOrSetDefaultOptions + * @param {Object} options the options gived by the user + * @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; + + 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; + + // TODO replace with only gasLimit? + delete options.gasLimit; + + return options; +}; + +/** + * Should be used to encode indexed params and options to one final object + * + * @method _encodeEventABI + * @param {Object} event + * @param {Object} options + * @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; +}; + +/** + * Should be used to decode indexed params and options + * + * @method _decodeEventABI + * @param {Object} data + * @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)){ + encodeChainsqlAddrParam(event.inputs, result.returnValues); + } + 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; +}; + +/** + * Encodes an ABI for a method, including signature or the method. + * Or when constructor encodes only the constructor parameters. + * + * @method _encodeMethodABI + * @param {Mixed} args the arguments to encode + * @param {String} the encoded ABI + */ +Contract.prototype._encodeMethodABI = function _encodeMethodABI() { + 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) || + ((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; + + 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 (input.type === "tuple[]" || 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; + } + } +}; + +/** + * Decodes an contractData for a method, including signature or the method. + * + * @method decodeMethodABI + * @param {String} contractData encoded params + */ +Contract.prototype.decodeMethodParams = function decodeMethodParams(contractData, bytecode = "") { + let methodSignature = contractData.slice(0,10).toLowerCase(); + let actualEncodeParams = methodSignature === "0x60806040" ? contractData.slice(bytecode.length) : contractData.slice(10); + let returnJson = {}; + returnJson.status = false; + + let paramsABIJson = this.options.jsonInterface.filter(function (json) { + return ((methodSignature === '0x60806040' && json.type === "constructor") || + ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); + })[0]; + if(undefined == paramsABIJson) + { + returnJson.status = true; + returnJson["funName"] = "Can not find corresponding SmartContract function" + return returnJson; + } + + let paramsTypes = paramsABIJson.inputs; + + 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(paramsTypes)){ + encodeChainsqlAddrParam(paramsTypes, result); + } + returnJson["detail"] = result; + returnJson.status = true; + } catch (error) { + returnJson["errMsg"] = error.message; + } + } + else + { + returnJson["errMsg"] = "Function info don't match contactData"; + } + + return returnJson; +}; + +/** + * Decode method return values + * + * @method _decodeMethodReturn + * @param {Array} outputs + * @param {String} returnValues + * @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 : []; + encodeChainsqlAddrParam(newOutputs, result); + + if (result.__length__ === 1) { + return result[0]; + } else { + delete result.__length__; + return result; + } +}; + +/** + * Deploys a contract and fire events based on its state: transactionHash, receipt + * + * All event listeners will be removed, once the last possible event is fired ("error", or "receipt") + * + * @method deploy + * @param {Object} options + * @param {Function} callback + * @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); + + + // 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); +}; + +/** + * Adds event listeners and creates a subscription. + * + * @method _on + * @param {String} event + * @param {Object} options + * @param {Function} 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 => { + //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); +}; + +/** + * Gets the event signature and outputformatters + * + * @method _generateEventOptions + * @param {Object} event + * @param {Object} options + * @param {Function} callback + * @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 (!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 + }; +}; + +/** + * Checks that no listener with name "newListener" or "removeListener" is added. + * + * @method _checkListener + * @param {String} type + * @param {String} event + * @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.'); + } +}; + +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 => { + if(data.specification.meta.hasOwnProperty("ContractLogs")) + { + 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); + }) +} + +/** + * returns the an object with call, send, estimate functions + * + * @method _createTxObject + * @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.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'); + + if (args && this.method.inputs && args.length !== this.method.inputs.length) { + if (this.nextMethod) { + return this.nextMethod.apply(null, args); + } + throw chainsqlError("Invalid Method Params!"); + } + + txObject.arguments = args || []; + txObject._method = this.method; + txObject._parent = this.parent; + + if(this.deployData) { + txObject._deployData = this.deployData; + } + + return txObject; +}; + +/** + * Executes a call, transact or estimateGas on a contract function + * + * @method _executeMethod + * @param {String} type the type this execute function should execute + * @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; + + // 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 = ""; + let onlyTxSign = false; + switch (args.type) { + 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 'txSign': + onlyTxSign = true; + 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.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.hasOwnProperty("expect") ? args.options.expect : "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, onlyTxSign, txCallbackProperty, resolve, reject); + }); + } else { + handleContractPayment(contractObj, sendTxPayment, onlyTxSign, 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); + } +} + +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) { + //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, 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 (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); + txJson.Certificate = util.convertStringToHex (chainSQL.connect.userCert); + + data.txJSON = JSON.stringify(txJson); + } + + let signedRet = chainSQL.api.sign(data.txJSON, chainSQL.connect.secret); + if(onlyTxSign === true) { + sucFunc(signedRet); + } else { + submitContractTx(contractObj, signedRet, callbackProperty.callbackExpect, errFunc, sucFunc); + } + }).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); +} +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; +} +function submitContractTx(contractObj, signedVal, callbackExpect, errFunc, sucFunc){ + let chainSQL = contractObj.chainsql; + + //according to callbackProperty to subscribe event + if(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 (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; + } + if(data.hasOwnProperty("error")){ + resultObj.resultCode = data.error; + } + 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(callbackExpect !== "send_success"){ + unsubscribeTx(callbackExpect, chainSQL, signedVal, errFunc); + } + //return error message + errFunc(result); + } else { + // submit successfully + if(callbackExpect === "send_success"){ + sucFunc({ + status: "send_success", + tx_hash: signedVal.id + }); + } + } + }).catch(function(error) { + unsubscribeTx(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); + }); + } +} + +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); + }); + }); +} + +function calculateCtrAddr(ctrOwnerAddr, sequence){ + 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; +} + +function encodeChainsqlAddrParam(types, result){ + types.map(function(item, index) { + if(item.type === "address"){ + 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; + 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) { + 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; + 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; +} + +/** + * Get the callback and modiufy the array if necessary + * + * @method _getCallback + * @param {Array} 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! + } +}; + +/** + * Generates the options for the execute call + * + * @method _processExecuteArguments + * @param {Array} args + * @param {Promise} defer + */ +Contract.prototype._processExecuteArguments = function _processExecuteArguments(args/*, defer*/) { + var processedArgs = {}; + + processedArgs.type = args.shift(); + + // 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; + + processedArgs.options = this._parent._getOrSetDefaultOptions(processedArgs.options); + processedArgs.options.data = this.encodeABI(); + + // add contract 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; + } + + return processedArgs; +}; + +module.exports = Contract; \ No newline at end of file diff --git a/src/submit.js b/src/submit.js index 6988119..828bb3c 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-applet').ChainsqlLibAPI; const Connection = require('./connect'); @@ -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 93d2c2d59f1d284a047674333c1b2279740b268a Mon Sep 17 00:00:00 2001 From: Mojicode Date: Thu, 30 Dec 2021 16:30:19 +0800 Subject: [PATCH 46/53] delete table related code --- src/eventManager.js | 74 ------------ src/index.js | 273 -------------------------------------------- 2 files changed, 347 deletions(-) diff --git a/src/eventManager.js b/src/eventManager.js index 1266221..c8fa39f 100644 --- a/src/eventManager.js +++ b/src/eventManager.js @@ -152,7 +152,6 @@ function onMessage(that,dataRes){ var key; if (data.type === 'table') { key = data.tablename + data.owner; - _onChainsqlMessage(that,key,data,data.owner,data.tablename); } if (data.type === 'singleTransaction') { key = data.transaction.hash; @@ -181,9 +180,6 @@ function onMessage(that,dataRes){ }); let output = contractObj._decodeEventABI(currentEvent, data); that.cache[key](null, output); - // delete that.cache[key]; - // let keyIndex = contractObj.registeredEvent.indexOf(key); - // contractObj.registeredEvent.splice(keyIndex,1); } } } @@ -200,74 +196,4 @@ function _isChainsqlType(data){ } } -function _onChainsqlMessage(that,key,data,owner,name){ - if(that.cachePass[key]){ - _makeCallback(that,key,data); - }else{ - if(data.transaction.OpType === 2 || data.transaction.OpType === 3 || data.transaction.OpType === 11){ - that.cachePass[key] = null; - _makeCallback(that,key,data); - } else { - util.getUserToken(that.connect,owner,that.chainsql.connect.address,name).then(function(tokenData){ - var token = tokenData[owner + name]; - if (token != '') { - var secret = util.decodeToken(that.chainsql, token); - that.cachePass[key] = secret; - _makeCallback(that,key,data); - }else{ - that.cachePass[key] = null; - _makeCallback(that,key,data); - } - }).catch(function(err){ - if(err.name === "tabUnauthorized"){ - console.log(err.message); - that.cachePass[key] = null; - _makeCallback(that,key,data); - } else { - console.error(err); - } - }); - } - } -} - -function _makeCallback(that,key,data){ - _decryptData(that.cachePass[key],data.transaction); - if (that.cache[key]) { - that.cache[key](null, data); - } -} - -function _decryptData(pass,tx){ - if(tx.Tables){ - var table = tx.Tables[0].Table; - table.TableName = util.convertHexToString(table.TableName); - if(table.TableNewName){ - table.TableNewName = util.convertHexToString(table.TableNewName); - } - } - - if(tx.Raw){ - if(pass){ - 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); - } - } - - if(tx.Statements){ - var statement = util.convertHexToString(tx.Statements); - var stateJson = JSON.parse(statement); - for(var i=0; i { - - if(res.validatedLedger.dropsPerByte != undefined){ - - dropsPerByte = parseInt(res.validatedLedger.dropsPerByte); - } - - txJson.Fee = util.calcFee(txJson,dropsPerByte); - data.txJSON = JSON.stringify(txJson); - let signedRet = ChainSQL.api.sign(data.txJSON, ChainSQL.connect.secret); - ChainSQL.handleSignedTx(ChainSQL, signedRet, cbResult.expectOpt, resolve, reject); - - }).catch(err => { - cb(err, null); - }); - - - }).catch(function (error) { - cb(error, null); - }); - }).catch(function (error) { - ChainSQL.transaction = false; - cb(error, null); - }); - }).catch(error => { - ChainSQL.transaction = false; - cb(error, null); - }); -} - -ChainsqlAPI.prototype.commit = function (cb) { - var that = this; - - if ((typeof cb) != 'function') { - return new Promise(function (resolve, reject) { - handleCommit(that, cb, resolve, reject); - }); - } else { - handleCommit(that, cb, null, null); - } -}; - ChainsqlAPI.prototype.sign = function (json, secret, option) { if (!json.Fee) { json.Fee = "50"; @@ -551,56 +370,6 @@ 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 - */ -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){ @@ -686,44 +455,6 @@ ChainsqlAPI.prototype.getBySqlUser = function(sql){ }); }; -ChainsqlAPI.prototype.createRandom = function() { - const chainsqlCon = this.connect; - return chainsqlCon.api.connection.request({ - command: "g_createrandom" - }); -}; - -ChainsqlAPI.prototype.generatCryptData = function(smAlgType, dataSetCount, plainLen) { - const chainsqlCon = this.connect; - return chainsqlCon.api.connection.request({ - command: "g_cryptdata", - alg_type: smAlgType, - data_set_count: dataSetCount, - plain_data_len: plainLen - }); -}; - -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){ var connect = this.connect; @@ -962,8 +693,4 @@ ChainsqlAPI.prototype.modifySchema = function(schemaInfo){ return this; }; -function callback(data, callback) { - -} - module.exports = ChainsqlAPI; From a7a175937f9e26d71e5bc85f877ab8c829befa2c Mon Sep 17 00:00:00 2001 From: dbliu Date: Thu, 6 Jan 2022 21:36:40 +0800 Subject: [PATCH 47/53] support to recove keypairs via mnemonic words --- package.json | 3 ++- src/index.js | 51 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 30c349b..e9fb8e8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "lodash": "^4.17.21", "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", + "rfc1751.js": "^1.0.0" }, "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index 8673ea9..64ad7b7 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,8 @@ const RippleAPI = require('chainsql-lib-applet').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, { prepareTx: require('./txPayment') @@ -138,38 +140,49 @@ ChainsqlAPI.prototype.contract = function(jsonInterface, address, options) { ChainsqlAPI.prototype.generateAddress = function () { - 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); + 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); - 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.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 + account.privateKey_hex = keypair.privateKey + return account } - var opt = { - version: 35 + + let options + if (arguments.length == 0) { + options = { + entropy: brorand(16) + } + } else { + options = arguments[0] } - var buf = Buffer.from(keypair.publicKey, 'hex'); - account.publicKey = addressCodec.encode(buf, opt); - return account; + return createAccount(options) } ChainsqlAPI.prototype.pay = function (account, amount, memos) { From 5992d6ef18a11baf9fd33eab5fdc1dfb3cf0cdb4 Mon Sep 17 00:00:00 2001 From: dbliu Date: Fri, 7 Jan 2022 10:31:09 +0800 Subject: [PATCH 48/53] remove privtekey encode in hex --- src/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 64ad7b7..53306c0 100644 --- a/src/index.js +++ b/src/index.js @@ -170,7 +170,6 @@ ChainsqlAPI.prototype.generateAddress = function () { var buf = Buffer.from(keypair.publicKey, 'hex'); account.publicKey = addressCodec.encode(buf, opt); account.publicKey_hex = keypair.publicKey - account.privateKey_hex = keypair.privateKey return account } @@ -181,6 +180,11 @@ ChainsqlAPI.prototype.generateAddress = function () { } } else { options = arguments[0] + if (typeof(options) === "object") { + if(!options.mnemonic && !options.entropy) { + options.entropy = brorand(16) + } + } } return createAccount(options) } From 7cce101e79a851ffd05db4d4b293f93515a4f5de Mon Sep 17 00:00:00 2001 From: dbliu Date: Fri, 7 Jan 2022 11:29:35 +0800 Subject: [PATCH 49/53] support for Wechat applet --- src/index.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 53306c0..2666820 100644 --- a/src/index.js +++ b/src/index.js @@ -173,16 +173,28 @@ ChainsqlAPI.prototype.generateAddress = function () { return account } + 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: brorand(16) + entropy: randomValues(16) } } else { options = arguments[0] if (typeof(options) === "object") { if(!options.mnemonic && !options.entropy) { - options.entropy = brorand(16) + options.entropy = randomValues(16) } } } From 505ea1619ef5fa78073f5edca4f8b4c734e8aaeb Mon Sep 17 00:00:00 2001 From: Mojicode Date: Fri, 7 Jan 2022 14:00:29 +0800 Subject: [PATCH 50/53] update npm package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9fb8e8..1283901 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.5", + "version": "1.0.7", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { From 1288bbf51ae0632cd34dcb6e7b874b54c8f39661 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 12 Jan 2022 16:13:53 +0800 Subject: [PATCH 51/53] add asym&sym enc&dec --- package.json | 2 +- src/index.js | 12 +++ src/lib/crypto.js | 202 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 208 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 1283901..a834e28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.7", + "version": "1.0.8", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index 2666820..5dab0c7 100644 --- a/src/index.js +++ b/src/index.js @@ -398,6 +398,18 @@ ChainsqlAPI.prototype.sign = function (json, secret, option) { let ripple = new RippleAPI(); return ripple.sign(JSON.stringify(json), secret, option); }; +ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') { + return crypto.symEncrypt(symKey,plaintext,algType); +} +ChainsqlAPI.prototype.symDecrypt = function (symKey, encryptedHex, algType = 'aes') { + return crypto.symDecrypt(symKey, encryptedHex, algType); +} +ChainsqlAPI.prototype.asymEncrypt = function (plainText, publicKey, algType = 'ecies') { + return crypto.asymEncrypt(plainText, publicKey, algType); +} +ChainsqlAPI.prototype.asymDecrypt = function (cipher, privateKey, algType = 'ecies') { + return crypto.asymDecrypt(cipher,privateKey, algType); +} ChainsqlAPI.prototype.getAccountTables = function(address, bGetDetailInfo=false){ var connection = this.api ? this.api.connection : this.connect.api.connection; diff --git a/src/lib/crypto.js b/src/lib/crypto.js index 5a62121..0568fb0 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -2,8 +2,13 @@ // requires const keypairs = require('chainsql-keypairs'); +const hashjs = require('hash.js'); +const elliptic = require('elliptic'); +const Secp256k1 = elliptic.ec('secp256k1'); +const addressCodec = require('chainsql-address-codec'); //var debug = require('debug')('crypto'); var crypto = require('crypto'); +var sjcl = require('sjcl'); const _ = require('lodash'); @@ -17,6 +22,131 @@ var IVLength = 16; // bytes var ACCOUNT_PUBLIC = 35; var PUBLICKEY_LENGTH = 33; +function eciesEncrypt(message, publicKey) { + var plainMsgBuf = Buffer.from(message, 'utf8'); + + if(!publicKey) + throw new Error('eciesEncrypt publicKey is undefined'); + + if(publicKey.length != 2 * PUBLICKEY_LENGTH){ + var decodedPublic = decodePublic(publicKey); + publicKey = Bytes2HexString(decodedPublic); + } + var ecdsaRecipientPublicKey = Secp256k1.keyFromPublic(publicKey, 'hex'); + + // Generate ephemeral key-pair + const seed = keypairs.generateSeed(); + const ephKeyPair = keypairs.deriveKeypair(seed); + var ephPrivKey = Secp256k1.keyFromPrivate(ephKeyPair.privateKey, 'hex'); + var Rb = ephKeyPair.publicKey; + //console.log("ephKeyPair.publicKey:",Rb); + + //const alice = crypto.createECDH('secp256k1'); + //alice.setPrivateKey(ephPrivKey.getPrivate('hex'), 'hex'); + //var Z = alice.computeSecret(ecdsaRecipientPublicKey.getPublic('hex'), 'hex'); + + var Z = ephPrivKey.derive(ecdsaRecipientPublicKey.pub); + 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); + var hmacKey = kdfOutput.slice(AESKeyLength, AESKeyLength + HMACKeyLength); + //console.log('[aesKey] ', new Buffer(aesKey).toString('hex')); + //console.log('[hmacKey] ', new Buffer(hmacKey, 'hex')); + var iv = crypto.randomBytes(IVLength); + var D = hmac(hmacKey, plainMsgBuf); + var cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(aesKey), iv); + var plainBuf = Buffer.concat([Buffer.from(D), plainMsgBuf]); + //console.log('[decryptedBytes] ', plainBuf.toString('hex')+" len="+plainBuf.length); + var encryptedBytes = cipher.update(plainBuf); + encryptedBytes = Buffer.concat([encryptedBytes, cipher.final()]); + //console.log('[iv] ', iv.toString('hex')+" len="+iv.length); + //console.log('[D] ', new Buffer(D).toString('hex')+" len="+D.length); + //console.log('[encryptedBytes] ', encryptedBytes.toString('hex')+" len="+encryptedBytes.length); + return Buffer.concat([Buffer.from(Rb, 'hex'), iv, encryptedBytes]).toString('hex'); +} + +function eciesDecrypt(messageHex, privateKey) { + var level = 256; + var Rb_len = 33; + var D_len = level >> 3; + var cipherText = Buffer.from(messageHex, 'hex'); + var ct_len = cipherText.length; + + if (ct_len < Rb_len + IVLength + D_len + AESBlockLength) + throw new Error("Illegal cipherText length: " + ct_len + " must be >= " + (Rb_len + IVLength + D_len + AESBlockLength)); + + var Rb = cipherText.slice(0, Rb_len); // ephemeral public key bytes + var iv = cipherText.slice(Rb_len, Rb_len + IVLength); + //console.log('[iv] ', iv.toString('hex')+" len="+iv.length); + var EM = cipherText.slice(Rb_len + IVLength); // encrypted content bytes + //console.log('[encryptedBytes] ', EM.toString('hex')+" len="+EM.length); + var ecdsa = Secp256k1; + //convert bytes to usable key object + //var ephPubKey = ecdsa.keyFromPublic(ephKeyPair.publicKey, 'hex'); + var ephPubKey = ecdsa.keyFromPublic(Rb.toString('hex'), 'hex'); + //var encPrivKey = ecdsa.keyFromPrivate(ecKeypair2.prvKeyObj.prvKeyHex, 'hex'); + var privKey = ecdsa.keyFromPrivate(privateKey, 'hex'); + var Z = privKey.derive(ephPubKey.pub); + 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); + //console.log('[aesKey] ', new Buffer(aesKey, 'hex')); + //console.log('[hmacKey] ', new Buffer(hmacKey, 'hex')); + + var cipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(aesKey), iv); + var decryptedBytes = cipher.update(EM); + decryptedBytes = Buffer.concat([decryptedBytes, cipher.final()]); + //console.log('[decryptedBytes] ', decryptedBytes.toString('hex')+" len="+decryptedBytes.length); + var D = decryptedBytes.slice(0, D_len); + var plainMsgBuf = Buffer.from(decryptedBytes.slice(D_len)); + + var recoveredD = hmac(hmacKey, plainMsgBuf); + //debug('recoveredD: ', new Buffer(recoveredD).toString('hex')); + if (D.compare(Buffer.from(recoveredD)) != 0) { + // debug("D="+D.toString('hex')+" vs "+new Buffer(recoveredD).toString('hex')); + throw new Error("HMAC verify failed"); + } + //console.log("plainMsg: ",plainMsgBuf.toString()); + return plainMsgBuf; +} +function hmac(key, bytes) { + //debug('key: ', JSON.stringify(key)); + //debug('bytes: ', JSON.stringify(bytes)); + var hmac = new sjcl.misc.hmac(bytesToBits(key), sjcl.hash.sha256); + hmac.update(bytesToBits(bytes)); + var result = hmac.digest(); + //debug("result: ", bitsToBytes(result)); + return bitsToBytes(result); +} + +function decodePublic(publicKey){ + var decoded = addressCodec.decode(publicKey, ACCOUNT_PUBLIC); + return decoded.slice(1,1+PUBLICKEY_LENGTH); +} /** * byte型转换十六进制 * @param b @@ -36,6 +166,36 @@ const Bytes2HexString = (b)=> { return hexs; } +function bitsToBytes(arr) { + var out = [], + bl = sjcl.bitArray.bitLength(arr), + i, tmp; + for (i = 0; i < bl / 8; i++) { + if ((i & 3) === 0) { + tmp = arr[i / 4]; + } + out.push(tmp >>> 24); + tmp <<= 8; + } + return out; +} +/** Convert from an array of bytes to a bitArray. */ +function bytesToBits(bytes) { + var out = [], + i, tmp = 0; + for (i = 0; i < bytes.length; i++) { + tmp = tmp << 8 | bytes[i]; + if ((i & 3) === 3) { + out.push(tmp); + tmp = 0; + } + } + if (i & 3) { + out.push(sjcl.bitArray.partial(8 * (i & 3), tmp)); + } + return out; +} + function paddingPass(password,keyLen){ if(password.length < keyLen){ var pass =Buffer.from(password); @@ -70,6 +230,17 @@ 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); + } +}; + var aesEncrypt = function(secret, plaintext) { var secretPadded = paddingPass(secret,AESKeyLength); var aesKey =Buffer.from(secretPadded, 'utf8'); @@ -88,15 +259,28 @@ 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); - } + return keypairs.softGMAlgSymDec(symKey, encryptedHex); + }else { + return aesDecrypt(symKey, encryptedHex); + } }; + 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'); @@ -110,6 +294,10 @@ var aesDecrypt = function(secret, encryptedHex) { }; module.exports = { + eciesEncrypt, + eciesDecrypt, symEncrypt, - symDecrypt + symDecrypt, + asymEncrypt, + asymDecrypt }; \ No newline at end of file From dbf6d35443513b50ed2df5e26748ddd47685f29e Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 12 Jan 2022 17:38:51 +0800 Subject: [PATCH 52/53] update package version --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a834e28..a5009cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.8", + "version": "1.0.9", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { @@ -8,7 +8,10 @@ "dependencies": { "chainsql-keypairs": "^0.11.1", "chainsql-lib-applet": "^1.0.8", + "elliptic": "^5.1.0", + "hash.js": "^1.0.3", "lodash": "^4.17.21", + "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", From 0a6141f13eff07e59261ca453a77c5fe3e248603 Mon Sep 17 00:00:00 2001 From: Mojicode Date: Wed, 12 Jan 2022 18:08:56 +0800 Subject: [PATCH 53/53] 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 a5009cb..7451ade 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chainsql-wechat-applet", - "version": "1.0.9", + "version": "1.0.10", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { diff --git a/src/lib/crypto.js b/src/lib/crypto.js index 0568fb0..75da048 100644 --- a/src/lib/crypto.js +++ b/src/lib/crypto.js @@ -269,14 +269,14 @@ var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { }; 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); } };