From 91b28aee6146d30c79255ab46f4ba0fba1e3d06b Mon Sep 17 00:00:00 2001 From: CaiHQ Date: Tue, 4 Jan 2022 13:14:02 +0800 Subject: [PATCH] release 1.4.5 --- source/ContractAPI.rst | 1023 ++++++++++++++--- source/IDEUsage.rst | 4 +- source/InstallTips.rst | 4 +- source/Introduction.rst | 207 +--- source/YJSAPI.rst | 348 +----- .../{_template => _templates}/versions.html | 0 source/conf.py | 28 +- toRst.sh | 2 +- 8 files changed, 961 insertions(+), 655 deletions(-) rename source/{_template => _templates}/versions.html (100%) diff --git a/source/ContractAPI.rst b/source/ContractAPI.rst index 2c26bfa..384e94e 100644 --- a/source/ContractAPI.rst +++ b/source/ContractAPI.rst @@ -1,5 +1,5 @@ -BDContract SDK -============== +BDware SDK +========== 除使用可视化的智能合约在线IDE外,用户还可使用WebSocket接口、Http接口、Bash接口来启动和运行合约. @@ -155,7 +155,7 @@ startContract 启动合约 ContractInstanceManager startContractBatched 废弃 ContractInstanceManager; startContractByYPK 启动合约 ContractInstanceManager; startContractInTempZips 废弃 ContractInstanceManager; -startContractConfig 启动合约(集群模式) ContractInstanceManager; +startContractP2PTrustfully 启动合约(集群模式) ContractInstanceManager; updateContract ContractInstanceManager; connectTo 连接合约实例输出流 ContractInstanceManager;ContractUser; countContractLogGroupByAction ContractInstanceManager;ContractUser; @@ -1977,6 +1977,699 @@ action printTransferLog 模板生成类 ~~~~~~~~~~ +账本Http接口 +------------ + +.. code:: yaml + + type: google.api.Service + config_version: 3 + + http: + rules: + - selector: bdware.bdledger.api.Node.ClientVersion + get: /v0/node/version + - selector: bdware.bdledger.api.Ledger.CreateLedger + post: /v0/ledgers + body: "*" + - selector: bdware.bdledger.api.Ledger.GetLedgers + get: /v0/ledgers + - selector: bdware.bdledger.api.Ledger.SendTransaction + post: /v0/ledgers/{ledger}/transactions + body: "*" + - selector: bdware.bdledger.api.Query.GetBlockByHash + get: /v0/ledgers/{ledger}/block + - selector: bdware.bdledger.api.Query.GetBlocks + post: /v0/ledgers/{ledger}/blocks/query + body: "*" + - selector: bdware.bdledger.api.Query.CountBlocks + post: /v0/ledgers/{ledger}/blocks/count + body: "*" + - selector: bdware.bdledger.api.Query.GetRecentBlocks + get: /v0/ledgers/{ledger}/blocks/recent + - selector: bdware.bdledger.api.Query.GetTransactionByHash + get: /v0/ledgers/{ledger}/transaction + - selector: bdware.bdledger.api.Query.GetTransactionByBlockHashAndIndex + get: /v0/ledgers/{ledger}/block/transaction + - selector: bdware.bdledger.api.Query.GetTransactions + post: /v0/ledgers/{ledger}/transactions/query + body: "*" + - selector: bdware.bdledger.api.Query.CountTransactions + post: /v0/ledgers/{ledger}/transactions/count + body: "*" + +.. + + **Note** + + Request/Response data of **bytes** type should/will be encoded with + `Base64 `__. + + **Note** + + When using hash strings in URL, they need to be encoded with + `encodeURIComponent `__. + +账本信息类 +~~~~~~~~~~ + +Node.ClientVersion {#_node_clientversion} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get BDLedger node version + +:: + + GET http://{{IP}}:{{PORT}}/v0/node/version + +返回示例 +'''''''' + +.. code:: json + + { + "version": "dev-210119.a88bf4eb" + } + +Ledger.CreateLedger {#_ledger_createledger} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create a new ledger + +:: + + POST http://{{IP}}:{{PORT}}/v0/ledgers + +.. _请求示例-33: + +请求示例 +'''''''' + +.. code:: json + + { + "name": "test" + } + +.. _返回示例-1: + +返回示例 +'''''''' + +.. code:: json + + { + "ok": true + } + +Ledger.GetLedgers {#_ledger_getledgers} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get all ledgers + +:: + + GET http://{{IP}}:{{PORT}}/v0/ledgers + +.. _返回示例-2: + +返回示例 +'''''''' + +.. code:: json + + { + "ledgers": [ + "default", + "test" + ] + } + +Ledger.SendTransaction {#_ledger_sendtransaction} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Send a new transaction + +:: + + POST http://{{IP}}:{{PORT}}/v0/ledgers/test/transactions + +.. _请求示例-34: + +请求示例 +'''''''' + +.. code:: json + + { + "transaction": { + "type": 0, + "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", + "nonce": 52, + "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" + } + } + +.. _返回示例-3: + +返回示例 +'''''''' + +.. code:: json + + { + "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=" + } + +查询类 +~~~~~~ + +Query.GetBlockByHash {#_query_getblockbyhash} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get a block identified by its hash + +:: + + GET http://{{IP}}:{{PORT}}/v0/ledgers/test/block?hash=LSKr%2BK079Ax%2BrKdlyYN5ze2YGzo%3D + +**hash** has to be encoded with +`encodeURIComponent `__ + +.. _返回示例-4: + +返回示例 +'''''''' + +.. code:: json + + { + "block": { + "hash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "creator": "", + "nonce": "0", + "parentHashes": [ + "fLX5pMY8M1qSAGZdKT1rWBkdEMo=", + "rk0DWMaUpRG82yVX+cFhbfhPFdw=", + "3XkwkuMBearq8uavN76Te7Zdpl8=" + ], + "witnesses": [], + "timestamp": "1611038043", + "size": "0", + "transactionCount": 1, + "transactionsRoot": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "transactions": [ + { + "blockHash": "", + "blockTimestamp": "0", + "index": 0, + "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "type": "RECORD", + "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", + "nonce": "0", + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" + } + ], + "transactionHashes": [ + "VQBeA5Ee0Y5hqEileoQuYMHbOSE=" + ] + } + } + +Query.GetBlocks {#_query_getblocks} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get blocks in a timestamp range + +:: + + POST http://{{IP}}:{{PORT}}/v0/ledgers/test/blocks/query + +.. code:: protobuf + + enum IncludeTransactions { + NONE = 0; // Don't include transaction data + HASH = 1; // Include transactions hashes + FULL = 2; // Include full transactions + } + +Requirement: asciimath:["start_timestamp"⇐"end_timestamp"] + +If only **end_timestamp** is not specified, or +asciimath:["end_timestamp"-"start_timestamp">"query.maxDuration"], then +**end_timestamp** will be set to +asciimath:["start_timestamp"+"query.maxDuration"]. + +If only **start_timestamp** is not specified, then **start_timestamp** +will be set to asciimath:["end_timestamp"-"query.maxDuration"]. + +In all cases, **start_timestamp** will never be earlier than the genesis +block’s timestamp, and **end_timestamp** will never be later than the +current timestamp when the node process the query request. + +.. _请求示例-35: + +请求示例 +'''''''' + +.. code:: json + + { + "start_timestamp": 1611038000, + "end_timestamp": 1611039000, + "include_transactions": 0 + } + +.. _返回示例-5: + +返回示例 +'''''''' + +.. code:: json + + { + "blocks": [ + { + "hash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "creator": "", + "nonce": "0", + "parentHashes": [ + "fLX5pMY8M1qSAGZdKT1rWBkdEMo=", + "rk0DWMaUpRG82yVX+cFhbfhPFdw=", + "3XkwkuMBearq8uavN76Te7Zdpl8=" + ], + "witnesses": [], + "timestamp": "1611038043", + "size": "0", + "transactionCount": 1, + "transactionsRoot": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "transactions": [], + "transactionHashes": [] + } + ], + "startTimestamp": "1611038043", + "endTimestamp": "1611038043" + } + +请求示例2 +''''''''' + +.. code:: json + + { + "start_timestamp": 1611038000, + "end_timestamp": 1611039000, + "include_transactions": 1 + } + +返回示例2 +''''''''' + +.. code:: json + + { + "blocks": [ + { + "hash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "creator": "", + "nonce": "0", + "parentHashes": [ + "fLX5pMY8M1qSAGZdKT1rWBkdEMo=", + "rk0DWMaUpRG82yVX+cFhbfhPFdw=", + "3XkwkuMBearq8uavN76Te7Zdpl8=" + ], + "witnesses": [], + "timestamp": "1611038043", + "size": "0", + "transactionCount": 1, + "transactionsRoot": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "transactions": [], + "transactionHashes": [ + "VQBeA5Ee0Y5hqEileoQuYMHbOSE=" + ] + } + ], + "startTimestamp": "1611038043", + "endTimestamp": "1611038043" + } + +**Request body 3.** + +.. code:: json + + { + "start_timestamp": 1611038000, + "end_timestamp": 1611039000, + "include_transactions": 2 + } + +**Response 3.** + +.. code:: json + + { + "blocks": [ + { + "hash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "creator": "", + "nonce": "0", + "parentHashes": [ + "fLX5pMY8M1qSAGZdKT1rWBkdEMo=", + "rk0DWMaUpRG82yVX+cFhbfhPFdw=", + "3XkwkuMBearq8uavN76Te7Zdpl8=" + ], + "witnesses": [], + "timestamp": "1611038043", + "size": "0", + "transactionCount": 1, + "transactionsRoot": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "transactions": [ + { + "blockHash": "", + "blockTimestamp": "0", + "index": 0, + "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "type": "RECORD", + "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", + "nonce": "0", + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" + } + ], + "transactionHashes": [ + "VQBeA5Ee0Y5hqEileoQuYMHbOSE=" + ] + } + ], + "startTimestamp": "1611038043", + "endTimestamp": "1611038043" + } + +Query.CountBlocks {#_query_countblocks} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Count all blocks in a ledger, or blocks in a timestamp range + +:: + + POST http://{{IP}}:{{PORT}}/v0/ledgers/test/blocks/count + +Requirement: asciimath:["start_timestamp"⇐"end_timestamp"] + +If neither **start_timestamp** nor **end_timestamp** is specified, then +count all blocks in the specified ledger. + +If only **end_timestamp** is not specified, then count all blocks with +timestamps later than **start_timestamp**. + +If only **start_timestamp** is not specified, then count all blocks with +timestamps earlier than **end_timestamp**. + +In all cases, **start_timestamp** will never be earlier than the genesis +block’s timestamp, and **end_timestamp** will never be later than the +current timestamp when the node process the query request. + +.. _请求示例-36: + +请求示例 +'''''''' + +.. code:: json + + {} + +.. _返回示例-6: + +返回示例 +'''''''' + +.. code:: json + + { + "count": "5", + "startTimestamp": "0", + "endTimestamp": "1611039957" + } + +.. _请求示例2-1: + +请求示例2 +''''''''' + +.. code:: json + + { + "start_timestamp": 1611038000, + "end_timestamp": 1611039000 + } + +.. _返回示例2-1: + +返回示例2 +''''''''' + +.. code:: json + + { + "count": "1", + "startTimestamp": "1611038000", + "endTimestamp": "1611039000" + } + +Query.GetRecentBlocks {#_query_getrecentblocks} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get recent **count** blocks (Only support IncludeTransactions=NONE for +now) + +:: + + GET http://{{IP}}:{{PORT}}/v0/ledgers/test/blocks/recent?count=2 + +.. _返回示例-7: + +返回示例 +'''''''' + +.. code:: json + + { + "blocks": [ + { + "hash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "creator": "", + "nonce": "0", + "parentHashes": [ + "fLX5pMY8M1qSAGZdKT1rWBkdEMo=", + "rk0DWMaUpRG82yVX+cFhbfhPFdw=", + "3XkwkuMBearq8uavN76Te7Zdpl8=" + ], + "witnesses": [], + "timestamp": "1611038043", + "size": "0", + "transactionCount": 1, + "transactionsRoot": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "transactions": [], + "transactionHashes": [] + }, + { + "hash": "rk0DWMaUpRG82yVX+cFhbfhPFdw=", + "creator": "", + "nonce": "0", + "parentHashes": [ + "fLX5pMY8M1qSAGZdKT1rWBkdEMo=", + "3XkwkuMBearq8uavN76Te7Zdpl8=", + "8pZPR74OALIbps5XFb4dL/s0j0M=" + ], + "witnesses": [], + "timestamp": "1610968019", + "size": "0", + "transactionCount": 1, + "transactionsRoot": "LuxttCm/pSHVMOKF0sJExk+DJXc=", + "transactions": [], + "transactionHashes": [] + } + ], + "startTimestamp": "1610968019", + "endTimestamp": "1611038043" + } + +Query.GetTransactionByHash {#_query_gettransactionbyhash} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get a transaction identified by its hash + +:: + + GET http://{{IP}}:{{PORT}}/v0/ledgers/test/transaction?hash=VQBeA5Ee0Y5hqEileoQuYMHbOSE%3D + +**hash** has to be encoded with +`encodeURIComponent `__ + +.. _返回示例-8: + +返回示例 +^^^^^^^^ + +.. code:: json + + { + "transaction": { + "blockHash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "blockTimestamp": "1611038043", + "index": 0, + "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "type": "RECORD", + "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", + "nonce": "0", + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" + } + } + +Query.GetTransactionByBlockHashAndIndex {#_query_gettransactionbyblockhashandindex} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get a transaction identified by hash of the block it belongs to and its +index inside the block + +:: + + GET http://{{IP}}:{{PORT}}/v0/ledgers/test/block/transaction?blockHash=LSKr%2BK079Ax%2BrKdlyYN5ze2YGzo%3D&index=0 + +**blockHash** has to be encoded with +`encodeURIComponent `__ + +.. _返回示例-9: + +返回示例 +^^^^^^^^ + +.. code:: json + + { + "transaction": { + "blockHash": "LSKr+K079Ax+rKdlyYN5ze2YGzo=", + "blockTimestamp": "1611038043", + "index": 0, + "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "type": "RECORD", + "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", + "nonce": "0", + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" + } + } + +Query.GetTransactions {#_query_gettransactions} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Get transactions in a timestamp range + +:: + + POST http://{{IP}}:{{PORT}}/v0/ledgers/test/transactions/query + +**start_timestamp** and **end_timestamp** follow the same requirements +and rules as in `??? <#Query.GetBlocks>`__. + +.. _请求示例-37: + +请求示例 +'''''''' + +.. code:: json + + { + "start_timestamp": 1611038000, + "end_timestamp": 1611039000 + } + +.. _返回示例-10: + +返回示例 +'''''''' + +.. code:: json + + { + "transactions": [ + { + "blockHash": "", + "blockTimestamp": "0", + "index": 0, + "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=", + "type": "RECORD", + "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", + "nonce": "0", + "to": "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" + } + ], + "startTimestamp": "1611038043", + "endTimestamp": "1611038043" + } + +Query.CountTransactions {#_query_counttransactions} +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Count all transactions in a ledger, or transactions in a timestamp range + +:: + + POST http://{{IP}}:{{PORT}}/v0/ledgers/test/transactions/count + +**start_timestamp** and **end_timestamp** follow the same requirements +and rules as in `??? <#Query.CountBlocks>`__. + +.. _请求示例-38: + +请求示例 +'''''''' + +.. code:: json + + {} + +.. _返回示例-11: + +返回示例 +'''''''' + +.. code:: json + + { + "count": "4", + "startTimestamp": "0", + "endTimestamp": "1611039957" + } + +.. _请求示例2-2: + +请求示例2 +''''''''' + +.. code:: json + + { + "start_timestamp": 1611038000, + "end_timestamp": 1611039000 + } + +.. _返回示例2-2: + +返回示例2 +''''''''' + +.. code:: json + + { + "count": "1", + "startTimestamp": "1611038000", + "endTimestamp": "1611039000" + } + -------------- 合约节点WebSocket接口 @@ -2003,7 +2696,7 @@ action printTransferLog action getSessionID ====== ============ -.. _请求示例-33: +.. _请求示例-39: 请求示例 '''''''' @@ -2042,7 +2735,7 @@ action getSessionID action login ====== ===== -.. _请求示例-34: +.. _请求示例-40: 请求示例 '''''''' @@ -2085,7 +2778,7 @@ action applyNodeRole role 申请角色名称 ====== ============= -.. _请求示例-35: +.. _请求示例-41: 请求示例 '''''''' @@ -2130,7 +2823,7 @@ isAccept bool类型,表示否授权 pubKey 授权用户公钥 ======== ==================== -.. _请求示例-36: +.. _请求示例-42: 请求示例 '''''''' @@ -2170,7 +2863,7 @@ action deleteRole role 删除角色名称 ====== ============ -.. _请求示例-37: +.. _请求示例-43: 请求示例 '''''''' @@ -2211,7 +2904,7 @@ role 删除角色名称 action listAllAuthRole ====== =============== -.. _请求示例-38: +.. _请求示例-44: 请求示例 '''''''' @@ -2255,7 +2948,7 @@ action listAllAuthRole action listUnAuthRole ====== ============== -.. _请求示例-39: +.. _请求示例-45: 请求示例 '''''''' @@ -2294,7 +2987,7 @@ action listUnAuthRole action queryUserStat ====== ============= -.. _请求示例-40: +.. _请求示例-46: 请求示例 '''''''' @@ -2337,7 +3030,7 @@ action queryUserStat action listProjects ====== ============ -.. _请求示例-41: +.. _请求示例-47: 请求示例 '''''''' @@ -2378,7 +3071,7 @@ pubKey 该用户的公钥 isPrivate true ========= ============ -.. _请求示例-42: +.. _请求示例-48: 请求示例 '''''''' @@ -2419,7 +3112,7 @@ isPrivate true action listContractProcess ====== =================== -.. _请求示例-43: +.. _请求示例-49: 请求示例 '''''''' @@ -2463,7 +3156,7 @@ script 脚本内容 signature 签名 ========= ============= -.. _请求示例-44: +.. _请求示例-50: 请求示例 '''''''' @@ -2492,10 +3185,62 @@ signature 签名 "responseID":"1617206735696" } +启动可信集群合约 +^^^^^^^^^^^^^^^^ + +.. _参数-44: + +参数 +'''' + +========= ==================================== +字段 值 +========= ==================================== +action startContractP2PTrustfully +owner pubkey +isPrivate 当前时间 +path 脚本所在路径 +signature 签名 +peersID 可信执行集群中的节点peerID组成的数组 +\ +========= ==================================== + +.. _请求示例-51: + +请求示例 +'''''''' + +.. code:: javascript + + var request = {}; + request.action = "startContractP2PTrustfully"; + request.peersID = ["3r729hf2ehf982","sjdfiwoehfwoi34","wnfnwoeifnwenef"]; + var project = "JsonTest"; + request.path = "/" + project + "/mainfest.json"; + request.isPrivate = false; + request.signature = sm2.doSignature("Trusted|" + request.path + "|" + + global.sm2Key.publicKey, global.sm2Key.privateKey); //合约的签名 + request.resultcheck = $("#resultcheck")[0].value; + wssocket.send(JSON.stringify(request)); + +.. _返回结果-23: + +返回结果 +'''''''' + +.. code:: json + + { + "data":"{\"status\":\"Success\",\"result\":\"\"}", + "action":"onStartContractP2PTrustfully", + "cid":"-1543583350", + "executeTime":1544 + } + 分发合约项目 ^^^^^^^^^^^^ -.. _参数-44: +.. _参数-45: 参数 '''' @@ -2511,7 +3256,7 @@ sponsorPeerID 发起者ID signature 签名 ============= ================== -.. _请求示例-45: +.. _请求示例-52: 请求示例 '''''''' @@ -2526,7 +3271,7 @@ signature 签名 request.signature = sm2.doSignature("DistributeContract|" + request.projectName + "|" + global.sm2Key.publicKey, global.sm2Key.privateKey); wssocket.send(JSON.stringify(request)); -.. _返回结果-23: +.. _返回结果-24: 返回结果 '''''''' @@ -2541,7 +3286,7 @@ signature 签名 终止合约 ^^^^^^^^ -.. _参数-45: +.. _参数-46: 参数 '''' @@ -2554,7 +3299,7 @@ id 合约id requestID 请求ID ========= =================== -.. _请求示例-46: +.. _请求示例-53: 请求示例 '''''''' @@ -2566,7 +3311,7 @@ requestID 请求ID request.requestID = new Date().getTime() + ""; wssocket.send(JSON.stringify(request)); -.. _返回结果-24: +.. _返回结果-25: 返回结果 '''''''' @@ -2581,7 +3326,7 @@ requestID 请求ID 终止所有合约 ^^^^^^^^^^^^ -.. _参数-46: +.. _参数-47: 参数 '''' @@ -2592,7 +3337,7 @@ requestID 请求ID action killAllContract ====== =============== -.. _请求示例-47: +.. _请求示例-54: 请求示例 '''''''' @@ -2602,7 +3347,7 @@ action killAllContract request.action = "killAllContract"; wssocket.send(JSON.stringify(request)); -.. _返回结果-25: +.. _返回结果-26: 返回结果 '''''''' @@ -2620,7 +3365,7 @@ action killAllContract 静态分析合约 ^^^^^^^^^^^^ -.. _参数-47: +.. _参数-48: 参数 '''' @@ -2636,7 +3381,7 @@ script 脚本内容 path 合约文件名 ========== ==================== -.. _请求示例-48: +.. _请求示例-55: 请求示例 '''''''' @@ -2651,7 +3396,7 @@ path 合约文件名 request.path = global.projectName; wssocket.send(JSON.stringify(request)); -.. _返回结果-26: +.. _返回结果-27: 返回结果 '''''''' @@ -2669,7 +3414,7 @@ path 合约文件名 删除合约 ^^^^^^^^ -.. _参数-48: +.. _参数-49: 参数 '''' @@ -2681,7 +3426,7 @@ action deleteFile file fileName ====== ========== -.. _请求示例-49: +.. _请求示例-56: 请求示例 '''''''' @@ -2692,7 +3437,7 @@ file fileName request.file = fileName; wssocket.send(JSON.stringify(request)); -.. _返回结果-27: +.. _返回结果-28: 返回结果 '''''''' @@ -2708,7 +3453,7 @@ file fileName 私有合约传至公共目录 ^^^^^^^^^^^^^^^^^^^^ -.. _参数-49: +.. _参数-50: 参数 '''' @@ -2721,7 +3466,7 @@ pubkey 用户公钥 fileName fileName ======== ============ -.. _请求示例-50: +.. _请求示例-57: 请求示例 '''''''' @@ -2733,7 +3478,7 @@ fileName fileName request.fileName = fileName; wssocket.send(JSON.stringify(request)); -.. _返回结果-28: +.. _返回结果-29: 返回结果 '''''''' @@ -2749,7 +3494,7 @@ fileName fileName 上传合约 ^^^^^^^^ -.. _参数-50: +.. _参数-51: 参数 '''' @@ -2765,7 +3510,7 @@ isPrivate true/false content fileContent(base64编码) ========= ======================== -.. _请求示例-51: +.. _请求示例-58: 请求示例 '''''''' @@ -2780,7 +3525,7 @@ content fileContent(base64编码) request.content = text; wssocket.send(JSON.stringify(request)); -.. _返回结果-29: +.. _返回结果-30: 返回结果 '''''''' @@ -2796,7 +3541,7 @@ content fileContent(base64编码) 编译合约 ^^^^^^^^ -.. _参数-51: +.. _参数-52: 参数 '''' @@ -2809,7 +3554,7 @@ path string, 待编译的项目名称 privateTab bool, 是否为私有目录的项目 ========== ========================== -.. _请求示例-52: +.. _请求示例-59: 请求示例 '''''''' @@ -2818,7 +3563,7 @@ privateTab bool, 是否为私有目录的项目 var req = {"action":"compile","path":"Hello","privateTab":true} -.. _返回结果-30: +.. _返回结果-31: 返回结果 '''''''' @@ -2832,7 +3577,7 @@ privateTab bool, 是否为私有目录的项目 锁定某个用户的的私有目录编辑功能 -.. _参数-52: +.. _参数-53: 参数 '''' @@ -2844,7 +3589,7 @@ action lockEdit pubKey string, 要被锁定的公钥 ====== ====================== -.. _请求示例-53: +.. _请求示例-60: 请求示例 '''''''' @@ -2869,7 +3614,7 @@ pubKey string, 要被锁定的公钥 解锁某个用户的的私有目录编辑功能 -.. _参数-53: +.. _参数-54: 参数 '''' @@ -2881,7 +3626,7 @@ action unLockEdit pubKey string, 要被锁定的公钥 ====== ====================== -.. _请求示例-54: +.. _请求示例-61: 请求示例 '''''''' @@ -2913,7 +3658,7 @@ pubKey string, 要被锁定的公钥 向服务器发送请求, 查询服务器上已经启动的所有合约进程. -.. _参数-54: +.. _参数-55: 参数 '''' @@ -2924,7 +3669,7 @@ pubKey string, 要被锁定的公钥 action listContractProcess ====== =================== -.. _请求示例-55: +.. _请求示例-62: 请求示例 '''''''' @@ -2955,7 +3700,7 @@ action listContractProcess 向服务器发送请求, 调用某个合约. -.. _参数-55: +.. _参数-56: 参数 '''' @@ -2979,7 +3724,7 @@ signature 调用者签名 ,可选 //sm2 可从sm2.js中加载获得。 signature = sm2.doSignature(contractID+"|"+operation+"|"+arg+"|"+pubkey,privateKey); -.. _请求示例-56: +.. _请求示例-63: 请求示例 '''''''' @@ -3021,7 +3766,7 @@ signature 调用者签名 ,可选 向服务器发送请求, 获取节点服务器上合约的TimeTravel日志. -.. _参数-56: +.. _参数-57: 参数 '''' @@ -3032,7 +3777,7 @@ signature 调用者签名 ,可选 action printTimeTravelLog ====== ================== -.. _请求示例-57: +.. _请求示例-64: 请求示例 '''''''' @@ -3060,7 +3805,7 @@ action printTimeTravelLog 向服务器发送请求, 获取节点服务器的状态转移日志. -.. _参数-57: +.. _参数-58: 参数 '''' @@ -3071,7 +3816,7 @@ action printTimeTravelLog action printTransferLog ====== ================ -.. _请求示例-58: +.. _请求示例-65: 请求示例 '''''''' @@ -3099,7 +3844,7 @@ action printTransferLog 向服务器发送请求, 获取节点服务器的状态转移日志. -.. _参数-58: +.. _参数-59: 参数 '''' @@ -3112,7 +3857,7 @@ contractName 合约名称 memoryFile 合约文件名称 ============ ============ -.. _请求示例-59: +.. _请求示例-66: 请求示例 '''''''' @@ -3147,7 +3892,7 @@ memoryFile 合约文件名称 查看本地近n日节点日志(删除) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. _参数-59: +.. _参数-60: 参数 '''' @@ -3159,7 +3904,7 @@ action listLocalNodeLog date 当前时间 ====== ================ -.. _请求示例-60: +.. _请求示例-67: 请求示例 '''''''' @@ -3170,7 +3915,7 @@ date 当前时间 request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); -.. _返回结果-31: +.. _返回结果-32: 返回结果 '''''''' @@ -3184,7 +3929,7 @@ date 当前时间 查看本地近n日合约日志(删除) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. _参数-60: +.. _参数-61: 参数 '''' @@ -3196,7 +3941,7 @@ action listLocalContractLog date 当前时间 ====== ==================== -.. _请求示例-61: +.. _请求示例-68: 请求示例 '''''''' @@ -3207,7 +3952,7 @@ date 当前时间 request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); -.. _返回结果-32: +.. _返回结果-33: 返回结果 '''''''' @@ -3224,7 +3969,7 @@ date 当前时间 获取节点配置信息 ^^^^^^^^^^^^^^^^ -.. _参数-61: +.. _参数-62: 参数 '''' @@ -3235,7 +3980,7 @@ date 当前时间 action loadNodeConfig ====== ============== -.. _请求示例-62: +.. _请求示例-69: 请求示例 '''''''' @@ -3246,7 +3991,7 @@ action loadNodeConfig param.action = "loadNodeConfig"; wssocket.send(JSON.stringify(param)); -.. _返回结果-33: +.. _返回结果-34: 返回结果 '''''''' @@ -3287,7 +4032,7 @@ action loadNodeConfig 修改节点配置 ^^^^^^^^^^^^ -.. _参数-62: +.. _参数-63: 参数 '''' @@ -3317,7 +4062,7 @@ masterAddress 192.168.3.2:18001 该NodePortal节点的ip和的 修改节点名称 ^^^^^^^^^^^^ -.. _参数-63: +.. _参数-64: 参数 '''' @@ -3329,7 +4074,7 @@ action changeNodeName data 新的节点名称 ====== ============== -.. _请求示例-63: +.. _请求示例-70: 请求示例 '''''''' @@ -3341,7 +4086,7 @@ data 新的节点名称 param.data = "NewNodeName"; wssocket.send(JSON.stringify(param)); -.. _返回结果-34: +.. _返回结果-35: 返回结果 '''''''' @@ -3357,7 +4102,7 @@ data 新的节点名称 修改节点YJS路径 ^^^^^^^^^^^^^^^ -.. _参数-64: +.. _参数-65: 参数 '''' @@ -3369,7 +4114,7 @@ action changeYJSPath data 节点服务器yjs.jar路径 ====== ===================== -.. _请求示例-64: +.. _请求示例-71: 请求示例 '''''''' @@ -3381,7 +4126,7 @@ data 节点服务器yjs.jar路径 param.data = "/Users/xxx/docs/BDWareHttp/generatedlib/yjs.jar"; wssocket.send(JSON.stringify(param)); -.. _返回结果-35: +.. _返回结果-36: 返回结果 '''''''' @@ -3397,7 +4142,7 @@ data 节点服务器yjs.jar路径 修改NodeCenter ^^^^^^^^^^^^^^ -.. _参数-65: +.. _参数-66: 参数 '''' @@ -3409,7 +4154,7 @@ action changeNodeCenter data 节点服务器要连接的NodeCenterWebSocket路径 ====== ========================================= -.. _请求示例-65: +.. _请求示例-72: 请求示例 '''''''' @@ -3421,7 +4166,7 @@ data 节点服务器要连接的NodeCenterWebSocket路径 param.data = "ws://127.0.0.1:1719/SCIDE/NodeCenter"; wssocket.send(JSON.stringify(param)); -.. _返回结果-36: +.. _返回结果-37: 返回结果 '''''''' @@ -3437,7 +4182,7 @@ data 节点服务器要连接的NodeCenterWebSocket路径 修改账本节点 ^^^^^^^^^^^^ -.. _参数-66: +.. _参数-67: 参数 '''' @@ -3449,7 +4194,7 @@ action changeBDledger data 数链节点的IP:port,用“,”隔开 ====== =========================== -.. _请求示例-66: +.. _请求示例-73: 请求示例 '''''''' @@ -3461,7 +4206,7 @@ data 数链节点的IP:port,用“,”隔开 param.data = "39.108.56.240:18091,39.108.56.12:18091"; wssocket.send(JSON.stringify(param)); -.. _返回结果-37: +.. _返回结果-38: 返回结果 '''''''' @@ -3477,7 +4222,7 @@ data 数链节点的IP:port,用“,”隔开 上传节点Licence ^^^^^^^^^^^^^^^ -.. _参数-67: +.. _参数-68: 参数 '''' @@ -3489,7 +4234,7 @@ action uploadLicence data 节点服务器的Licence内容 ====== ======================= -.. _请求示例-67: +.. _请求示例-74: 请求示例 '''''''' @@ -3501,7 +4246,7 @@ data 节点服务器的Licence内容 param.data = "04AADCC7103C"; wssocket.send(JSON.stringify(param)); -.. _返回结果-38: +.. _返回结果-39: 返回结果 '''''''' @@ -3517,7 +4262,7 @@ data 节点服务器的Licence内容 获取节点ID ^^^^^^^^^^ -.. _参数-68: +.. _参数-69: 参数 '''' @@ -3528,7 +4273,7 @@ data 节点服务器的Licence内容 action getNodeID ====== ========= -.. _请求示例-68: +.. _请求示例-75: 请求示例 '''''''' @@ -3539,7 +4284,7 @@ action getNodeID param.action = "getNodeID"; wssocket.send(JSON.stringify(param)); -.. _返回结果-39: +.. _返回结果-40: 返回结果 '''''''' @@ -3555,7 +4300,7 @@ action getNodeID 获取节点所在的可信执行集群 ^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. _参数-69: +.. _参数-70: 参数 '''' @@ -3569,7 +4314,7 @@ msgHandler 收到回复的回调函数, 可使用“建立连接”的msgHandler ws 节点所属的NodeCenter的WebSocket地址 ========== ================================================ -.. _请求示例-69: +.. _请求示例-76: 请求示例 '''''''' @@ -3583,7 +4328,7 @@ ws 节点所属的NodeCenter的WebSocket地址 centerportalws.send(JSON.stringify(param)); }, msgHandler); -.. _返回结果-40: +.. _返回结果-41: 返回结果 '''''''' @@ -3606,7 +4351,7 @@ ws 节点所属的NodeCenter的WebSocket地址 获取合约模板列表 ^^^^^^^^^^^^^^^^ -.. _参数-70: +.. _参数-71: 参数 '''' @@ -3617,7 +4362,7 @@ ws 节点所属的NodeCenter的WebSocket地址 action getTemplateList ====== =============== -.. _请求示例-70: +.. _请求示例-77: 请求示例 '''''''' @@ -3628,7 +4373,7 @@ action getTemplateList req.action = "getTemplateList"; wssocket.send(JSON.stringify(req)); -.. _返回结果-41: +.. _返回结果-42: 返回结果 '''''''' @@ -3718,7 +4463,7 @@ action getTemplateList 空白合约模板 ^^^^^^^^^^^^ -.. _参数-71: +.. _参数-72: 参数 '''' @@ -3732,7 +4477,7 @@ isPrivate 布尔类型,是否为私有项目 accessPolicy 若为“DAC”,则实现直接访问控制 ============ ============================= -.. _请求示例-71: +.. _请求示例-78: 请求示例 '''''''' @@ -3746,7 +4491,7 @@ accessPolicy 若为“DAC”,则实现直接访问控制 //wssocket为建立好的连接 wssocket.send(JSON.stringify(req)); -.. _返回结果-42: +.. _返回结果-43: 返回结果 '''''''' @@ -3763,7 +4508,7 @@ accessPolicy 若为“DAC”,则实现直接访问控制 MySQL接入合约 ^^^^^^^^^^^^^ -.. _参数-72: +.. _参数-73: 参数 '''' @@ -3783,7 +4528,7 @@ fieldList 字符串列表,数据库的字段列表 defaultAccept 布尔值,表示申请时是否默认有权 ============= ====================================================== -.. _请求示例-72: +.. _请求示例-79: 请求示例 '''''''' @@ -3806,7 +4551,7 @@ defaultAccept 布尔值,表示申请时是否默认有权 //global.wssocket为建立好的连接 global.wssocket.send(JSON.stringify(req)); -.. _返回结果-43: +.. _返回结果-44: 返回结果 '''''''' @@ -3823,7 +4568,7 @@ defaultAccept 布尔值,表示申请时是否默认有权 CSV接入合约 ^^^^^^^^^^^ -.. _参数-73: +.. _参数-74: 参数 '''' @@ -3839,7 +4584,7 @@ accessPolicy 若为“DAC”,则实现直接访问控制,若为“NAC defaultAccept 可选字段,布尔值,表示申请时是否默认有权 ================= ====================================================== -.. _请求示例-73: +.. _请求示例-80: 请求示例 '''''''' @@ -3858,7 +4603,7 @@ defaultAccept 可选字段,布尔值,表示申请时是否默认有权 //global.wssocket为建立好的连接 global.wssocket.send(JSON.stringify(req)); -.. _返回结果-44: +.. _返回结果-45: 返回结果 '''''''' @@ -3889,7 +4634,7 @@ defaultAccept 可选字段,布尔值,表示申请时是否默认有权 登录前获取session以便进行签名。 -.. _参数-74: +.. _参数-75: 参数 '''' @@ -3900,7 +4645,7 @@ defaultAccept 可选字段,布尔值,表示申请时是否默认有权 action getSessionID ====== ============ -.. _请求示例-74: +.. _请求示例-81: 请求示例 '''''''' @@ -3911,7 +4656,7 @@ action getSessionID req.action = "getSessionID"; wssocket.send(JSON.stringify(req)); -.. _返回结果-45: +.. _返回结果-46: 返回结果 '''''''' @@ -3930,7 +4675,7 @@ action getSessionID 用户进行公私钥身份验证,需先调用“getSessionID”获取sessionID以便于签名。 -.. _参数-75: +.. _参数-76: 参数 '''' @@ -3941,7 +4686,7 @@ action getSessionID action login ====== ===== -.. _请求示例-75: +.. _请求示例-82: 请求示例 '''''''' @@ -3972,7 +4717,7 @@ action login 用户根据登录时的公钥获取对应的角色,如果是第一次登录则此时的公钥默认称为准入管理员 -.. _参数-76: +.. _参数-77: 参数 '''' @@ -3983,7 +4728,7 @@ action login action getRole ====== ======= -.. _请求示例-76: +.. _请求示例-83: 请求示例 '''''''' @@ -4013,7 +4758,7 @@ action getRole 在准入管理员界面可以申请称为组网中某个节点的节点管理员 -.. _参数-77: +.. _参数-78: 参数 '''' @@ -4025,7 +4770,7 @@ action applyRole role 申请的角色名称 ====== ============== -.. _请求示例-77: +.. _请求示例-84: 请求示例 '''''''' @@ -4052,7 +4797,7 @@ role 申请的角色名称 添加节点 ^^^^^^^^ -.. _参数-78: +.. _参数-79: 参数 '''' @@ -4064,7 +4809,7 @@ action addNode nodePubKey 要添加的节点公钥 ========== ================ -.. _请求示例-78: +.. _请求示例-85: 请求示例 ^^^^^^^^ @@ -4082,7 +4827,7 @@ nodePubKey 要添加的节点公钥 删除用户角色 ^^^^^^^^^^^^ -.. _参数-79: +.. _参数-80: 参数 '''' @@ -4094,7 +4839,7 @@ action delete pubKey 对应用户的公钥 ====== ============== -.. _请求示例-79: +.. _请求示例-86: 请求示例 '''''''' @@ -4125,7 +4870,7 @@ pubKey 对应用户的公钥 查看准入管理员当前组网中已经授权的节点管理员 -.. _参数-80: +.. _参数-81: 参数 '''' @@ -4136,7 +4881,7 @@ pubKey 对应用户的公钥 action listAllUsers ====== ============ -.. _请求示例-80: +.. _请求示例-87: 请求示例 '''''''' @@ -4171,7 +4916,7 @@ action listAllUsers 查看申请用户列表 ^^^^^^^^^^^^^^^^ -.. _参数-81: +.. _参数-82: 参数 '''' @@ -4182,7 +4927,7 @@ action listAllUsers action listApplyList ====== ============= -.. _请求示例-81: +.. _请求示例-88: 请求示例 '''''''' @@ -4193,7 +4938,7 @@ action listApplyList param.action = "onListApplyList"; wssocket.send(JSON.stringify(param)); -.. _返回结果-46: +.. _返回结果-47: 返回结果 '''''''' @@ -4215,7 +4960,7 @@ action listApplyList 查看用户类型分布 ^^^^^^^^^^^^^^^^ -.. _参数-82: +.. _参数-83: 参数 '''' @@ -4226,7 +4971,7 @@ action listApplyList action queryUserStat ====== ============= -.. _请求示例-82: +.. _请求示例-89: 请求示例 '''''''' @@ -4258,7 +5003,7 @@ action queryUserStat 查看该用户有权限查看的节点列表(仅准入管理员及合约管理者可用) -.. _参数-83: +.. _参数-84: 参数 '''' @@ -4269,7 +5014,7 @@ action queryUserStat action listNodes ====== ========= -.. _请求示例-83: +.. _请求示例-90: 请求示例 '''''''' @@ -4280,7 +5025,7 @@ action listNodes param.action = "listNodes"; wssocket.send(JSON.stringify(param)); -.. _返回结果-47: +.. _返回结果-48: 返回结果 '''''''' @@ -4307,7 +5052,7 @@ action listNodes 查看该用户有权限查看的节点列表(仅中心管理员及合约管理者可用) -.. _参数-84: +.. _参数-85: 参数 '''' @@ -4318,7 +5063,7 @@ action listNodes action listTrustUnits ====== ============== -.. _请求示例-84: +.. _请求示例-91: 请求示例 '''''''' @@ -4329,7 +5074,7 @@ action listTrustUnits param.action = "listTrustUnits"; wssocket.send(JSON.stringify(param)); -.. _返回结果-48: +.. _返回结果-49: 返回结果 '''''''' @@ -4347,7 +5092,7 @@ action listTrustUnits 建立可信执行集群 ^^^^^^^^^^^^^^^^ -.. _参数-85: +.. _参数-86: 参数 '''' @@ -4360,7 +5105,7 @@ data 节点公钥组成的Json数组 Msg 集群名称 ====== ====================== -.. _请求示例-85: +.. _请求示例-92: 请求示例 '''''''' @@ -4373,7 +5118,7 @@ Msg 集群名称 param.msg = "newUnit1"; global.wssocket.send(JSON.stringify(param)); -.. _返回结果-49: +.. _返回结果-50: 返回结果 '''''''' @@ -4388,7 +5133,7 @@ Msg 集群名称 删除可信执行集群 ^^^^^^^^^^^^^^^^ -.. _参数-86: +.. _参数-87: 参数 '''' @@ -4400,7 +5145,7 @@ action deleteTrustUnit data 可信执行集群ID ====== =============== -.. _请求示例-86: +.. _请求示例-93: 请求示例 '''''''' @@ -4412,7 +5157,7 @@ data 可信执行集群ID param.data = "0475d34rf3434..._1583410158761"; global.wssocket.send(JSON.stringify(param)); -.. _返回结果-50: +.. _返回结果-51: 返回结果 '''''''' @@ -4432,7 +5177,7 @@ data 可信执行集群ID 查看组网管理操作的统计 ^^^^^^^^^^^^^^^^^^^^^^ -.. _参数-87: +.. _参数-88: 参数 '''' @@ -4444,7 +5189,7 @@ action queryActionLog date 当前时间 ====== ============== -.. _请求示例-87: +.. _请求示例-94: 请求示例 '''''''' @@ -4455,7 +5200,7 @@ date 当前时间 request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); -.. _返回结果-51: +.. _返回结果-52: 返回结果 '''''''' @@ -4469,7 +5214,7 @@ date 当前时间 查看本地近n日合约日志 ^^^^^^^^^^^^^^^^^^^^^ -.. _参数-88: +.. _参数-89: 参数 '''' @@ -4481,7 +5226,7 @@ action listLocalContractLog date 当前时间 ====== ==================== -.. _请求示例-88: +.. _请求示例-95: 请求示例 '''''''' @@ -4492,7 +5237,7 @@ date 当前时间 request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); -.. _返回结果-52: +.. _返回结果-53: 返回结果 '''''''' @@ -4533,7 +5278,7 @@ Bash接口 启动合约 ~~~~~~~~ -.. _参数-89: +.. _参数-90: 参数 ^^^^ @@ -4555,7 +5300,7 @@ Bash接口 调用合约 ~~~~~~~~ -.. _参数-90: +.. _参数-91: 参数 ^^^^ @@ -4579,7 +5324,7 @@ Bash接口 停止合约 ~~~~~~~~ -.. _参数-91: +.. _参数-92: 参数 ^^^^ @@ -4600,7 +5345,7 @@ Bash接口 停止全部合约 ~~~~~~~~~~~~ -.. _参数-92: +.. _参数-93: 参数 ^^^^ @@ -4619,7 +5364,7 @@ Bash接口 查询全部合约 ~~~~~~~~~~~~ -.. _参数-93: +.. _参数-94: 参数 ^^^^ diff --git a/source/IDEUsage.rst b/source/IDEUsage.rst index 2fa95fd..2777fff 100644 --- a/source/IDEUsage.rst +++ b/source/IDEUsage.rst @@ -1,5 +1,5 @@ -BDContract管理界面 -================== +管理界面 +======== -------------- diff --git a/source/InstallTips.rst b/source/InstallTips.rst index 3733755..dbb74e8 100644 --- a/source/InstallTips.rst +++ b/source/InstallTips.rst @@ -1,5 +1,5 @@ -BDContract安装说明 -================== +安装说明 +======== -------------- diff --git a/source/Introduction.rst b/source/Introduction.rst index 549684d..8153117 100644 --- a/source/Introduction.rst +++ b/source/Introduction.rst @@ -1,12 +1,12 @@ -BDContract介绍 -============== +北大数瑞介绍 +============ -------------- -什么是BDContract? ------------------ +什么是北大数瑞? +--------------- -BDContract是智融云河大数据区块链中,基于北大数瑞开源的智能合约引擎封装的一套软件。是面向大数据场景的数据资源、IoT资源、云资源的管理、调度平台。BDContract是一个可信计算框架,计算逻辑以智能合约的方式表达。通过”随机“和”冗余计算“的方式实现智能合约的可信执行。BDContract在保证智能合约的可用性、可靠性的同时,着重提升执行效率和安全性。 +北大数瑞是面向大数据场景的数据资源、IoT资源、云资源的管理、调度平台。BDContract是一个可信计算框架,计算逻辑以智能合约的方式表达。通过”随机“和”冗余计算“的方式实现智能合约的可信执行。BDContract在保证智能合约的可用性、可靠性的同时,着重提升执行效率和安全性。 -------------- @@ -22,205 +22,10 @@ BDContract是智融云河大数据区块链中,基于北大数瑞开源的智 -------------- -更新日志 --------- - -- **v1.4.5** 2021年6月29日 - - - 稳定性提升 - - HTTP服务端的URIPath优化 - - 支持以Http方式进行静态资源文件加载 - -- **v1.4.4** 2021年6月15日 - - - 修复了getContractMeta时没优先返回RUNNING/HANGED的合约的问题 - - 实现了HomomorphicEncrypt的逻辑 - -- **v1.4.3** 2021年6月9日 - - - 修复SSL Renegotiate Bug - - 实现内存不足时自动Hangup-Resume - - 实现contract meta的硬盘持久化 - -- **v1.4.1** 2021年5月26日 - - - 实现了事件机制中的事件语义,支持“至少一次”、“至多一次”和“只有一次” - - 优化了合约模板 - - 增加模板配置文件 - - 优化了MockTemplate注解 - -- **v1.4.0** 2021年5月9日 - - - 优化了ACTemplate - - 完善了DoRepo的配置联动 - -- **v1.3.9** 2021年4月22日 - - - 修复了doipConfig在updateConfig中不支持的bug - - test-tool支持了sudo - - 优化了contract-template中的ACTemplate模板 - -- **v1.3.6** 2021年4月21日 - - - 修复了docker中无法获取cpuid的问题 - -- **v1.3.6** 2021年4月16日 - - - 修复了部分bug - - 修复了GRPCPool线程数量不足导致排队的bug - - 修复了requestID分配在压力测试下可能重复的bug - -- **v1.3.5** 2021年3月31日 - - - 修复了部分bug - - http的合约调用部分增加了简单拥塞控制策略 - - 稳定性提升 - -- **v1.3.0** 2021年2月1日 - - - 优化心跳机制 - - 修复部分Bug - - 更新SM2/SM3库 - - 更新前端签名计算方式 - -- **v1.2.0** 2020年12月11日 - - - 优化了多节点执行模式 - - 优化了合约master路由的逻辑 - - 修复了部分bug - - 修复文件系统相关的漏洞 - -- **v1.1.0** 2020年9月 - - - 支持https,并更新了该部分文档 - -- **v1.0.9** 2020年8月27日 - - - 完善IO相关工具类的文档 - - 优化合约模板:DAC持久化 - -- **v1.0.7** 2020年8月13日 - - - 优化合约日志、账本接口 - - 优化相关接口的文档 - - 提供合约模板的websocket接口 - - 自动编译bug修复 - -- **v1.0.5** 2020年7月25日 - - - 弱化NC的中心化作用,集群点对点连接。 - - 优化bdwareclient - - TODO MemoryDurable - -- **v1.0.2** 2020年7月22日 - - - 修复CentOS7下Too Many Opened Files的Bug - - 修复权限Bug - - 增加权限说明 - - 修复MySQLUtil的bug - - 升级BDLedger版本 - -- **v1.0.1** 2020年7月5日 - - - 更新了NodePortal/CenterPortal的UI。 - - 修改了编译流程,在NodePortal中可查看编译结果,在OnlineIDE中可手动/启动时编译 - - 修改了合约分发逻辑,以编译后ypk作为分发的文件 - - 支持public目录下的ypk在多节点模式下执行时,合约故障自动恢复 - -- **v0.99** 2020年6月22日 - - - 自定义合约方法的计费 - - 新增了GasExample、Incentives示例 - - 在客户端实现了“校验多点结果”,并优化了结果返回的方式 - - 修复断线重连后无权限提示 - -- **v0.97** 2020年5月25日 - - - cpu等资源的计量:gas机制 - - onlineIDE.html 支持上传多个文件 - - udp方式组网进行多点执行[无定序消息] - - bdwareclient.html,修复只包含计算逻辑的调用示例生成前缀错误 - -- **v0.95** 2020年5月19日 - - - 修复了onlineIDE.html在的pathname有前缀时不能正确跳转bdwareclient的bug。 - - 修复了bdwareclient的pathname有前缀时自动提取url的bug。 - - 启用了合约的权限 - - 增加了NodePortal.html/OnlineIDE.html和bdwareclient.html中无权限时的提醒 - -- **v0.90** 2020年5月9日 - - - 更改了yjs.jar/bdserver.jar的打包方式 - - 更新了install.sh/update.sh - - onlineIDE的修改后提醒 - - onlineIDE标签页自适应宽度 - - 文件接口隔离 - -- **v0.8** 2020年4月26日 - - - 完善文档界面和优化SDK提供方式 - - 数瑞Web客户端,客户端中所有的数据处理和如何对处理后的数据进行渲染均来自合约调用,实现可信Web应用。 - -- **v0.78** 2020年4月13日 - - - 合约调用DAC示例 - - 支持动态修改IO权限 - - 支持合约状态自定义备份(定时)策略 - - 修复部分页面bug - - 日志展示优化 - - 优化账本日志展示 - - 启用部分权限访问控制 - -- **v0.7** 2020年3月25日 - - - 支持多种角色的访问控制 - - 更新了UI - -- **v0.6** 2020年2月14日 - - - 优化了合约进程间的通讯 - - 尝试接入P2P网络 - -- **v0.5** 2019年12月10日 - - - 完善了3种智能合约状态记录-回放策略 - - 支持了最简单的多点执行算法(不同步) - -- **v0.45** 2019年9月2日 - - - 初步实现PBFT算法 - -- **v0.4** 2019年5月10日 - - - 支持memory dump - -- **v0.35** 2019年4月26日 - - - 实现合约的静态分析框架 - - 支持事件的发布-订阅 - -- **v0.3** 2019年1月8日 - - - 支持账本数据的接入 - - 合约状态上链 - -- **v0.2** 2018年10月9日 - - - 支持Python包的自动生成 - - 支持合约打包为ypk - - 支持文件、数据库等数据的接入 - -- **v0.1** 2018年8月6日 - - - 定义了智能合约的语法 - - 基于nashorn引擎,实现了智能合约的执行 - --------------- - 使用开源项目说明 ---------------- -BDWareContract项目站在了许多巨人的肩膀上,感谢这些开源项目。 +BDWare项目站在了许多巨人的肩膀上,感谢这些开源项目。 本项目的智能合约后端使用了以下开源库。 diff --git a/source/YJSAPI.rst b/source/YJSAPI.rst index 9561766..38205f4 100644 --- a/source/YJSAPI.rst +++ b/source/YJSAPI.rst @@ -68,7 +68,7 @@ YJS Build-in API } 发布事件 pubEvent -~~~~~~~~~~~~~~~~~ +----------------- 参数 @@ -86,7 +86,7 @@ YJS Build-in API return "done"; } -也可以在合约开头声明事件,则事件名即为事件主题,此时可直接使用事件作为方法名发布事件 +也可以在合约开头定义事件,则事件名即为事件主题,此时可直接使用事件作为方法名发布事件 .. code:: javascript @@ -98,55 +98,6 @@ YJS Build-in API 该写法与上面的\ ``pub1``\ 等价。 -发布带语义事件 pubEventConstraint -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -参数 - -.. code:: bash - - topic:字符串类型,发布的事件主题 - content:字符串类型,发布的事件内容 - semantics:枚举类型,作为字符串输入,事件语义 - -事件语义参数 + AT_LEAST_ONCE:至少一次,默认语义 + -AT_MOST_ONCE:至多一次 + ONLY_ONCE:只有一次 - -使用示例: - -.. code:: javascript - - export function pub1(arg) { - YancloudUtil.pubEventConstraint("topic", arg, "AT_MOST_ONCE"); - return "done"; - } - -也可以在合约开头声明事件,则事件名即为事件主题,此时可直接使用事件作为方法名按声明的语义发布事件 - -.. code:: javascript - - event AT_MOST_ONCE topic; - export function pub2(arg) { - topic(arg); - return "done"; - } - -该写法与上面的\ ``pub1``\ 等价。 - -事先声明的事件无论是否声明语义,都可以用后缀s作为方法名的方式调用,发布任意语义的事件: - -.. code:: javascript - - event topic; - export function pub3(arg) { - topics(arg, "AT_MOST_ONCE"); - return "done"; - } - -该写法与上面的\ ``pub1, pub2``\ 等价。 - -*不带事件语义声明事件时,语义默认为至少一次(AT_LEAST_ONCE)。* - 访问资源文件 ~~~~~~~~~~~~ @@ -182,30 +133,6 @@ loadAsScanner var scanner = Global.Resources.loadAsScanner("/local.txt"); -YancloudUtil -~~~~~~~~~~~~ - -提供了一些内置的工具方法。 - -getKeyPair -^^^^^^^^^^ - -参数: - -:: - - 无 - -使用示例: - -:: - - var keyPair = YancloudUtil.getKeyPair(); - //该类型为SM2KeyPair类型, - print(keyPair.getPublicKeyStr()); - print(keyPair.getPrivateKeyStr()); - print(keyPair.toJson()); - YJS Build-in Annotation ----------------------- @@ -325,15 +252,13 @@ LogType注解通过参数的方式声明合约或函数的需要记录的日志 :: - @integer 整数 - @string 字符串 - @boolean 布尔值 - @date @time @datatime - @word 单词 @cword 中文单词 - @first @last 英文姓,名 - @cfirst @clast @cname 中文姓,名,全名 - @url @domin @ip @email - @region @province @city @county 地区,省,市,县 + @integer + @string + @boolean + @date + @time + @datatime + /[a-z][A-Z][0-9]/ (正则表达式) …… 详细格式可以参考http://mockjs.com/examples.html @@ -341,10 +266,20 @@ LogType注解通过参数的方式声明合约或函数的需要记录的日志 .. code:: json + //返回一个1-100之间的整数 + @MockTemplate({'result|1-100':1}) + //返回 + {'result':76} + + //返回一个1-5个数的数组 + @MockTemplate({'result|1-5':[{'value|1-100':1}]}) + //返回 + {"result":[{"value":34},{"value":8},{"value":48},{"value":50},{"value":43}]} + //返回一个对象包含如下字段 @MockTemplate({'result':{'id':'@integer','email':'@email','password':'@string','name':'@name'}}) //返回 - {"password":"3ZLc","name":"William Young","id":36097783842688,"email":"d.fuunwe@gqnr.to"}" + {"password":"3ZLc","name":"William Young","id":36097783842688,"email":"d.fuunwe@gqnr.to"} //返回元素个数为1-5个之间的一个数组,数组的每个元素都是上述格式的一个对象 @@ -374,6 +309,7 @@ LogType注解通过参数的方式声明合约或函数的需要记录的日志 ~~~~~~~ 该注解可以修饰\ ``function``\ 。 +若没有模拟数据模板,则返回模拟数据时使用该注解的内容 提供函数的返回结果示例,若加此注解则生成说明文档时将直接返回此结果而不使用默认参数调用函数。 :: @@ -390,16 +326,6 @@ LogType注解通过参数的方式声明合约或函数的需要记录的日志 return JSON.stringify(c); } -@Cost -~~~~~ - -该注解可以修饰\ ``function``\ 。 提供函数的cpu计量功能。 - -:: - - @Cost({"countGas":true}) - export function .... - IO工具类 -------- @@ -1068,53 +994,22 @@ update var digitalObject = JSON.parse("{\"doID\":\"86.5000.470/do.hello\",\"doBody\":\"hello world\"}"); var ret = DOIPUtil.update(digitalObject); -SQLUtil -~~~~~~~ +MySQLUtil +~~~~~~~~~ -可以使用@Permission(“SQL”)来引入SQLUtil对象。 -可支持MySQL/PostgreSQL/Oracle/GuassDB200等SQL数据库。 -需要将对应的jdbc的jar上传到项目中。 -例如,要使用mysql,可上传mysql-connector-java-8.0.24.jar +可以使用@Permission(“MySQL”)来引入MySQLUtil对象。 :: - @Permission("SQL") - oracle MySQLExample{ + @Permission("MySQL") + contract MySQLExample{ ... } -initDriver -^^^^^^^^^^ - -.. _参数-21: - -参数 -'''' - -==== =========== ========== -序号 参数 说明 -==== =========== ========== -1 driverClass 字符串类型 -==== =========== ========== - -.. _使用示例-22: - -使用示例 -'''''''' - -.. code:: javascript - - //使用mysql - SQLUtil.initDriver("com.mysql.cj.jdbc.Driver"); - //使用postgresql - SQLUtil.initDriver("org.postgresql.Driver"); - //使用oracle - SQLUtil.initDriver("oracle.jdbc.OracleDriver"); - getConnection ^^^^^^^^^^^^^ -.. _参数-22: +.. _参数-21: 参数 '''' @@ -1127,7 +1022,7 @@ getConnection 3 pwd 字符串类型,密码 ==== ======= ==================== -.. _使用示例-23: +.. _使用示例-22: 使用示例 '''''''' @@ -1138,7 +1033,7 @@ getConnection var usrName = "xxx"; var pwd = "xxx"; //配置好用户名和密码,url格式为ip或域名+端口,中间以”:”隔开。 - var conn = SQLUtil.getConnection(url,usrName,pwd); + var conn = MySQLUtil.getConnection(url,usrName,pwd); //获取数据库连接 var sql = "select * from newele.data"; //创建查询语句 @@ -1176,7 +1071,7 @@ MongoDBUtil getConnection ^^^^^^^^^^^^^ -.. _参数-23: +.. _参数-22: 参数 '''' @@ -1191,7 +1086,7 @@ getConnection 5 pwd 字符串类型 数据库的密码 ==== ======= ========================= -.. _使用示例-24: +.. _使用示例-23: 使用示例 '''''''' @@ -1233,7 +1128,7 @@ loadDB 通过loadDB来加载一个RocksDB数据库。 加载后,可进行get/delete/put等操作。 -.. _参数-24: +.. _参数-23: 参数 '''' @@ -1245,7 +1140,7 @@ loadDB 2 readOnly 布尔类型 数据库只读 ==== ======== =========================== -.. _使用示例-25: +.. _使用示例-24: 使用示例 '''''''' @@ -1360,14 +1255,14 @@ generateKeyPair 生成公私钥。 -.. _参数-25: +.. _参数-24: 参数 '''' 无参数。 -.. _使用示例-26: +.. _使用示例-25: 使用示例 '''''''' @@ -1384,7 +1279,7 @@ sign 签名。 -.. _参数-26: +.. _参数-25: 参数 '''' @@ -1396,7 +1291,7 @@ sign 2 keyPair sm2 ==== ======= =========================== -.. _使用示例-27: +.. _使用示例-26: 使用示例 '''''''' @@ -1416,7 +1311,7 @@ verify 验签。 -.. _参数-27: +.. _参数-26: 参数 '''' @@ -1429,7 +1324,7 @@ verify 3 publicKey 字符串类型 公钥 ==== ========= ======================= -.. _使用示例-28: +.. _使用示例-27: 使用示例 '''''''' @@ -1442,60 +1337,6 @@ verify print(ret.status); print(ret.result); -encrypt -^^^^^^^ - -sm2加密。 - -.. _参数-28: - -参数 -'''' - -==== ========= ======================= -序号 参数 说明 -==== ========= ======================= -1 content 字符串类型 待验签的内容 -3 publicKey 字符串类型 公钥 -==== ========= ======================= - -.. _使用示例-29: - -使用示例 -'''''''' - -.. code:: javascript - - var ret = SM2Util.encrypt("Hello","...公钥"); - print(ret); - -decrypt -^^^^^^^ - -sm2解密。 - -.. _参数-29: - -参数 -'''' - -==== ========== ======================= -序号 参数 说明 -==== ========== ======================= -1 content 字符串类型 待验签的内容 -3 privateKey 字符串类型 公钥 -==== ========== ======================= - -.. _使用示例-30: - -使用示例 -'''''''' - -.. code:: javascript - - var ret = SM2Util.decrypt("Hello","...私钥"); - print(ret); - 多线程工具类 ------------ @@ -1529,7 +1370,7 @@ AsyncUtil postFunction ^^^^^^^^^^^^ -.. _参数-30: +.. _参数-27: 参数 '''' @@ -1541,7 +1382,7 @@ postFunction 2 arg1 对象 ==== ==== ============== -.. _使用示例-31: +.. _使用示例-28: 使用示例 '''''''' @@ -1553,7 +1394,7 @@ postFunction setInterval ^^^^^^^^^^^ -.. _参数-31: +.. _参数-28: 参数 '''' @@ -1567,7 +1408,7 @@ setInterval 4 arg3 对象 ==== ==== ============== -.. _使用示例-32: +.. _使用示例-29: 使用示例 '''''''' @@ -1579,7 +1420,7 @@ setInterval setTimeOut ^^^^^^^^^^ -.. _参数-32: +.. _参数-29: 参数 '''' @@ -1592,7 +1433,7 @@ setTimeOut 3 arg2 Object ==== ==== ============== -.. _使用示例-33: +.. _使用示例-30: 使用示例 '''''''' @@ -1604,7 +1445,7 @@ setTimeOut sleep ^^^^^ -.. _参数-33: +.. _参数-30: 参数 '''' @@ -1615,7 +1456,7 @@ sleep 1 arg0 long ==== ==== ==== -.. _使用示例-34: +.. _使用示例-31: 使用示例 '''''''' @@ -1642,98 +1483,3 @@ YJS支持ECMAScript6的部分内置对象 : - Error https://www.w3schools.com/js/js_errors.asp - JSON https://www.w3schools.com/js/js_json.asp - -YJS应用框架 ------------ - -ypk项目组成 -~~~~~~~~~~~ - -如之前描述,ypk中可存放静态资源文件(html/css/js),在智能合约中声明loadResource方法,可返回静态资源文件。 -基于loadResource,本项目提供了一个yjs应用框架。 -该框架可以将合约ypk中的(html/css/js)文件通过executeContract调用,加载至前端并展示。 - -函数约定 -~~~~~~~~ - -==== ============ ====================================================== -序号 合约函数名 说明 -==== ============ ====================================================== -1 needRender 不会被调用,有该函数表示需要渲染前端 -2 getMainFrame 无参数,返回结果为String类型,表示主页的html文件路径 -3 loadResource 参数为String,以文本形式,返回相对路径下的静态资源文件 -==== ============ ====================================================== - -加载流程 -~~~~~~~~ - -前端加载的参数会解析至global.urlparam。 包括以下参数: - -:: - - //global.urlparam对象示例 - { - "contract":"TrustedStorage0899", //表示合约ID或是合约的名称 - - "keys":{ //表示当前登录者的密钥对 - "privateKey":"ff38dd04710...", - "publicKey":"04fc228..." - }, - "nodeAddr":"022.node.internetapi.cn:21030" //节点的ip+端口 - } - -加载前会先建立与nodeAddr的websocket连接。 连接建立后,加载流程分为两步: -第一步是用当前的publickey-privatekey登录。登录过程详见\ ``BDContract SDK`` -的 ``合约节点WebSocket接口`` 登录之后,会获取合约的信息。 -并存放于global.currentContract对象。 - -第二步,是根据global.currentContract对象中,是否有needRender方法, -如果有,就会进入加载前端代码的流程。 -具体为1.执行executeCurrentContract(“getMainFrame”) -获取页面的html,append至mainDIV之后, -会解析所有\ ``