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 18719ac..7451ade 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,21 @@ { - "name": "chainsql", - "version": "0.6.67", + "name": "chainsql-wechat-applet", + "version": "1.0.10", "description": "An database driver for chainsql ", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "bignumber.js": "^2.4.0", - "chainsql-keypairs": "^0.10.6", - "chainsql-lib": "^0.17.44", - "co": "^4.6.0", + "chainsql-keypairs": "^0.11.1", + "chainsql-lib-applet": "^1.0.8", "elliptic": "^5.1.0", "hash.js": "^1.0.3", - "lodash": "^4.17.15", - "protobufjs": "^6.8.0", + "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", - "ws": "^7.2.0" + "rfc1751.js": "^1.0.0" }, "repository": { "type": "git", diff --git a/solidity-example/solidity-TableTxs.sol b/solidity-example/solidity-TableTxs.sol deleted file mode 100644 index 506aebb..0000000 --- a/solidity-example/solidity-TableTxs.sol +++ /dev/null @@ -1,159 +0,0 @@ -pragma solidity ^0.4.4; - -contract DBTest { - /* - * @param tableName eg: "test1" - * @param raw eg: "[{\"field\":\"id\", \"type\" : \"int\", \"length\" : 11, \"PK\" : 1, \"NN\" : 1, \"UQ\" : 1}, { \"field\":\"account\", \"type\" : \"varchar\" }, { \"field\":\"age\", \"type\" : \"int\" }]" - */ - function create(string tableName, string raw) public{ - msg.sender.create(tableName, raw); - } - /* - * @param tableName eg: "test1" - */ - function drop(string tableName) public{ - msg.sender.drop(tableName); - } - - /* - * @param owner table's owner' - * @param tableName eg: "test1" - * @param raw eg: "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":0}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]" - */ - function insert(address owner, string tableName, string raw) public{ - owner.insert(tableName, raw); - } - - /* - * @param tableName eg: "test1" - * @param raw eg: "[{\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":0}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":1}, {\"account\":\"zU42yDW3fzFjGWosdeVjVasyPsF4YHj224\", \"id\":2}]" - */ - function insert(string tableName, string raw) public { - msg.sender.insert(tableName, raw); - } - - /* - * @param owner table's owner' - * @param tableName "test1" - * @param raw eg: "{\"id\":1}" - */ - function deletex(address owner, string tableName, string raw) public { - owner.deletex(tableName, raw); - } - - /* - * @param tableName "test1" - * @param raw eg: "{\"id\":1}" - */ - function deletex(string tableName, string raw) public { - msg.sender.deletex(tableName, raw); - } - - /* - * @param owner table's owner' - * @param tableName eg: "test1" - * @param rawUpdate eg: "{\"age\":15}" - * @param rawGet eg: "{\"id\": 2}" - */ - function update(address owner, string tableName, string rawUpdate, string rawGet) public{ - owner.update(tableName, rawUpdate, rawGet); - } - - /* - * @param tableName eg: "test1" - * @param rawUpdate eg: "{\"age\":15}" - * @param rawGet eg: "{\"id\": 2}" - */ - function update(string tableName, string rawUpdate, string rawGet) public{ - msg.sender.update(tableName, rawUpdate, rawGet); - } - - /* - * @param tableName eg: "test1" - * @param tableNameNew eg: "testNew1" - */ - function rename(string tableName, string tableNameNew) public{ - msg.sender.rename(tableName, tableNameNew); - } - - /* - * @param toWho ethereum address to be granted. need convert chainsql addr 2 ethereum addr .eg: "0xzzzzzzzzzzzzzzzzzzzzBZbvji" - * @param tableName eg: "test1" - * @param raw eg: "{\"insert\":false, \"delete\":false}" - */ - function grant(address toWho, string tableName, string raw) public{ - return msg.sender.grant(toWho, tableName, raw); - } - - function sqlTransaction(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}"); - db.commit(); - } - - /* - * @param owner table's owner' - * @param tableName eg: "test1" - * @param raw eg: "" - */ - function get(address owner, string tableName, string raw) public view returns(string) { - uint256 handle = owner.get(tableName, raw); - require(handle != uint256(0), "Get table data failed,maybe user not authorized!"); - uint row = db.getRowSize(handle); - uint col = db.getColSize(handle); - string memory xxx; - for(uint i=0; i= 16) { + options.entropy = rfc1751.etob(options.mnemonic) } + let seed = keypairs.generateSeed(options); + keypair = keypairs.deriveKeypair(seed); + + if (typeof (seed) !== "object") { + // ed25519 + account.secret = seed; + account.mnemonic = rfc1751.btoe(options.entropy) + } else { + // softGMAlg + account.secret = util.encodeChainsqlAccountSecret(keypair.privateKey) + } + } else { + keypair = keypairs.deriveKeypair(arguments[0]) + account.secret =arguments[0] } - } - var opt = { - version: 35 - } - var buf = Buffer.from(keypair.publicKey, 'hex'); - account.publicKey = addressCodec.encode(buf, opt); - return account; -} + account.address = keypairs.deriveAddress(keypair.publicKey); -// 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); - }); + var opt = { + version: 35 + } + var buf = Buffer.from(keypair.publicKey, 'hex'); + account.publicKey = addressCodec.encode(buf, opt); + account.publicKey_hex = keypair.publicKey + return account } - catch (error) { - reject(error); + + let randomValues = function(length) { + let array = []; + if (global.wx) { + for (var i = 0, l = length; i < l; i++) { + array[i] = Math.floor(Math.random() * 256); + } + } else { + array = brorand(length) + } + return array } + let options + if (arguments.length == 0) { + options = { + entropy: randomValues(16) + } + } else { + options = arguments[0] + if (typeof(options) === "object") { + if(!options.mnemonic && !options.entropy) { + options.entropy = randomValues(16) + } + } + } + return createAccount(options) } ChainsqlAPI.prototype.pay = function (account, amount, memos) { @@ -270,176 +241,6 @@ ChainsqlAPI.prototype.payToContract = function (contractAddr, value, gas) { return ripple.payToContract(contractAddr, value, gas); } -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); - if(that.connect.secret === "gmAlg") { - payment.raw = crypto.symEncrypt(symKey, payment.raw, "gmAlg").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); - } - 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.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); @@ -496,11 +297,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); @@ -590,201 +391,6 @@ ChainsqlAPI.prototype.getLedgerVersion = function (cb) { } }; -ChainsqlAPI.prototype.beginTran = function () { - if (this.connect && this.connect.address) { - this.cache = []; - this.transaction = true; - return; - } -} - -function handleCommit(ChainSQL, object, resolve, reject) { - var isFunction = false; - - let cbResult = util.parseCb(object); - isFunction = cbResult.isFunction; - - var cb = function (error, data) { - if (isFunction) { - if (object == null) - object = callback; - object(error, data) - } else { - if (error) { - reject(error); - } else { - resolve(data); - } - } - } - - var ary = []; - var secretMap = {}; - var cache = ChainSQL.cache; - for (var i = 0; i < cache.length; i++) { - var noRaw = [2, 3, 5, 7]; - if (noRaw.indexOf(cache[i].OpType) != -1) { - continue; - } - - if (cache[i].OpType == 1) { - var key = ChainSQL.connect.address + cache[i].TableName; - if (cache[i].confidential) { - secretMap[key] = generateToken(ChainSQL.connect.secret); - } else { - secretMap[key] = " "; - } - //secretMap[cache[i].TableName] = generateToken(ChainSQL.connect.secret); - } - - if (cache[i].OpType != 1) { - var address = cache[i].Owner ? cache[i].Owner : ChainSQL.connect.address; - var key = address + cache[i].TableName; - if (!secretMap[key]) { - ary.push(getUserToken(ChainSQL.api.connection, address, ChainSQL.connect.address, ChainSQL.cache[i].TableName)); - } - } - }; - - Promise.all(ary).then(function (data) { - for (var i = 0; i < data.length; i++) { - for (var key in data[i]) { - secretMap[key] = data[i][key]; - } - }; - - var payment = { - "TransactionType": "SQLTransaction", - "Account": ChainSQL.connect.address, - "Statements": [], - "StrictMode": ChainSQL.strictMode, - "NeedVerify": ChainSQL.needVerify - }; - - for (var i = 0; i < cache.length; i++) { - var address = cache[i].Owner ? cache[i].Owner : ChainSQL.connect.address; - var key = address + cache[i].TableName; - if (secretMap[key] && secretMap[key] != " ") { - var token = secretMap[key]; - - var secret = decodeToken(ChainSQL, token); - if (cache[i].Raw) { - if (cache[i].OpType != opType.t_grant) { - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; - cache[i].Raw = crypto.symEncrypt(secret, JSON.stringify(cache[i].Raw), algType).toUpperCase(); - } else { - cache[i].Raw = convertStringToHex(JSON.stringify(cache[i].Raw)); - } - }; - - if (cache[i].OpType == opType['t_assign'] || cache[i].OpType == opType['t_grant']) { - token = crypto.eciesEncrypt(secret, cache[i].publicKey); - }; - - if (cache[i].OpType == opType['t_assign'] || cache[i].OpType == opType['t_grant'] || cache[i].OpType == opType['t_create']) { - cache[i].Token = token; - //remove publicKey field - delete cache[i].publicKey; - } - } else { - cache[i].Raw = convertStringToHex(JSON.stringify(cache[i].Raw)); - delete cache[i].publicKey; - } - - var tableName = cache[i].TableName; - cache[i].Tables = [{ - Table: { - TableName: convertStringToHex(tableName) - } - }]; - delete cache[i].TableName; - delete cache[i].confidential; - payment.Statements.push(cache[i]); - } - - //clear transactin status - ChainSQL.transaction = false; - ChainSQL.cache = []; - - getTxJson(ChainSQL, payment).then(function (data) { - var payment = data.tx_json; - payment.Statements = convertStringToHex(JSON.stringify(payment.Statements)); - ChainSQL.api.prepareTx(payment).then(function (data) { - - - var txJson = JSON.parse(data.txJSON); - - var dropsPerByte = Math.ceil(1000000.0 / 1024); - ChainSQL.api.getServerInfo().then(res => { - - 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); - } -}; - -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; - } - 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"; @@ -792,14 +398,17 @@ ChainsqlAPI.prototype.sign = function (json, secret, option) { let ripple = new RippleAPI(); return ripple.sign(JSON.stringify(json), secret, option); }; - -ChainsqlAPI.prototype.eciesEncrypt = function (plainText, publicKey) { - return crypto.eciesEncrypt(plainText,publicKey); +ChainsqlAPI.prototype.symEncrypt = function (symKey, plaintext, algType = 'aes') { + return crypto.symEncrypt(symKey,plaintext,algType); } - -ChainsqlAPI.prototype.eciesDecrypt = function (cipher, secret) { - var keypair = keypairs.deriveKeypair(secret); - return crypto.eciesDecrypt(cipher,keypair.privateKey); +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){ @@ -887,24 +496,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.getLedgerTxs = function(ledgerIndex,includeSuccess,includeFailure){ var connect = this.connect; @@ -927,7 +518,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; }; @@ -954,20 +545,193 @@ 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']) { - handleGrantPayment(that).then(() => { - that.api.prepareTable(that, that.payment, resolve, reject); - }).catch(error => { - reject(error); + + 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 { - that.api.prepareTable(that, that.payment, resolve, reject); + } }) } -function callback(data, callback) { - +/** + * 设置操作链的ID + * @param {16进制字符串} schemaID schemaID="" 代表操作的是主链; + */ +ChainsqlAPI.prototype.setSchema = function(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"); + } + + 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, + Validators: schemaInfo.Validators, + PeerList:peerlists, + TransactionType: 'SchemaCreate' + }; + + if(schemaInfo.SchemaAdmin !== undefined){ + schemaCreateTxJson.SchemaAdmin = schemaInfo.SchemaAdmin; + } + + if(schemaCreateTxJson.SchemaStrategy === 2 ){ + + if(schemaInfo.AnchorLedgerHash === undefined ){ + throw new Error("Missing field AnchorLedgerHash"); + } + schemaCreateTxJson.AnchorLedgerHash = schemaInfo.AnchorLedgerHash; + }else{ + if(schemaInfo.AnchorLedgerHash){ + throw new Error("Field 'AnchorLedgerHash' is unnecessary"); + } + } + + 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 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; + this.payment = schemaModifyTxJson; + return this; +}; + module.exports = ChainsqlAPI; diff --git a/lib/config.js b/src/lib/config.js similarity index 74% rename from lib/config.js rename to src/lib/config.js index b6ff4be..74904b6 100644 --- a/lib/config.js +++ b/src/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/crypto.js b/src/lib/crypto.js similarity index 57% rename from lib/crypto.js rename to src/lib/crypto.js index 1b5e1cc..75da048 100644 --- a/lib/crypto.js +++ b/src/lib/crypto.js @@ -6,14 +6,10 @@ 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'); var AESKeyLength = 32; @@ -50,10 +46,18 @@ function eciesEncrypt(message, publicKey) { //var Z = alice.computeSecret(ecdsaRecipientPublicKey.getPublic('hex'), 'hex'); var Z = ephPrivKey.derive(ecdsaRecipientPublicKey.pub); - //console.log('[Z]: %j', Z); - //console.log('Z computed', Z.length); - // console.log('secret: ', Buffer.from(Z.toArray(), 'hex')); - var kdfOutput = hashjs.sha512().update(Z.toArray()).digest(); + let zArray = Z.toArray(); + if(zArray.length > 32) { + throw new Error('ECDH error!'); + } + else if(zArray.length < 32) { + let padNum = 32 - zArray.length; + for(let num = 0; num < padNum; num ++) + { + zArray.unshift(0); + } + } + var kdfOutput = hashjs.sha512().update(zArray).digest(); //var kdfOutput = hkdf(Z.toArray(), ECIESKDFOutput, null, null); //console.log('[kdfOutput]: ', new Buffer(kdfOutput).toString('hex') +" len="+kdfOutput.length); var aesKey = kdfOutput.slice(0, AESKeyLength); @@ -94,11 +98,19 @@ function eciesDecrypt(messageHex, privateKey) { var ephPubKey = ecdsa.keyFromPublic(Rb.toString('hex'), 'hex'); //var encPrivKey = ecdsa.keyFromPrivate(ecKeypair2.prvKeyObj.prvKeyHex, 'hex'); var privKey = ecdsa.keyFromPrivate(privateKey, 'hex'); - // debug('computing Z...', privKey, ephPubKey); var Z = privKey.derive(ephPubKey.pub); - //console.log('Z computed', Z); - //console.log('secret: ', new Buffer(Z.toArray(), 'hex')); - var kdfOutput = hashjs.sha512().update(Z.toArray()).digest(); + let zArray = Z.toArray(); + if(zArray.length > 32) { + throw new Error('ECDH error!'); + } + else if(zArray.length < 32) { + let padNum = 32 - zArray.length; + for(let num = 0; num < padNum; num ++) + { + zArray.unshift(0); + } + } + var kdfOutput = hashjs.sha512().update(zArray).digest(); //var kdfOutput = hkdf(Z.toArray(), ECIESKDFOutput, null, null); var aesKey = kdfOutput.slice(0, AESKeyLength); var hmacKey = kdfOutput.slice(AESKeyLength, AESKeyLength + HMACKeyLength); @@ -121,7 +133,6 @@ function eciesDecrypt(messageHex, privateKey) { //console.log("plainMsg: ",plainMsgBuf.toString()); return plainMsgBuf; } - function hmac(key, bytes) { //debug('key: ', JSON.stringify(key)); //debug('bytes: ', JSON.stringify(bytes)); @@ -211,11 +222,25 @@ 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); } }; + 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'); @@ -234,13 +259,28 @@ var aesEncrypt = function(secret, plaintext) { * @returns string 解密后的明文 */ var symDecrypt = function(symKey, encryptedHex, algType = 'aes') { - if(algType === "gmAlg") { - return keypairs.gmAlgSymDec(symKey, encryptedHex); - } else { - return aesDecrypt(symKey, encryptedHex); - } + if(algType === "gmAlg") { + return keypairs.gmAlgSymDec(symKey, encryptedHex); + } else if(algType === "softGMAlg"){ + 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 { + const keypair = keypairs.deriveKeypair(privateKey); + return eciesDecrypt(encryptedHex, keypair.privateKey); + } }; + var aesDecrypt = function(secret, encryptedHex) { var secretPadded = paddingPass(secret,AESKeyLength); var aesKey =Buffer.from(secretPadded, 'utf8'); @@ -253,167 +293,11 @@ 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 64 || name.length == 0){ - throw new Error("tabla name not valid"); + throw new Error("table name not valid"); } let result = []; if (!isArrayFn(obj)) { @@ -37,6 +37,7 @@ function create(name,obj) { case "text": case "datetime": case "date": + case "longtext": break; case "varchar": case "char": 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 93353e0..c54428f 100644 --- a/src/ripple.js +++ b/src/ripple.js @@ -1,8 +1,8 @@ 'use strict' -var util = require('../lib/util'); +var util = require('./lib/util'); var Submit = require('./submit'); -const FloatOperation = require('../lib/floatOperation'); -var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +const FloatOperation = require('./lib/floatOperation'); +var chainsqlLibUtils = require('chainsql-lib-applet').ChainsqlLibUtil; class Ripple extends Submit { constructor(ChainsqlAPI) { @@ -73,6 +73,7 @@ Ripple.prototype.prepareJson = function () { txJson.source.maxAmount.value = (FloatOperation.accAdd(parseFloat(value), fee)).toString(); } } + self.ChainsqlAPI.api.preparePayment(self.ChainsqlAPI.connect.address, txJson, instructions) .then(function (data) { resolve(data); @@ -212,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 index 5ffe469..6aa6ba7 100644 --- a/src/smartContract.js +++ b/src/smartContract.js @@ -1,12 +1,12 @@ "use strict"; -var util = require('../lib/util'); +var util = require('./lib/util'); const _ = require('lodash'); -var chainsqlLibUtils = require('chainsql-lib').ChainsqlLibUtil; +var chainsqlLibUtils = require('chainsql-lib-applet').ChainsqlLibUtil; const keypairs = require('chainsql-keypairs'); -const chainsqlUtils = require('../lib/util'); -const chainsqlError = require('../lib/error'); +const chainsqlUtils = require('./lib/util'); +const chainsqlError = require('./lib/error'); var abi = require('web3-eth-abi'); var utils = require('web3-utils'); var formatters = require('web3-core-helpers').formatters; @@ -22,161 +22,114 @@ const preDefOptions = ["ContractData", "arguments", "ContractValue", "Gas", "exp * @param {Object} options */ var Contract = function Contract(chainsql, jsonInterface, address, options) { - var _this = this, - args = Array.prototype.slice.call(arguments); - - this.chainsql = chainsql; - this.connect = chainsql.connect; - - if(!(this instanceof Contract)) { - throw chainsqlError('Please use the "new" keyword to instantiate a chainsql contract() object!'); - } - - // sets _requestmanager - //core.packageInit(this, [this.constructor.currentProvider]); - - //this.clearSubscriptions = this._requestManager.clearSubscriptions; - - if(!jsonInterface || !(Array.isArray(jsonInterface))) { - throw chainsqlError('You must provide the json interface of the contract when instantiating a contract object.'); - } - - // create the options object - this.options = {}; - - // var lastArg = args[args.length - 1]; - // if(_.isObject(lastArg) && !_.isArray(lastArg)) { - // options = lastArg; - - // this.options = _.extend(this.options, this._getOrSetDefaultOptions(options)); - // if(_.isObject(address)) { - // address = null; - // } - // } - - // set address - Object.defineProperty(this.options, 'address', { - set: function(value){ - if(value) { - //_this._address = utils.toChecksumAddress(formatters.inputAddressFormatter(value)); - _this._address = value;//may add a addr validation check like above; - } - }, - get: function(){ - return _this._address; - }, - enumerable: true - }); - - // add method and event signatures, when the jsonInterface gets set - Object.defineProperty(this.options, 'jsonInterface', { - set: function(value){ - _this.methods = {}; - _this.events = {}; - - _this._jsonInterface = value.map(function(method) { - var func, - funcName; - - if (method.name) { - funcName = utils._jsonInterfaceMethodToString(method); - } - - // function - if (method.type === 'function') { - method.signature = abi.encodeFunctionSignature(funcName); - func = _this._createTxObject.bind({ - method: method, - parent: _this - }); - - // add method only if not one already exists - if(!_this.methods[method.name]) { - _this.methods[method.name] = func; - } else { - var cascadeFunc = _this._createTxObject.bind({ - method: method, - parent: _this, - nextMethod: _this.methods[method.name] - }); - _this.methods[method.name] = cascadeFunc; - } - - // definitely add the method based on its signature - _this.methods[method.signature] = func; - - // add method by name - _this.methods[funcName] = func; - // event - } else if (method.type === 'event') { - method.signature = abi.encodeEventSignature(funcName); - var event = _this._on.bind(_this, method.signature); - - // add method only if not already exists - if(!_this.events[method.name] || _this.events[method.name].name === 'bound ') - _this.events[method.name] = event; - - // definitely add the method based on its signature - _this.events[method.signature] = event; - - // add event by name - _this.events[funcName] = event; - } - return method; - }); - - // add allEvents - //_this.events.allEvents = _this._on.bind(_this, 'allevents'); - return _this._jsonInterface; - }, - get: function(){ - return _this._jsonInterface; - }, - enumerable: true - }); - - // get default account from the Class - // var defaultAccount = this.constructor.defaultAccount; - // var defaultBlock = this.constructor.defaultBlock || 'latest'; - - // Object.defineProperty(this, 'defaultAccount', { - // get: function () { - // return defaultAccount; - // }, - // set: function (val) { - // if(val) { - // defaultAccount = utils.toChecksumAddress(formatters.inputAddressFormatter(val)); - // } - - // return val; - // }, - // enumerable: true - // }); - // Object.defineProperty(this, 'defaultBlock', { - // get: function () { - // return defaultBlock; - // }, - // set: function (val) { - // defaultBlock = val; - - // return val; - // }, - // enumerable: true - // }); - - // properties - this.methods = {}; - this.events = {}; - - this._address = null; - this._jsonInterface = []; - this.registeredEvent = []; - - // set getter/setter properties - this.options.isDeploy = false; - this.options.isFirstSubscribe = true; - this.options.address = address; - this.options.jsonInterface = jsonInterface; + var _this = this, + args = Array.prototype.slice.call(arguments); + + this.chainsql = chainsql; + this.connect = chainsql.connect; + + if(!(this instanceof Contract)) { + throw chainsqlError('Please use the "new" keyword to instantiate a chainsql contract() object!'); + } + + 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; }; /** @@ -187,25 +140,25 @@ var Contract = function Contract(chainsql, jsonInterface, address, options) { * @return {Object} the options with gaps filled by defaults */ Contract.prototype._getOrSetDefaultOptions = function getOrSetDefaultOptions(options) { - for(let key in options) { - if( preDefOptions.indexOf(key) === -1 ) { - let errMsg = "Find a unexpected key in options: " + key; - throw chainsqlError(errMsg); - } - } - var gasPrice = options.gasPrice ? String(options.gasPrice): null; - var from = options.from ? utils.toChecksumAddress(formatters.inputAddressFormatter(options.from)) : null; + for(let key in options) { + if( preDefOptions.indexOf(key) === -1 ) { + let errMsg = "Find a unexpected key in options: " + key; + throw chainsqlError(errMsg); + } + } + var gasPrice = options.gasPrice ? String(options.gasPrice): null; + var from = options.from ? utils.toChecksumAddress(formatters.inputAddressFormatter(options.from)) : null; - options.data = options.data || this.options.data; + options.data = options.data || this.options.data; - options.from = from || this.options.from; - options.gasPrice = gasPrice || this.options.gasPrice; - options.gas = options.gas || options.gasLimit || this.options.gas; + options.from = from || this.options.from; + options.gasPrice = gasPrice || this.options.gasPrice; + options.gas = options.gas || options.gasLimit || this.options.gas; - // TODO replace with only gasLimit? - delete options.gasLimit; + // TODO replace with only gasLimit? + delete options.gasLimit; - return options; + return options; }; /** @@ -217,63 +170,63 @@ Contract.prototype._getOrSetDefaultOptions = function getOrSetDefaultOptions(opt * @return {Object} everything combined together and encoded */ Contract.prototype._encodeEventABI = function (event, options) { - options = options || {}; - var filter = options.filter || {}, - result = {}; - - ['fromBlock', 'toBlock'].filter(function (f) { - return options[f] !== undefined; - }).forEach(function (f) { - result[f] = formatters.inputBlockNumberFormatter(options[f]); - }); - - // use given topics - if(_.isArray(options.topics)) { - result.topics = options.topics; - - // create topics based on filter - } else { - - result.topics = []; - - // add event signature - if (event && !event.anonymous && event.name !== 'ALLEVENTS') { - result.topics.push(event.signature); - } - - // add event topics (indexed arguments) - if (event.name !== 'ALLEVENTS') { - var indexedTopics = event.inputs.filter(function (i) { - return i.indexed === true; - }).map(function (i) { - var value = filter[i.name]; - if (!value) { - return null; - } - - // TODO: https://github.com/ethereum/web3.js/issues/344 - - if (_.isArray(value)) { - return value.map(function (v) { - return abi.encodeParameter(i.type, v); - }); - } - return abi.encodeParameter(i.type, value); - }); - - result.topics = result.topics.concat(indexedTopics); - } - - if(!result.topics.length) - delete result.topics; - } - - if(this.options.address) { - //result.address = this.options.address.toLowerCase(); - result.address = this.options.address; - } - - return result; + options = options || {}; + var filter = options.filter || {}, + result = {}; + + ['fromBlock', 'toBlock'].filter(function (f) { + return options[f] !== undefined; + }).forEach(function (f) { + result[f] = formatters.inputBlockNumberFormatter(options[f]); + }); + + // use given topics + if(_.isArray(options.topics)) { + result.topics = options.topics; + + // create topics based on filter + } else { + + result.topics = []; + + // add event signature + if (event && !event.anonymous && event.name !== 'ALLEVENTS') { + result.topics.push(event.signature); + } + + // add event topics (indexed arguments) + if (event.name !== 'ALLEVENTS') { + var indexedTopics = event.inputs.filter(function (i) { + return i.indexed === true; + }).map(function (i) { + var value = filter[i.name]; + if (!value) { + return null; + } + + // TODO: https://github.com/ethereum/web3.js/issues/344 + + if (_.isArray(value)) { + return value.map(function (v) { + return abi.encodeParameter(i.type, v); + }); + } + return abi.encodeParameter(i.type, value); + }); + + result.topics = result.topics.concat(indexedTopics); + } + + if(!result.topics.length) + delete result.topics; + } + + if(this.options.address) { + //result.address = this.options.address.toLowerCase(); + result.address = this.options.address; + } + + return result; }; /** @@ -284,56 +237,51 @@ Contract.prototype._encodeEventABI = function (event, options) { * @return {Object} result object with decoded indexed && not indexed params */ Contract.prototype._decodeEventABI = function (currentEvent, data) { - //var event = this; - var event = currentEvent; - - data.data = data.ContractEventInfo || ''; - data.topics = data.ContractEventTopics || []; - delete data.ContractEventInfo; - delete data.ContractEventTopics; - //var result = formatters.outputLogFormatter(data); //keep for later-lc - var result = data; - - // if allEvents get the right event - if(event.name === 'ALLEVENTS') { - event = event.jsonInterface.find(function (intf) { - return (intf.signature === data.topics[0]); - }) || {anonymous: true}; - } - - // create empty inputs if none are present (e.g. anonymous events on allEvents) - event.inputs = event.inputs || []; - - var argTopics = event.anonymous ? data.topics : data.topics.slice(1); - - result.returnValues = abi.decodeLog(event.inputs, data.data, argTopics); - delete result.returnValues.__length__; - if(_.isArray(event.inputs)){ - event.inputs.map(function (input, index) { - if(input.type === "address"){ - result.returnValues[index] = chainsqlUtils.encodeChainsqlAddr(result.returnValues[index].slice(2)); - result.returnValues[input.name] = result.returnValues[index]; - } - }); - } - else{ - //not array,what todo? - } - - // add name - result.event = event.name; - // add signature - result.signature = (event.anonymous || !data.topics[0]) ? null : data.topics[0]; - - // move the data and topics to "raw" - result.raw = { - data: result.data, - topics: result.topics - }; - delete result.data; - delete result.topics; - - return result; + //var event = this; + var event = currentEvent; + + data.data = data.ContractEventInfo || ''; + data.topics = data.ContractEventTopics || []; + delete data.ContractEventInfo; + delete data.ContractEventTopics; + //var result = formatters.outputLogFormatter(data); //keep for later-lc + var result = data; + + // if allEvents get the right event + if(event.name === 'ALLEVENTS') { + event = event.jsonInterface.find(function (intf) { + return (intf.signature === data.topics[0]); + }) || {anonymous: true}; + } + + // create empty inputs if none are present (e.g. anonymous events on allEvents) + event.inputs = event.inputs || []; + + var argTopics = event.anonymous ? data.topics : data.topics.slice(1); + + result.returnValues = abi.decodeLog(event.inputs, data.data, argTopics); + delete result.returnValues.__length__; + if(_.isArray(event.inputs)){ + 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; }; /** @@ -345,45 +293,100 @@ Contract.prototype._decodeEventABI = function (currentEvent, data) { * @param {String} the encoded ABI */ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { - var methodSignature = this._method.signature, - args = this.arguments || []; + var methodSignature = this._method.signature, + args = this.arguments || []; - var signature = false, - paramsABI = this._parent.options.jsonInterface.filter(function (json) { - return ((methodSignature === 'constructor' && json.type === methodSignature) || + var signature = false, + paramsABI = this._parent.options.jsonInterface.filter(function (json) { + return ((methodSignature === 'constructor' && json.type === methodSignature) || ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); - }).map(function (json) { - var inputLength = (_.isArray(json.inputs)) ? json.inputs.length : 0; - - 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) { return input.type; }) : []; - }).map(function (types) { - let newArgs = decodeChainsqlAddrParam(types, args); - return abi.encodeParameters(types, newArgs).replace('0x',''); - })[0] || ''; - - // return constructor - if(methodSignature === 'constructor') { - if(!this._deployData) - throw chainsqlError('The contract does not set contract data. This is necessary to append the constructor parameters.'); - - return this._deployData + paramsABI; - // return method - } else { - var returnValue = (signature) ? signature + paramsABI : paramsABI; - - if(!returnValue) { - throw chainsqlError('Couldn\'t find a matching contract method named "'+ this._method.name +'".'); - } else { - return returnValue; - } - } + }).map(function (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; }; /** @@ -395,21 +398,21 @@ Contract.prototype._encodeMethodABI = function _encodeMethodABI() { * @return {Object} decoded output return values */ Contract.prototype._decodeMethodReturn = function (outputs, returnValues) { - if (!returnValues) { - return null; - } - - returnValues = returnValues.length >= 2 ? returnValues.slice(2) : returnValues; - var result = abi.decodeParameters(outputs, returnValues); - let newOutputs = _.isArray(outputs) ? outputs.map(function (output) { return output.type; }) : []; - encodeChainsqlAddrParam(newOutputs, result); - - if (result.__length__ === 1) { - return result[0]; - } else { - delete result.__length__; - return result; - } + if (!returnValues) { + return null; + } + + returnValues = returnValues.length >= 2 ? returnValues.slice(2) : returnValues; + var result = abi.decodeParameters(outputs, returnValues); + let newOutputs = _.isArray(outputs) ? outputs : []; + encodeChainsqlAddrParam(newOutputs, result); + + if (result.__length__ === 1) { + return result[0]; + } else { + delete result.__length__; + return result; + } }; /** @@ -423,28 +426,28 @@ Contract.prototype._decodeMethodReturn = function (outputs, returnValues) { * @return {Object} EventEmitter possible events are "error", "transactionHash" and "receipt" */ Contract.prototype.deploy = function(options, callback){ - options = options || {}; + options = options || {}; - options.arguments = options.arguments || []; - options = this._getOrSetDefaultOptions(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; + // 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'; + var constructor = _.find(this.options.jsonInterface, function (method) { + return (method.type === 'constructor'); + }) || {}; + constructor.signature = 'constructor'; - return this._createTxObject.apply({ - method: constructor, - parent: this, - deployData: options.data, - }, options.arguments); + return this._createTxObject.apply({ + method: constructor, + parent: this, + deployData: options.data, + }, options.arguments); }; /** @@ -457,29 +460,28 @@ Contract.prototype.deploy = function(options, callback){ * @return {Object} the event subscription */ Contract.prototype._on = function(){ - var subOptions = this._generateEventOptions.apply(this, arguments); - - // prevent the event "newListener" and "removeListener" from being overwritten - this._checkListener('newListener', subOptions.event.name, subOptions.callback); - this._checkListener('removeListener', subOptions.event.name, subOptions.callback); - - // TODO check if listener already exists? and reuse subscription if options are the same. - - let chainSQL = this.chainsql; - if(this.options.isFirstSubscribe){ - //this._decodeEventABI.bind(subOptions.event), - chainSQL.event.subscribeCtrAddr(this).then(subRes => { - //subscribeCtrAddr success - //console.log("subscribeCtrAddr success"); - }).catch(err => { - chainSQL.event.unsubscribeCtrAddr(this); - this.registeredEvent.splice(0, this.registeredEvent.length); - subOptions.callback(null, err); - }); - this.options.isFirstSubscribe = false; - } - this.registeredEvent.push(subOptions.event.signature); - chainSQL.event.registerCtrEvent(subOptions.event.signature, subOptions.callback); + var subOptions = this._generateEventOptions.apply(this, arguments); + + // prevent the event "newListener" and "removeListener" from being overwritten + this._checkListener('newListener', subOptions.event.name, subOptions.callback); + this._checkListener('removeListener', subOptions.event.name, subOptions.callback); + + // TODO check if listener already exists? and reuse subscription if options are the same. + + let chainSQL = this.chainsql; + if(this.options.isFirstSubscribe){ + //this._decodeEventABI.bind(subOptions.event), + chainSQL.event.subscribeCtrAddr(this).then(subRes => { + //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); }; /** @@ -492,38 +494,35 @@ Contract.prototype._on = function(){ * @return {Object} the event options object */ Contract.prototype._generateEventOptions = function() { - var args = Array.prototype.slice.call(arguments); - - // get the callback - var callback = this._getCallback(args); - - // get the options - var options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; - - var event = (_.isString(args[0])) ? args[0] : 'allevents'; - event = (event.toLowerCase() === 'allevents') ? { - name: 'ALLEVENTS', - jsonInterface: this.options.jsonInterface - } : this.options.jsonInterface.find(function (json) { - return (json.type === 'event' && (json.name === event || json.signature === '0x'+ event.replace('0x',''))); - }); - - if (!event) { - throw chainsqlError('Event "' + event.name + '" doesn\'t exist in this contract.'); - } - - // if (!utils.isAddress(this.options.address)) { - // throw new Error('This contract object doesn\'t have address set yet, please set an address first.'); - // } - if (!this.options.address) { - throw chainsqlError('This contract object doesn\'t have address set yet, please set an address first.'); - } - - return { - params: this._encodeEventABI(event, options), - event: event, - callback: callback - }; + var args = Array.prototype.slice.call(arguments); + + // get the callback + var callback = this._getCallback(args); + + // get the options + var options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; + + var event = (_.isString(args[0])) ? args[0] : 'allevents'; + event = (event.toLowerCase() === 'allevents') ? { + name: 'ALLEVENTS', + jsonInterface: this.options.jsonInterface + } : this.options.jsonInterface.find(function (json) { + return (json.type === 'event' && (json.name === event || json.signature === '0x'+ event.replace('0x',''))); + }); + + if (!event) { + throw chainsqlError('Event "' + event.name + '" doesn\'t exist in this contract.'); + } + + if (!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 + }; }; /** @@ -535,11 +534,48 @@ Contract.prototype._generateEventOptions = function() { * @return {Object} the contract instance */ Contract.prototype._checkListener = function(type, event){ - if(event === type) { - throw chainsqlError('The event "'+ type +'" is a reserved event name, you can\'t use it.'); - } + if(event === type) { + throw chainsqlError('The event "'+ type +'" is a reserved event name, you can\'t use it.'); + } }; +Contract.prototype.getPastEvent = function(options, callback) { + 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 * @@ -547,40 +583,37 @@ Contract.prototype._checkListener = function(type, event){ * @returns {Object} an object with functions to call the methods */ Contract.prototype._createTxObject = function _createTxObject(){ - var args = Array.prototype.slice.call(arguments); - var txObject = {}; - - if(this.method.type === 'function') { - txObject.call = this.parent._executeMethod.bind(txObject, 'call'); - txObject.call.request = this.parent._executeMethod.bind(txObject, 'call', true); // to make batch requests - txObject.auto = this.parent._executeMethod.bind(txObject, 'auto'); - } - - // txObject.send = this.parent._executeMethod.bind(txObject, 'send'); - // txObject.send.request = this.parent._executeMethod.bind(txObject, 'send', true); // to make batch requests - txObject.submit = this.parent._executeMethod.bind(txObject, 'submit'); - txObject.submit.request = this.parent._executeMethod.bind(txObject, 'submit', true); // to make batch requests - txObject.encodeABI = this.parent._encodeMethodABI.bind(txObject); - txObject.estimateGas = this.parent._executeMethod.bind(txObject, 'estimate'); - - if (args && this.method.inputs && args.length !== this.method.inputs.length) { - if (this.nextMethod) { - return this.nextMethod.apply(null, args); - } - //throw errors.InvalidNumberOfParams(args.length, this.method.inputs.length, this.method.name); - throw chainsqlError("Invalid Method Params!"); - } - - txObject.arguments = args || []; - txObject._method = this.method; - txObject._parent = this.parent; - //txObject._ethAccounts = this.parent.constructor._ethAccounts || this._ethAccounts; - - if(this.deployData) { - txObject._deployData = this.deployData; - } - - return txObject; + var args = Array.prototype.slice.call(arguments); + var txObject = {}; + + if(this.method.type === 'function') { + txObject.call = this.parent._executeMethod.bind(txObject, 'call'); + txObject.call.request = this.parent._executeMethod.bind(txObject, 'call', true); // to make batch requests + txObject.auto = this.parent._executeMethod.bind(txObject, 'auto'); + } + + txObject.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; }; /** @@ -591,384 +624,438 @@ Contract.prototype._createTxObject = function _createTxObject(){ * @param {Boolean} makeRequest if true, it simply returns the request parameters, rather than executing it */ Contract.prototype._executeMethod = function _executeMethod(){ - var _this = this; - let argsOrigin = Array.prototype.slice.call(arguments); - let callback = this._parent._getCallback(argsOrigin); - try { - var args = this._parent._processExecuteArguments.call(this, argsOrigin/*, defer*/); - } catch (error) { - return errFuncGlobal(error, callback); - } - args.callback = callback; - //defer = promiEvent((args.type !== 'send')), - //ethAccounts = _this.constructor._ethAccounts || _this._ethAccounts; - - // simple return request for batch requests - if(args.generateRequest) { - var payload = { - params: [formatters.inputCallFormatter.call(this._parent, args.options)], - callback: args.callback - }; - - if(args.type === 'call') { - payload.params.push(formatters.inputDefaultBlockNumberFormatter.call(this._parent, args.defaultBlock)); - payload.method = 'eth_call'; - payload.format = this._parent._decodeMethodReturn.bind(null, this._method.outputs); - } else { - payload.method = 'eth_sendTransaction'; - } - - return payload; - } else { - let errorMsg = ""; - switch (args.type) { - // case 'estimate': - // var estimateGas = (new Method({ - // name: 'estimateGas', - // call: 'eth_estimateGas', - // params: 1, - // inputFormatter: [formatters.inputCallFormatter], - // outputFormatter: utils.hexToNumber, - // requestManager: _this._parent._requestManager, - // accounts: ethAccounts, // is eth.accounts (necessary for wallet signing) - // defaultAccount: _this._parent.defaultAccount, - // defaultBlock: _this._parent.defaultBlock - // })).createFunction(); - - // return estimateGas(args.options, args.callback); - case 'auto': - if(this._method.constant === true){ - //call - this.call.apply(this, Array.prototype.slice.call(arguments)); - } - else{ - //submit - this.submit.apply(this, Array.prototype.slice.call(arguments)); - } - break; - - case 'call': - if ((typeof args.callback) != 'function') { - let this_ = this; - return new Promise(function (resolve, reject) { - handleContractCall(this_, args.options, args.callback, resolve, reject); - }); - } else { - handleContractCall(this, args.options, args.callback, null, null); - } - break; - // TODO check errors: missing "from" should give error on deploy and send, call ? - case 'submit':{ - let contractData = args.options.data.length >= 2 ? args.options.data.slice(2) : args.options.data; - let contractValue = "0"; - if(args.options.hasOwnProperty("ContractValue")){ - contractValue = args.options.ContractValue; - } - let sendTxPayment = { - TransactionType : "Contract", - Account : this._parent.connect.address, - ContractAddress : args.options.to, - Gas : args.options.Gas, - ContractValue : contractValue, - ContractData : contractData.toUpperCase() - }; - - - let txCallbackProperty = {}; - txCallbackProperty.callbackFunc = args.callback; - txCallbackProperty.callbackExpect = "send_success"; - if(args.options.isDeploy) { - sendTxPayment.ContractOpType = 1; - txCallbackProperty.callbackExpect = "validate_success"; - } - else { - sendTxPayment.ContractOpType = 2; - if(args.options.hasOwnProperty("expect")) { - if(chainsqlUtils.checkExpect(args.options)) { - txCallbackProperty.callbackExpect = args.options.expect; - } - else { - errorMsg = "Unknown 'expect' value, please check!"; - return errFuncGlobal(errorMsg, args.callback); - } - } - } - - let contractObj = this._parent; - contractObj.options.isDeploy = args.options.isDeploy; - if ((typeof args.callback) != 'function') { - return new Promise(function (resolve, reject) { - handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, resolve, reject); - }); - } else { - handleContractPayment(contractObj, sendTxPayment, txCallbackProperty, null, null); - } - break; - } - default: - //in fact, if call type is wrong ,it will throw error befor here. - errorMsg = "Error, not defined call type!"; - return errFuncGlobal(errorMsg, args.callback); - } - } + var _this = this; + let argsOrigin = Array.prototype.slice.call(arguments); + let callback = this._parent._getCallback(argsOrigin); + try { + var args = this._parent._processExecuteArguments.call(this, argsOrigin/*, defer*/); + } catch (error) { + return errFuncGlobal(error, callback); + } + args.callback = callback; + + // 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); - } + if ((typeof callback) != 'function') { + return new Promise(function (resolve, reject) { + reject(errMsg); + }); + } else { + callback(errMsg, null); + } } function handleContractCall(curFunObj, callObj, callBack, resolve, reject) { - var isFunction = false; - if ((typeof callBack) === 'function') - isFunction = true; - - var callBackFun = function(error, data) { - if (isFunction) { - callBack(error, data); - } else { - if (error) { - reject(error); - } else { - resolve(data); - } - } - }; - const contractObj = curFunObj._parent; - var connect = contractObj.connect; - const contractData = callObj.data.length >= 2 ? callObj.data.slice(2) : callObj.data; - connect.api.connection.request({ - command: 'contract_call', - account : connect.address, - contract_address : callObj.to, - contract_data : contractData.toUpperCase() - }).then(function(data) { - // if (data.status != 'success'){ - // callBackFun(new Error(data), null); - // } - //begin to decode return value,then get result and set to callBack - var resultStr = data.contract_call_result; - var localcallResult = contractObj._decodeMethodReturn(curFunObj._method.outputs, resultStr); - callBackFun(null, localcallResult); - }).catch(function(err) { - callBackFun(err, null); - }); + var isFunction = false; + if ((typeof callBack) === 'function') + isFunction = true; + + var callBackFun = function(error, data) { + if (isFunction) { + callBack(error, data); + } else { + if (error) { + reject(error); + } else { + resolve(data); + } + } + }; + const contractObj = curFunObj._parent; + var connect = contractObj.connect; + const contractData = callObj.data.length >= 2 ? callObj.data.slice(2) : callObj.data; + connect.api.connection.request({ + command: 'contract_call', + account : connect.address, + contract_address : callObj.to, + contract_data : contractData.toUpperCase() + }).then(function(data) { + //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 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); + var instructions = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + const txJSON = createContractPayment(contractPayment); + return chainsqlLibUtils.prepareTransaction(txJSON, chainSQL.api, instructions); } function createContractPayment(contractPayment){ - var newContractPayment = _.cloneDeep(contractPayment); - - var txJSON = { - TransactionType : newContractPayment.TransactionType, - ContractOpType : newContractPayment.ContractOpType, - Account : newContractPayment.Account, - ContractData : newContractPayment.ContractData, - ContractValue : newContractPayment.ContractValue, - Gas : newContractPayment.Gas - }; - if(/*!isDeploy && */newContractPayment.hasOwnProperty("ContractAddress")){ - txJSON.ContractAddress = newContractPayment.ContractAddress; - } - return txJSON; + var newContractPayment = _.cloneDeep(contractPayment); + + var txJSON = { + TransactionType : newContractPayment.TransactionType, + ContractOpType : newContractPayment.ContractOpType, + Account : newContractPayment.Account, + ContractData : newContractPayment.ContractData, + ContractValue : newContractPayment.ContractValue, + Gas : newContractPayment.Gas + }; + if(/*!isDeploy && */newContractPayment.hasOwnProperty("ContractAddress")){ + txJSON.ContractAddress = newContractPayment.ContractAddress; + } + return txJSON; } -function submitContractTx(contractObj, signedVal, callbackProperty, resolve, reject){ - let chainSQL = contractObj.chainsql; - var callBack = callbackProperty.callbackFunc; - var isFunction = false; - if ((typeof callBack) == 'function') - isFunction = true; - - var errFunc = function(error) { - if (isFunction) { - callBack(error, null); - } else { - reject(error); - } - }; - var sucFunc = function(data){ - if(isFunction){ - callBack(null,data); - }else{ - resolve(data); - } - }; - //according to callbackProperty to subscribe event - if(callbackProperty.callbackExpect !== "send_success"){ - chainSQL.event.subscribeTx(signedVal.id, function(err, data) { - if (err) { - errFunc(err); - } else { - // success - // if 'submit()' called without param, default is validate_success - let resultObj = {}; - resultObj.status = data.status; - resultObj.tx_hash = data.transaction.hash; - - if (callbackProperty.callbackExpect === data.status && data.type === 'singleTransaction') { - if(contractObj.options.isDeploy) { - return getNewDeployCtrAddr(chainSQL, data.transaction.hash).then(contractAddr => { - if (contractAddr === "") { - resultObj.contractAddress = "Can not find CreateNode"; - errFunc(resultObj); - } - else { - contractObj.options.address = contractAddr; - resultObj.contractAddress = contractAddr; - } - sucFunc(resultObj); - }).catch(err => { - errFunc(err); - }); - } - else{ - return sucFunc(resultObj); - } - } - // failure - if (chainsqlUtils.checkSubError(data)) { - if (data.hasOwnProperty("error_message")) { - resultObj.error_message = data.error_message; - } - return errFunc(resultObj); - } - } - }).then(function(data) { - // subscribeTx success - }).catch(function(error) { - // subscribeTx failure - errFunc('subscribeTx exception.' + error); - }); - } - - // submit transaction - chainSQL.api.submit(signedVal.signedTransaction).then(function(result) { - //console.log('submit ', JSON.stringify(result)); - if (result.resultCode !== 'tesSUCCESS') { - if(callbackProperty.callbackExpect !== "send_success"){ - unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); - } - //return error message - errFunc(result); - } else { - // submit successfully - if(callbackProperty.callbackExpect === "send_success"){ - sucFunc({ - status: "send_success", - tx_hash: signedVal.id - }); - } - } - }).catch(function(error) { - unsubscribeTx(callbackProperty.callbackExpect, chainSQL, signedVal, errFunc); - errFunc(error); - }); +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); - }); - } + if(expectValue !== "send_success"){ + chainsql.event.unsubscribeTx(signedVal.id).then(function(data) { + // unsubscribeTx success + }).catch(function(error) { + // unsubscribeTx failure + errFunc('unsubscribeTx failure.' + error); + }); + } } function getNewDeployCtrAddr(chainSQL, txHash){ - return new Promise(function(resolve, reject){ - chainSQL.api.getTransaction(txHash).then(txDetail => { - let isMatch = false; - let calCtrAddr = calculateCtrAddr(txDetail.address, txDetail.sequence); - let affectedNodes = txDetail.specification.meta.AffectedNodes; - let suspectCtrAddr = ""; - for (let node of affectedNodes) { - if (node.hasOwnProperty("CreatedNode") && node.CreatedNode.NewFields.hasOwnProperty("ContractCode")) { - let createdNodeObj = node.CreatedNode; - suspectCtrAddr = createdNodeObj.NewFields.Account; - if(calCtrAddr === suspectCtrAddr){ - isMatch = true; - break; - } - } - // else continue; - } - if(isMatch){ - resolve(calCtrAddr); - } - else reject("Can not find Contract Address"); - }).catch(err => { - reject(err); - }); - }); + return new Promise(function(resolve, reject){ + chainSQL.api.getTransaction(txHash).then(txDetail => { + let isMatch = false; + let calCtrAddr = calculateCtrAddr(txDetail.address, txDetail.sequence); + let affectedNodes = txDetail.specification.meta.AffectedNodes; + let suspectCtrAddr = ""; + for (let node of affectedNodes) { + if (node.hasOwnProperty("CreatedNode") && node.CreatedNode.NewFields.hasOwnProperty("ContractCode")) { + let createdNodeObj = node.CreatedNode; + suspectCtrAddr = createdNodeObj.NewFields.Account; + if(calCtrAddr === suspectCtrAddr){ + isMatch = true; + break; + } + } + // else continue; + } + if(isMatch){ + resolve(calCtrAddr); + } + else reject("Can not find Contract Address"); + }).catch(err => { + reject(err); + }); + }); } function calculateCtrAddr(ctrOwnerAddr, sequence){ - let hexAddrStr = chainsqlUtils.decodeChainsqlAddr(ctrOwnerAddr).toUpperCase(); - let hexSeqStr = dec2FixLenHex(sequence, 2*4); - let hexFinalStr = hexAddrStr + hexSeqStr; - return keypairs.deriveAddress(hexFinalStr); + let hexAddrStr = chainsqlUtils.decodeChainsqlAddr(ctrOwnerAddr).toUpperCase(); + let hexSeqStr = dec2FixLenHex(sequence, 2*4); + let hexFinalStr = hexAddrStr + hexSeqStr; + return keypairs.deriveAddress(hexFinalStr); } function dec2FixLenHex(decVal, fixedLen){ - let hexStr = decVal.toString(16); - let paddingLen = fixedLen - hexStr.length; - for(let i = 0; i < paddingLen; i++){ - hexStr = '0' + hexStr; - } - return hexStr; + let hexStr = decVal.toString(16); + let paddingLen = fixedLen - hexStr.length; + for(let i = 0; i < paddingLen; i++){ + hexStr = '0' + hexStr; + } + return hexStr; } function encodeChainsqlAddrParam(types, result){ - types.map(function(item, index) { - if(item === "address"){ - result[index] = chainsqlUtils.encodeChainsqlAddr(result[index].slice(2)); - } - }); + types.map(function(item, index) { + if(item.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(); - } - return item; - }); - return newArgs; + 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; } /** @@ -979,9 +1066,9 @@ function decodeChainsqlAddrParam(types, args){ * @return {Function} the callback */ Contract.prototype._getCallback = function getCallback(args) { - if (args && _.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } + if (args && _.isFunction(args[args.length - 1])) { + return args.pop(); // modify the args array! + } }; /** @@ -992,44 +1079,32 @@ Contract.prototype._getCallback = function getCallback(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() : {}; + var processedArgs = {}; - // get the generateRequest argument for batch requests - processedArgs.generateRequest = (args[args.length - 1] === true)? args.pop() : false; + processedArgs.type = args.shift(); - processedArgs.options = this._parent._getOrSetDefaultOptions(processedArgs.options); - processedArgs.options.data = this.encodeABI(); + // get the options + processedArgs.options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; - // 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.'); + // get the generateRequest argument for batch requests + processedArgs.generateRequest = (args[args.length - 1] === true)? args.pop() : false; - if(!this._deployData) { - processedArgs.options.to = this._parent.options.address; - processedArgs.options.isDeploy = false; - } - else { - processedArgs.options.isDeploy = true; - } + processedArgs.options = this._parent._getOrSetDefaultOptions(processedArgs.options); + processedArgs.options.data = this.encodeABI(); - // 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); + // 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.'); - return processedArgs; + 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 c88dd85..828bb3c 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; +var util = require('./lib/util'); +const RippleAPI = require('chainsql-lib-applet').ChainsqlLibAPI; const Connection = require('./connect'); class Submit { @@ -18,11 +18,9 @@ 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.setCert(); - + self.prepareJson().then(function (preparedJson) { + self.txJSON = preparedJson.txJSON; + self.setCert(); let signedRet = self.signTx(); self.handleSignedTx(self.ChainsqlAPI, signedRet, expectOpt, resolve, reject); }).catch(function (error) { @@ -85,8 +83,6 @@ Submit.prototype.setCert = function () { } - - } }; @@ -123,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); } diff --git a/src/table.js b/src/table.js deleted file mode 100644 index 4cac68c..0000000 --- a/src/table.js +++ /dev/null @@ -1,475 +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 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 = []; - } - - 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, field) { - 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 (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) { - 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; - } - - 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; -} - -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), - } - }], - tsType: 'SQLStatement' - }; - if ( (that.exec == 'r_insert' || that.exec == 'r_update') && that.field) { - payment.autoFillField = convertStringToHex(that.field); - } - - return new Promise(function (resolve, reject) { - 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); - const algType = ChainSQL.connect.secret === "gmAlg" ? "gmAlg" : "aes"; - payment.raw = crypto.symEncrypt(secret, payment.raw, algType).toUpperCase(); - } else { - payment.raw = convertStringToHex(payment.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 39d7780..0000000 --- a/src/tablePayment.js +++ /dev/null @@ -1,114 +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 - } - 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) { - // 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); - - }).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/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; 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/server.js b/test/server.js deleted file mode 100644 index f4b3bbc..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'), '../common'); -var common = require(basePath); -var crypto = require('../lib/crypto'); -const keypairs = require('chainsql-keypairs'); - -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/test.js b/test/test.js deleted file mode 100644 index 42f054c..0000000 --- a/test/test.js +++ /dev/null @@ -1,570 +0,0 @@ -'use strict' - -const fs = require("fs"); -const co = require('co') - -const ChainsqlAPI = require('../src/index'); -// ChainsqlAPI.prototype.callback2Promise = require('./callback2Promise'); -const c = new ChainsqlAPI(); - -const RippleAPI = new require('chainsql-lib').RippleAPI; - -var user = { - secret: "xxeJcpbcFyGTFCxiGjeDEw1RCimFQ", - address: "z44fybVuUn8jZxZRHpc3pJ62KQJgSEjzjk", - publicKey: "cB4MLVsyn5MnoYHhApEyGtPCuEf9PAGDopmpB7yFwTbhUtzrjRRT" -} - - var owner = { - secret: "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", - address: "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh" - } - -var issuer = { - secret: "xxEiFWFxpUARr9tq1XfvkykyR97iK", - address: "znbWk4iuz2HL1e1Ux91TzYfFzJHGeYxBA4" -} - -var sTableName = "fasefa"; -var sTableName2 = "b1"; -var sReName = "boy1234"; -var sTableName3 = "hijack12"; - -main(); - -async function main(){ - try { - await c.connect('ws://127.0.0.1:6005'); - //await c.connect('ws://101.201.40.124:5006'); - console.log('连接成功'); - - c.as(owner); - - // // 读取证书文件 - // var data = fs.readFileSync('D:\\git\\ca\\test\\userCert.cert'); - // c.useCert(data.toString()); - - // 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); - } -} - -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 testChainsql(){ - // await testCreateTable(); - - // // //创建另一张表,用来测试rename,drop - await testCreateTable1(); - // await testInsert(); - // await testUpdate(); - // 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(); -} - -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'} - ] - var option = { - confidential: false - } - // 创建表 - 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':'varchar','length':50,'default':null}, - {'field':'age','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':1,'age': 333,'name':'hello'}, - {'id':2,'age': 444,'name':'sss'}, - {'id':3,'age': 555,'name':'rrr'} - ]; - 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': 2}).update({'age':200}).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:false, update:false, delete:true}; - var rs = await c.grant(sTableName, user.address, raw, user.publicKey).submit({expect:'db_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 testTxs = async function(){ - try { - 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' }); - 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 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); - 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/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 6c80ef7..0000000 --- a/test/testContractTableTxs.js +++ /dev/null @@ -1,385 +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 = user; - -var user1 = { - address: "zhd8rfb9dyoq7b8vMBqSm3dbzJpUNFNtRt", - secret: "xnoHuFw7CcgXD29fv2yi8uGkiqSqm" -} - -var grantAddr = "zzzzzzzzzzzzzzzzzzzzBZbvji"; -var flag = "{\"insert\":true,\"update\":true,\"delete\":true,\"select\":false}"; - -var sTableName = "sTable"; -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":"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 -} - -main(); -async function main() { - let res = await c.connect('ws://127.0.0.1:6005'); - 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/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/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/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 1211925..0000000 --- a/test/testTable.js +++ /dev/null @@ -1,208 +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 grantAddr = "0xzzzzzzzzzzzzzzzzzzzzBZbvji"; - -var sTableName = "chainsqlTest"; -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 -} - -main(); -async function main() { - let res = await c.connect('ws://127.0.0.1:6006'); - console.log("connect successfully.") - c.setRestrict(true); - - - /**************************************/ - let nStep = tagStep.table_insert; - // 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(owner) - try { - let lll = await c.createTable(sTableName, tableRaw).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); -} -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(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(userOperation) - 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(); - }); -}