# BDware SDK In addition to using the visual smart contract online IDE, users can also use the WebSocket interface, Http interface, Bash interface to start and run the contract. - - - ## WebSocketSDK download and installation The contract SDK provides a javascript version and a Java version of the client. The download links of Java client are :[java source](./_static/BDWareJavaClient.zip) and [jar](./_static/BDWareConfigTool.zip) refer to Readme.md and test cases in java_Source. The javascript download link is :[js SDK](./_static/js/createWS.js) Built-in SM2 encryption library link :[sm2 SDK](./_static/js/sm2.js) ### Establish a connection Establish a WebSocket connection to the node server. #### parameter |field |value| | ---------- | ------------------------------------------------------------ | | url |If `http` is used, the prefix is `ws://`, for example, `"ws://localhost:1717/SCIDE/SCExecutor"`. If `https` is used, the prefix is `wss://`.| | msgHandler |The callback function after receiving the server WebSocket reply can be written by the user, or refer to the example provided below| #### Sample request ```javascript var url = "ws://127.0.0.1:1717/SCIDE/SCExecutor";//与Slave节点建立连接 //var url = "ws://127.0.0.1:1718/NodeCenterWS";//与Manager节点建立连接 var msgHandler = function(m){ console.log("recmsg:"); console.log(m); }; var onOpenHandler=undefined; wssocket = createWssocket(url,onOpenHandler,msgHandler); ``` #### Result ``` { receiveSeg: [Function (anonymous)], isSending: false, sendList: [], monitor: [Function (anonymous)], send: [Function (anonymous)], sendNextSegment: [Function (anonymous)], isOpen: [Function (anonymous)] } ``` ### ping `ping` Server test #### parameter |field| 值 | | ------ | ---- | |action| ping | #### Sample request ``` var request = {}; request.action = "ping"; wssocket.send(JSON.stringify(request)); ``` #### Result ``` { "action":"pong" } ``` ### The login When using the Websocket interface to invoke the interface that requires permission, either to connect to CenterPortal or NodePortal, **The login** must be performed first. The login process has 3 steps: - The client establishes a connection to the server and sends {“action”:“getSessionID”} (implemented in onOpenHandler). - After receiving the request, the server returns a result similar to {“action”:“onGetSessionID”,“session”:”-4959947809200104526_session”} to the client - After receiving the onGetSessionID, the client signs the sessionID with the local public and private keys and invokes the login interface - The server returns the onLogin result, and the data field returns the role corresponding to the public key. - - - ## User Role Division ### Role division of contract nodes In contract node (NodePortal. HTML) is divided into NodeManager/ContractProvider/ContractInstanceManager/ContractUser four types of roles. | 角色 |instructions| | ----------------------- | ------------------------------------------------------------ | | NodeManager |The administrator of the node has rights to manage users and configure nodes| | ContractProvider |Have the rights to edit contract, develop contract code, run debugging and so on| | ContractInstanceManager |Have the rights to start, stop, and configure I/O of the contract instance| | ContractUser |Have the rights to view the list of contract instances and call the contract| | Anonymous |Anonymous users, can be called the contract, can apply for to become ContractProvider/InstanceManager role| |interface | 说明 |role| | ------------------------------- | -------------------- | ----------------------------------------- | | changeDumpPeriod | 设置备份周期 |ContractInstanceManager;| | createLedger | 创建账本 |ContractInstanceManager;| |dumpContract | 手动备份 |ContractInstanceManager;| | deleteMemoryFile | 删除镜像 |ContractInstanceManager;| | forkContract | 迁移合约 |ContractInstanceManager;| | getDumpPeriod | 获取备份周期 |ContractInstanceManager;| |killAllContract | 停止全部实例 |ContractInstanceManager;| |killContractProcess | 停止某一实例 |ContractInstanceManager;| |listMemoryFiles | 列取某一实例的镜像 |ContractInstanceManager;| | loadMemory | 加载镜像 |ContractInstanceManager;| | queryContractInstanceDOI | 查询合约实例信息 |ContractInstanceManager;| | rebuildHashIndex | |ContractInstanceManager;| | setPermission | |ContractProvider;ContractInstanceManager;| | startContract | Start the contract |ContractInstanceManager;| | startContractBatched | 废弃 |ContractInstanceManager;| | startContractByYPK | 启动合约 |ContractInstanceManager;| |startContractInTempZips | 废弃 |ContractInstanceManager;| | startContractP2PTrustfully | 启动合约(集群模式) |ContractInstanceManager;| | updateContract | |ContractInstanceManager;| | connectTo | 连接合约实例输出流 |ContractInstanceManager;ContractUser;| | countContractLogGroupByAction | |ContractInstanceManager;ContractUser;| | countContractLogGroupByCategory | |ContractInstanceManager;ContractUser;| | getLastLog | 查询日志 |ContractInstanceManager;ContractUser;| | getLog | 查询日志 |ContractInstanceManager;ContractUser;| | getLogSize | 查询日志 |ContractInstanceManager;ContractUser;| | listAllContractProcess | |ContractInstanceManager;ContractUser;| |listContractProcess | 查询合约实例列表 |ContractInstanceManager;ContractUser;| | listLeakContractProcess | |ContractInstanceManager;ContractUser;| | queryContractLogByDate | |ContractInstanceManager;ContractUser;| |queryContractLogByKey | |ContractInstanceManager;ContractUser;| | queryContractLogByOffset | |ContractInstanceManager;ContractUser;| | queryContractLogDetail | |ContractInstanceManager;ContractUser;| |queryContractLogSize | |ContractInstanceManager;ContractUser;| |queryNodeLogByDate | |ContractInstanceManager;ContractUser;| | queryNodeLogByOffset | |ContractInstanceManager;ContractUser;| |queryNodeLogSize | |ContractInstanceManager;ContractUser;| | rebuildContractLogIndex | |ContractInstanceManager;ContractUser;| | rebuildNodeLogIndex | |ContractInstanceManager;ContractUser;| | changePublic | |ContractProvider;| | createFile | 新建文件 |ContractProvider;| | deleteFile | 删除文件 |ContractProvider;| | distributeContract | |ContractProvider;| |downloadContract | |ContractProvider;| | downloadContractFromOtherHost | |ContractProvider;| | generateAnnotationSample | |ContractProvider;| | generateAppDataAnalysis | |ContractProvider;| | generateAppDataSource | |ContractProvider;| | generateBDCoinEventProject | |ContractProvider;| | generateBDCoinProject | |ContractProvider;| | generateBiddingExample | |ContractProvider;| | generateCSVProject | |ContractProvider;| | generateContractExecutor | |ContractProvider;| | generateDAC4BDOA | |ContractProvider;| | generateDAC4BDOA_persist | |ContractProvider;| | generateDACSample | |ContractProvider;| | generateEmptyProject | |ContractProvider;| | generateEventPublisher | |ContractProvider;| | generateEventSubscriber | |ContractProvider;| | generateGasExample | |ContractProvider;| | generateHello | |ContractProvider;| | generateHttpExample | |ContractProvider;| | generateIncentives | |ContractProvider;| | generateJSONExample | |ContractProvider;| | generateLedgerExample | |ContractProvider;| | generateLedgerProject | |ContractProvider;| | generateLicenceManager | |ContractProvider;| | generateLoggerExample | |ContractProvider;| | generateMySQLExample | |ContractProvider;| | generateMySQLProject | |ContractProvider;| | generatePostgreSQLSample | |ContractProvider;| | generateReadme | |ContractProvider;| | generateRenderSample | |ContractProvider;| | generateRocksDBSample | |ContractProvider;| | generateSM2Example | |ContractProvider;| | generateStaticResource | |ContractProvider;| | generateTFLinux | |ContractProvider;| | generategenerateTFMac | |ContractProvider;| | getProject | |ContractProvider;| | getTemplateList | |ContractProvider;| | importContractInstanceCodeByDOI | |ContractProvider;| | listFile | |ContractProvider;| | listProject | |ContractProvider;| | listProjectPermission | |ContractProvider;| | listProjects | |ContractProvider;| | renameFile | |ContractProvider;| | saveFile | |ContractProvider;| | startContractAsDebug | |ContractProvider;| | uploadFile | |ContractProvider;| | compile | |ContractProvider;ContractInstanceManager;| | evaluates | |ContractProvider;ContractInstanceManager;| | executeContractP2PTrustfully | |ContractProvider;ContractInstanceManager;| |getCodeByID | 查询代码 |ContractProvider;ContractInstanceManager;| |getControlFlowByFileName | |ContractProvider;ContractInstanceManager;| | getGasValue | |ContractProvider;ContractInstanceManager;| | listCompiledFiles | |ContractProvider;ContractInstanceManager;| | queryContractResourceInfo | |ContractProvider;ContractInstanceManager;| | queryFreeResourceInfo | |ContractProvider;ContractInstanceManager;| |staticVerifyContract | |ContractProvider;ContractInstanceManager;| |writeDyjs | |ContractProvider;ContractInstanceManager;| | authNodeRole | 授权角色 |NodeManager;| | changeBDledger | 修改账本配置 |NodeManager;| | changeIpPort | |NodeManager;| | changeNodeCenter | 修改集群地址 |NodeManager;| | changeNodeName | |NodeManager;| | changeIpPort | |NodeManager;| | changeDOIPConfig | |NodeManager;| | changeYJSPath | |NodeManager;| | countNodeLogGroupByCategory | |NodeManager;| | countRole | |NodeManager;| | deleteRole | |NodeManager;| | downloadUUID | 废弃 |NodeManager;| | getEncodedUUID | 废弃 |NodeManager;| | getPeerID | |NodeManager;| | listAllAuthRole | |NodeManager;| | listNodeInfos | |NodeManager;| | listUnAuthRole | |NodeManager;| | loadConfig | |NodeManager;| | loadNodeConfig | |NodeManager;| | lockEdit | |NodeManager;| | unlockEdit | |NodeManager;| | updateConfig | |NodeManager;| | uploadLicence | |NodeManager;| | applyNodeRole | 申请角色 |Any role| |executeContract | Call the contract |Any role| | getConnCount | |Any role| | getHashAbstractLocally | |Any role| | getHashLocally | |Any role| | getNodeRoleDeprecated | 查询当前角色 |Any role| |getSessionID | |Any role| | listAdapters | |Any role| | listTheContractProcess | |Any role| |login | 登录 |Any role| | longStr | |Any role| | ping | |Any role| |queryDataByHash| |Any role| | queryDataByHashLocally | |Any role| | queryHashByOffset | |Any role| |queryHashByRequestID | |Any role| |queryHashSize | |Any role| | queryLedgers | |Any role| | queryRole | |Any role| | queryTransactionByHash | |Any role| | sendTransaction | |Any role| | setLogStage | |Any role| ### Contract access center role division There are two roles: CenterManager and NodeManager. CenterManager has permissions on cluster Settings. NodeManager can add and delete nodes. | 接口 | 说明 | 角色 | | ----------------------------- | ------------ | -------------------------- | |authNodeManager| | CenterManager; | |countActionLogByCategory| | CenterManager; | |countCMLogByCategory| | CenterManager; | |delete| | CenterManager; | |listAllUsers| | CenterManager; | |listApplyList| | CenterManager; | |listLicence| | CenterManager; | |queryActionLog| | CenterManager; | |queryCMLog| | CenterManager; | |updateLicence| | CenterManager; | |addNode| | CenterManager;NodeManager; | |changeNCFile| | CenterManager;NodeManager; | |changeOtherNC| | CenterManager;NodeManager; | |createTrustUnit| 创建可信集群 | CenterManager;NodeManager; | |deleteTrustUnit| | CenterManager;NodeManager; | |getNCFile| | CenterManager;NodeManager; | |getNodeTrustUnits| | CenterManager;NodeManager; | |getOtherNC| | CenterManager;NodeManager; | |listContractProcess | | CenterManager;NodeManager; | |listMultiPointContractProcess| | CenterManager;NodeManager; | |listNodes| | CenterManager;NodeManager; | |listTrustUnits| | CenterManager;NodeManager; | |queryUserStat| | CenterManager;NodeManager; | |stopMultiPointContractProcess| | CenterManager;NodeManager; | |applyRole| | NodeManager; | |executeContract | 调用合约 | 任意角色 | |executeContractTrustfully| | 任意角色 | |getManagerPubkey| | 任意角色 | |getNodeRole| | 任意角色 | |getNodeSessionID| | 任意角色 | |getRole| | 任意角色 | | getSessionID | | 任意角色 | | login | 登录 | 任意角色 | - - - ## Contract node Http interface `http://xxx.xxx.xxx.xxx:1717/SCIDE/SCManager` is the URL of the server that provides Http interface services( `xxx.xxx.xxx.xxx:1717` is the IP and port number of the BDWare SCIDE operation), the user can add field parameters after the URL, The following functions are complete: `http://xxx.xxx.xxx.xxx:18000/SCIDE/SCManager` is the server that provides Http interface services URL ( is the IP and port number of BDWare SCIDE operation), the user can complete the following functions by adding field parameters after the URL: ### User Management #### ping `ping` Server test ##### methods GET ##### parameter | 字段 | 值 | | ------ | ---- | |action| ping | ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=ping ``` ##### Result ```json {"data":"pong"} ``` ### Contract code management class #### Download Contract Item ##### methods GET ##### parameter | 字段 |value| | ----------- | ---------------- | | action | downloadContract | |projectName| 合约项目名 | |isPrivate| 是否在私有目录下 | | pubKey |The user’s public key| | timestamp |The time stamp| | sign |The signature| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=downloadContract&projectName=BDCoin&isPrivate=false&pubKey=0480204f4ef341359a5f64fcb11baf9ca2e6706ac20cba3 8b7ff78aa631e97346086e2d48fac2ba7f5b75ccbd19ebf495c0e6f9934d69e3b083da4d42e46c991e0c2ea8bb45d59f31f46d0ec700fb01f2fdd275 ``` #### Upload a file ##### methods POST ##### parameter | 字段 |value| | --------- | ---------------- | | path |File upload path| | fileName |File name to be uploaded| |isPrivate| 是否在私有目录下 | | order |The number of packets| | count |Total number of packets| | timestamp |The time stamp| | sign |The signature| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/Upload?path=/TEST/TEST.yjs&fileName=WechatIMG15.jpeg&isPrivate=true&order=0&count=3&pubKey=0480204f4ef341359a5f64fcb11baf9ca2e6706ac20cba36ca83066870cf2c1d5de6df67e24e68dde7934af9b31d94a6084281db3d32d5ce42ab8f75bf799aca05&sign=dd867469f5adf9986e4ea6215febeae50c7d4c3836d002cf8c17050dfca031fd2595ffa8646e9eeae53150d2cbaea690e27d818eaf5cea3632ee1b69c3307a4b631e97346086e2d48fac2ba7f5b75ccbd19ebf495c0e6f9934d69e3b083da4d42e46c991e0c2ea8bb45d59f31f46d0ec700fb01f2fdd275 ``` ##### Result ```json {"status":"true","data":"success"} ``` #### Save the contract script Send a request to the server to save the contract script content locally to the server. ##### methods GET ##### parameter | 字段 |value| | ------- | -------------- | | action | writeDyjs | |target| 合约脚本文件名 | | content |Contract Script Content| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=writeDyjs&target=testyjs.yjs&content=contract%20shortc%7B%0A%09export%20function%20main(arg)%7B%0A%09%09return%20arg.length%3B%09%0A%09%7D%0A%7D ``` ##### Result ```json { "status": false, "action": "onWriteDyjs", "data": "success" } ``` Subsequent users can start and invoke the contract. ### Contract instance management class #### Querying the contract process Sends a request to the server for all the contract processes that have been started on the server. ##### methods GET ##### parameter | 字段 |value| | ------ | ------------------- | | action | listContractProcess | ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=listContractProcess ``` ##### Result ```json { "status": false, "action": "onListContractProcess", "data": "[\n {\n \"id\": \"-562752842\",\n \"name\": \"shortc\",\n \"port\": \"1626\",\n \"times\": \"0 \",\n \"traffic\": \"32.00 B\",\n \"storage\": \"0.00 B\",\n \"contractStatus\": \"Ready\"\n }\n]" } ``` #### 启动合约 Send a request to the server to start a contract. ##### methods GET ##### parameter | 字段 |value| | ------ | --------------------------------- | | action |startContract| | script |Contract script content, need to do URIEncode| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=startContract&script=contract%20shortc%7B%0A%09export%20function%20main(arg)%7B%0A%09%09return%20arg.length%3B%09%0A%09%7D%0A%7D ``` ##### Result ```json { "data": "{\"status\":\"Success\",\"result\":\"\"}", "action": "onStartContract", "cid": "-562752842", "executeTime": 1187 } ``` #### 调用合约 Send a request to the server to invoke a contract. ##### methods GET ##### parameter | 字段 |value| | -------------------- | --------------------------- | | action | executeContract | |contractID |Contract ID| | withDynamicAnalysis |True /false Indicates whether to perform dynamic analysis| | operation |The name of the method that calls the contract| | arg |Call the parameters of the contract| | pubkey |Optionally, caller public key| | signature |Optional, sign| Pubkey is the public key of SM2. The calculation method is as follows: ```javascript //sm2 可从sm2.js中加载获得。 signature = sm2.doSignature(contractID+"|"+operation+"|"+arg+"|"+pubkey,privateKey); ``` ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=executeContract&contractID=-620602333&operation=main&arg=hhh ``` ##### Result ```json { "data": "{\"status\":\"Success\",\"result\":\"3\"}", "action": "onExecuteResult", "executeTime": "13" } ``` #### Bulk start contract Send a request to the server to start a series of contracts that hold the contract script in the server. ##### methods GET ##### parameter | 字段 |value| | -------- | ------------------------------------ | | action |startContractBatched| | fileList |List of contract script files (Json array,URLEncode)| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=startContractBatched&fileList=%5B%20%22EventPuber.yjs%22%2C%20%22EventSuber.yjs%22%2C%20%22LicenceManager.yjs%22%20%5D ``` ##### Result ```json {"EventPuber.yjs":"{\"status\":\"Success\",\"result\":\"\"}","LicenceManager.yjs":"{\"status\":\"Success\",\"result\":\"\"}","EventSuber.yjs":"{\"status\":\"Success\",\"result\":\"\"}","action":"onStartContract"} ``` #### Start the Zip package contract Send a request to the server to start the contract wrapped in the `zip` format in the server. ##### methods GET ##### parameter | 字段 |value| | --------- | ----------------------- | | action | startContractInTempZips | | owner |Caller’s public key| | path |Zip file name of the contract (path and)| | signature |Caller signature| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=startContractInTempZips&owner=0475c7b061f32477c1e228dd04143daf58a5574dc3f6b02bd2857cc794eb92bfe98606dc314049e77fd8714f57a5a481cb470cc759e688fe60d40fc87092165e55&path=traceTest.zip&signature=650d3cad50509682937c253d84da99230e8ea1bcfb9b10f6d18f8888c7c4b6b4%2C72231a6daa078a3ce657c0a2ed38251b7db56cf725beaf86780d4c240b19ccc2 ``` ##### Result ```json {"data":"verify failed","action":"onStartContract"} ``` #### Get the contract code Send a request to the server for the script code for an ID contract. ##### methods GET ##### parameter | 字段 |value| | ---------- | ----------- | | action | getCodeByID | | contractID | 合约ID | ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=getCodeByID&contractID=814046805 ``` ##### Result ```json {"status":true,"action":"onCodeResult","data":"@LogType(\"Arg\")\ncontract EventSuberAtCHQ{\n\t\n \texport function init(arg){\n\t\tvar result \u003d YancloudUtil.subscribe(\"EventPuberAt3966\",\"abc\",handler);\n // print(\"Handler:\"+handler);\n \t \n \t\treturn result;\n\t}\n \texport function handler(e){\n var ret \u003d \"ReceiveEvent:\";\n\t\tret+\u003d\"\\n\";\n \tprint(ret);\n \tret+\u003dYancloudUtil.executeContract(\"EventPuberAt3966\",\"notify\",\"success\");\n \tprint(ret);\n return ret;\n\t}\n}\n"} ``` #### Save contract status Send a request to the server to get the state transition log of the node server. ##### methods GET ##### parameter | 字段 |value| | ---------- | ------------ | | action | dumpContract | | contractID |Contract ID or contract Name=| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/SCManager?action=dumpContract&contractID=counter&pubKey=040461417efe01423ba603f71c689387e8aac4aa2a6f7cddfaf22c1d22c40222f7669a054e7ec2e8533b04ccbc7a0e6655ac4ae4acef81a2b1822ec6cabcaf6c1f&sign=3045022004ffd1346b936196f5b13953d2f3e11823a0d0a2d2f6fecea258cef8e20d99c0022100bbc219ed1f56799ba28a763b9e9e47063164e7ceecfbfa752de42f44551ffb83 ``` ##### Result ```json {"data":"success","size":"3.76 KB","time":"0.03s"} ``` #### Gets a list of contracted memory files Send a request to the server for a list of all memory files in a subfolder. ##### methods GET ##### parameter | 字段 |value| | ------ | --------------- | | action | listMemoryFiles | | contractID |Contract Id or contract Name| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/SCManager?action=listMemoryFiles&contractID=-247468535&pubKey=040461417efe01423ba603f71c689387e8aac4aa2a6f7cddfaf22c1d22c40222f7669a054e7ec2e8533b04ccbc7a0e6655ac4ae4acef81a2b1822ec6cabcaf6c1f&sign=3045022075c7268e888b0efdef167a3f4dfc6589d771c6be41b3c0a1dc12d057e811f395022100d44f460d0cc3643e169ef08231e75a1e895646c53295c0ef1d15c3b462a53d6b ``` ##### Result ```json {"data":["2020-09-23.18:40:38","2020-09-24.16:03:41","2020-09-24.16:58:39","2020-09-24.18:25:47","2020-09-24.18:32:37","2020-09-24.20:54:41","2020-09-24.20:57:39","2020-09-24.21:31:07","2020-09-24.21:32:09","2020-09-24.21:36:11","2020-09-28.15:29:15","2020-09-28.20:28:29","2020-09-28.20:39:46","2020-09-28.21:45:31","2020-09-28.21:49:18","2020-09-28.22:27:34","2020-09-28.22:31:09","2020-09-28.22:32:49","2020-10-07.16:51:06","2020-10-07.16:51:23","2020-10-25.21:09:10","2020-12-14.19:06:53","2021-02-02.10:28:56","2021-02-02.10:31:13"],"action":"onListMemoryFiles"} ``` #### To stop the contract Send a request to the server to stop a contract. ##### methods GET ##### parameter | 字段 |value| | ---------- | ------------------- | | action | killContractProcess | | id |Contract ID| | *requestID |Request ID, String type| `*` Indicates that the value is optional ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=killContractProcess&id=-1759263594 ``` ##### Result ```json {"status":false,"action":"onListContractProcess","data":"[\n {\n \"id\": \"-65051856\",\n \"name\": \"EventSuber\",\n \"port\": \"1631\",\n \"times\": \"0 \",\n \"traffic\": \"32.00 B\",\n \"storage\": \"0.00 B\",\n \"contractStatus\": \"Ready\"\n },\n {\n \"id\": \"814046805\",\n \"name\": \"EventSuberAtCHQ\",\n \"port\": \"1630\",\n \"times\": \"0 \",\n \"traffic\": \"32.00 B\",\n \"storage\": \"0.00 B\",\n \"contractStatus\": \"Ready\"\n },\n {\n \"id\": \"2023975189\",\n \"name\": \"LicenceService\",\n \"port\": \"1632\",\n \"times\": \"0 \",\n \"traffic\": \"32.00 B\",\n \"storage\": \"0.00 B\",\n \"contractStatus\": \"Ready\"\n },\n {\n \"id\": \"-620602333\",\n \"name\": \"shortc\",\n \"port\": \"1627\",\n \"times\": \"0 \",\n \"traffic\": \"0.00 B\",\n \"storage\": \"0.00 B\",\n \"contractStatus\": \"Ready\"\n }\n]"} ``` #### Termination of all contracts Send a request to the server to stop all contracts started on the server. ##### methods GET ##### parameter | 字段 |value| | ------ | --------------- | | action | killAllContract | ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=killAllContract ``` ##### Result ```json {"status":false,"action":"onKillAllContract","data":"Kill:7357,7541,7548,7555,7584,7585,7591,7598,7609,7612,8440,8442,8444,8521,"} ``` #### Static analysis contract Send a request to the server to statically analyze the contract script. ##### methods GET ##### parameter | 字段 |value| | ---------- | -------------------- | | action | staticVerifyContract | | contractid |Contract ID| | script |Request ID, String type| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=staticVerifyContract&contractid=943728900&script=contract%20shortc%7B%0A%09export%20function%20main(arg)%7B%0A%09%09return%20arg.length%3B%09%0A%09%7D%0A%7D&path=static.yjs ``` ##### Result ```json {"data":"{\"status\":\"Success\",\"result\":\"{\\\"main\\\":\\\"Ret:arg \\\"}\"}","action":"onExecuteResult","cid":"943728900","executeTime":54} ``` #### Gets the contract static analysis flow Send a request to the server for a static analysis Control Flow of a contract. ##### methods GET ##### parameter | 字段 |value| | ------ | ------------------------ | | action | getControlFlowByFileName | | path |Contract ID| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=getControlFlowByFileName&path=EventSuber.yjs ``` ##### Result ```json {"init":{"blocks":[{"type":"Continuous","name":"B0","stmts":["\u003dL0\u003d","aload 0","invokevirtual wrp/jdk/nashorn/internal/runtime/ScriptFunction getScope ()Lwrp/jdk/nashorn/internal/runtime/ScriptObject;"],"original":""},{"type":"Continuous","name":"B1","stmts":["\u003dL1\u003d","astore 4"],"original":""},{"type":"Continuous","name":"B2","stmts":["\u003dL2\u003d","aload 4","invokedynamic dyn:getProp|getElem|getMethod:YancloudUtil (Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 5 "],"original":"\t\tvar result \u003d YancloudUtil.subscribe(\"XiaomiSmartHomeAtPKU\",\"onAirPurifierModeChange\",handler);"},{"type":"Continuous","name":"B3","stmts":["dup","invokedynamic dyn:getMethod|getProp|getElem:subscribe (Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 0 "],"original":"\t\tvar result \u003d YancloudUtil.subscribe(\"XiaomiSmartHomeAtPKU\",\"onAirPurifierModeChange\",handler);"},{"type":"Continuous","name":"B4","stmts":["swap","ldc XiaomiSmartHomeAtPKU","ldc onAirPurifierModeChange","aload 4","invokedynamic dyn:getProp|getElem|getMethod:handler (Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 5 "],"original":"\t\tvar result \u003d YancloudUtil.subscribe(\"XiaomiSmartHomeAtPKU\",\"onAirPurifierModeChange\",handler);"},{"type":"Continuous","name":"B5","stmts":["invokedynamic dyn:call:\\\u003dYancloudUtil\\,subscribe (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 0 "],"original":"\t\tvar result \u003d YancloudUtil.subscribe(\"XiaomiSmartHomeAtPKU\",\"onAirPurifierModeChange\",handler);"},{"type":"Continuous","name":"B6","stmts":["\u003dL3\u003d","astore 5"],"original":"\t\tvar result \u003d YancloudUtil.subscribe(\"XiaomiSmartHomeAtPKU\",\"onAirPurifierModeChange\",handler);"},{"type":"Continuous","name":"B7","stmts":["\u003dL4\u003d","aload 5","areturn"],"original":" \t\treturn result;"},{"type":"Continuous","name":"B8","stmts":["\u003dL5\u003d"],"original":" \t\treturn result;"},{"type":"Continuous","name":"B9","stmts":["\u003dL6\u003d"],"original":" \t\treturn result;"}],"edges":[{"from":"B0","to":"B1","label":{"label":"e"}},{"from":"B1","to":"B2","label":{"label":"e"}},{"from":"B2","to":"B3","label":{"label":"e"}},{"from":"B3","to":"B4","label":{"label":"e"}},{"from":"B4","to":"B5","label":{"label":"e"}},{"from":"B5","to":"B6","label":{"label":"e"}},{"from":"B6","to":"B7","label":{"label":"e"}},{"from":"B7","to":"B9","label":{"label":"e"}}]},"handler":{"blocks":[{"type":"Continuous","name":"B0","stmts":["\u003dL0\u003d","aload 0","invokevirtual wrp/jdk/nashorn/internal/runtime/ScriptFunction getScope ()Lwrp/jdk/nashorn/internal/runtime/ScriptObject;"],"original":""},{"type":"Continuous","name":"B1","stmts":["\u003dL1\u003d","astore 4"],"original":""},{"type":"Continuous","name":"B2","stmts":["\u003dL2\u003d","ldc ReceiveEvent:","aload 2","invokedynamic dyn:getProp|getElem|getMethod:content (Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 0 "],"original":" var ret \u003d \"ReceiveEvent:\"+e.content+\" \"+e.type;"},{"type":"Continuous","name":"B3","stmts":["invokestatic wrp/jdk/nashorn/internal/runtime/ScriptRuntime ADD (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"],"original":" var ret \u003d \"ReceiveEvent:\"+e.content+\" \"+e.type;"},{"type":"Continuous","name":"B4","stmts":["ldc ","invokestatic wrp/jdk/nashorn/internal/runtime/ScriptRuntime ADD (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"],"original":" var ret \u003d \"ReceiveEvent:\"+e.content+\" \"+e.type;"},{"type":"Continuous","name":"B5","stmts":["aload 2","invokedynamic dyn:getProp|getElem|getMethod:type (Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 0 "],"original":" var ret \u003d \"ReceiveEvent:\"+e.content+\" \"+e.type;"},{"type":"Continuous","name":"B6","stmts":["invokestatic wrp/jdk/nashorn/internal/runtime/ScriptRuntime ADD (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"],"original":" var ret \u003d \"ReceiveEvent:\"+e.content+\" \"+e.type;"},{"type":"Continuous","name":"B7","stmts":["\u003dL3\u003d","astore 5"],"original":" var ret \u003d \"ReceiveEvent:\"+e.content+\" \"+e.type;"},{"type":"Continuous","name":"B8","stmts":["\u003dL4\u003d","aload 4","invokedynamic dyn:getMethod|getProp|getElem:print (Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 5 "],"original":" \tprint(ret);"},{"type":"Continuous","name":"B9","stmts":["getstatic wrp/jdk/nashorn/internal/runtime/ScriptRuntime UNDEFINED Lwrp/jdk/nashorn/internal/runtime/Undefined;","aload 5","invokedynamic dyn:call:print (Ljava/lang/Object;Lwrp/jdk/nashorn/internal/runtime/Undefined;Ljava/lang/Object;)Ljava/lang/Object; HANDLE:wrp/jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite; (6) 5 "],"original":" \tprint(ret);"},{"type":"Continuous","name":"B10","stmts":["pop"],"original":" \tprint(ret);"},{"type":"Continuous","name":"B11","stmts":["\u003dL5\u003d","aload 5","areturn"],"original":" return ret;"},{"type":"Continuous","name":"B12","stmts":["\u003dL6\u003d"],"original":" return ret;"},{"type":"Continuous","name":"B13","stmts":["\u003dL7\u003d"],"original":" return ret;"}],"edges":[{"from":"B0","to":"B1","label":{"label":"e"}},{"from":"B1","to":"B2","label":{"label":"e"}},{"from":"B2","to":"B3","label":{"label":"e"}},{"from":"B3","to":"B4","label":{"label":"e"}},{"from":"B4","to":"B5","label":{"label":"e"}},{"from":"B5","to":"B6","label":{"label":"e"}},{"from":"B6","to":"B7","label":{"label":"e"}},{"from":"B7","to":"B8","label":{"label":"e"}},{"from":"B8","to":"B9","label":{"label":"e"}},{"from":"B9","to":"B10","label":{"label":"e"}},{"from":"B10","to":"B11","label":{"label":"e"}},{"from":"B11","to":"B13","label":{"label":"e"}}]}} ``` ### Log Viewing Class #### Contract log — Number of queries ##### methods GET WhencontractNameis empty or not passed in, the number of items queried for the entire contract ##### parameter | 字段 |value| | ------------ | ------------------------ | | action | queryContractLogSize | |contractName| 字符串,非必须,合约名称 | ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogSize&contractName=NanningDataSource ``` ##### Result ```json { "size": 12, "action": "onQueryContractLogSize", "status": "success" } ``` #### Contract log — Query by date ##### methods GET ##### parameter | 字段 |value| | ------------ | ------------------------------------- | | action |queryContractLogByDate| | start |Long, must, start time| | end |Long, not required. If end is not used, the current time is default| | contractName |String, not required, contract name| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogByDate&start=1597296300272&end=1597296305747 ``` ##### Returns the result ```json { "data": [ { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "getMainFrame", "costTime": "2493", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296300272, "key": "-8590335427581967208" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "loadResource", "costTime": "732", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296301030, "key": "849660532962309239" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "loadResource", "costTime": "4580", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305745, "key": "-8003529429500512736" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "loadResource", "costTime": "4551", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305746, "key": "7604666709899222357" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "loadResource", "costTime": "6", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305751, "key": "-7561786202695627022" } ], "action": "onQueryRecentContractLog" } ``` #### Contract log — Queried by offset ##### methods GET ##### parameter | 字段 |value| | ------------ | --------------------------------------------- | | action |queryContractLogByOffset| | count |Long: required. Gets the number of logs| | offset |Long, not required. If there is no offset, the latest count bar is returned by default| | contractName |String, not required, contract name| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogByOffset&count=5&contractName=NanningDataSource ``` ##### Returns the result ```json { "data": [ { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "loadResource", "costTime": "4", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305842, "key": "-2390672423847654148" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "isOwner", "costTime": "4", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305868, "key": "6056586201629372511" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "getApplyList", "costTime": "6", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305893, "key": "3882409580676458151" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "getAcceptList", "costTime": "4", "totalGas": "0", "executionGas": "0", "extraGas": "0", "date": 1597296305908, "key": "-3437513873417136535" }, { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "analysisByIndustry", "costTime": "6", "totalGas": "0", "executionGas": "0", "extraGas": "0", "signature": "4c2cef1756b2b591ab7eead19d67331e2294c7ba765c72298733c306ada0b6e84afbb6c7b9dba48b9843236ebe67aecb4af09fe58a51eef0e2e89b9f3e5cad02", "arg": " {\"year\":2018,\"category\":\"工业\",\"indexType\":\"营业额\"}", "date": 1597296314654, "key": "203156239086062402" } ], "action": "onQueryRecentContractLog" } ``` #### Contract log — Query by key ##### methods GET ##### parameter | 字段 |value| | ------ | --------------------------- | | action | queryContractLogByKey | | key |Long: Must, the key corresponding to the log| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogByKey&key=203156239086062402 ``` ##### Returns the result ```json { "data": { "action": "executeContract", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "contractID": "-1382208250", "contractName": "NanningDataSource", "function": "analysisByIndustry", "costTime": "6", "totalGas": "0", "executionGas": "0", "extraGas": "0", "signature": "4c2cef1756b2b591ab7eead19d67331e2294c7ba765c72298733c306ada0b6e84afbb6c7b9dba48b9843236ebe67aecb4af09fe58a51eef0e2e89b9f3e5cad02", "arg": " {\"year\":2018,\"category\":\"工业\",\"indexType\":\"营业额\"}", "date": 1597296314654 }, "action": "onQueryContractLogByKey" } ``` #### Contract log — Counts the number of calls by time period ##### methods GET ##### parameter | 字段 |value| | -------- | -------------------------------------------------------- | | action |countContractLogGroupByCategory| | start |Long, must, start time| | end |Not required. End time. Default is current| | interval |Long, not necessary, statistical interval| | category |If not required, the contract name is concatenated with a comma, and all contract calls are counted when not passed in| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=countContractLogGroupByCategory&start=1596758400000&interval=86400000 ``` ##### Returns the result ```json { "start": 1596758400000, "interval": 86400000, "action": "onCountContractLogGroupByCategory", "data": [ 0, 0, 0, 0, 0, 0, 43, 14 ] } ``` #### Ledger log — Number of queries Query the number of logs recorded in the ledger of the node ##### methods GET ##### parameter | 字段 |value| | ------------ | ---------------- | | action | queryHashSize | | contractName | 非必须,合约名称 | ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryHashSize&contractName=NanningDataSource ``` ##### Returns the result ```json { "count": "2", "action": "onQueryHashSize" } ``` #### Ledger log — Query by offset Query the hash list of x logs that pass this node to the ledger ##### methods GET ##### parameter | 字段 |value| | ------------ | ----------------------------------------------------------- | | action |queryHashByOffset| | count |Integer, mandatory, indicates the number of items| | offset |An integer, not required, representing an offset. If offset is not passed, the latest count bar is returned by default| | contractName |A character string, not required, indicating the contract name| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryHashByOffset&count=1&contractName=NanningDataSource ``` ##### Returns the result ```json { "data": [ { "hash": "3a6c60621907146b77146c1f2d48700e47520173", "date": 1597296314658 } ], "action": "onQueryHash", "status": "success" } ``` #### Ledger log — Query details based on hash Query log content based on hash ##### methods GET ##### parameter | 字段 |value| | ------ | ------------------------------- | | action | queryDataByHash | | hash |String, available by queryHashByOffset| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryDataByHash&count=1&contractName=NanningDataSource&hash=3a6c60621907146b77146c1f2d48700e47520173 ``` ##### Returns the result ```json { "from": "0x3034643139323433323966373263656431343866", "to": "0x65786563757465436f6e74726163740000000000", "data": "1597296314655 --> {\"extraGas\":\"0\",\"totalGas\":\"0\",\"executionGas\":\"0\",\"signature\":\"4c2cef1756b2b591ab7eead19d67331e2294c7ba765c72298733c306ada0b6e84afbb6c7b9dba48b9843236ebe67aecb4af09fe58a51eef0e2e89b9f3e5cad02\",\"costTime\":\"6\",\"arg\":\" {\\\\\\\"year\\\\\\\":2018,\\\\\\\"category\\\\\\\":\\\\\\\"工业\\\\\\\",\\\\\\\"indexType\\\\\\\":\\\\\\\"营业额\\\\\\\"}\",\"contractID\":\"-1382208250\",\"action\":\"analysisByIndustry\",\"pubKey\":\"04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd\"}", "requestID": "1597296314629_6067", "action": "onQueryDataByHash" } ``` #### Ledger log — Queries the Hash according to requestID Query log contents by requestID. The developer must ensure the uniqueness of requestID ##### methods GET ##### parameter | 字段 |value| | --------- | ------------------------ | | action | queryHashByRequestID | | requestID |A string that is generated when the call is made| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=queryHashByRequestID&requestID=0987654321ab ``` #### Node Logs — Number of queries ##### methods GET ##### parameter | 字段 |value| | -------- | ---------------------------- | | action | queryNodeLogSize | | category |Not required, not passed in to query the full situation| The options include ping, startContract, and saveFile. ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogSize http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogSize&category=login ``` ##### Returns the result ```json { "size": 177, "action": "onQueryNodeLogSize", "status": "success" } ``` #### Node logs — Query by date ##### methods GET ##### parameter | 字段 |value| | -------- | ---------------------------- | | action | queryNodeLogByDate | | start |Long, must, start date| | end |Long, not necessary| | category |Not required, not passed in to query the full situation| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogByDate&start=1597376006441 http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogByDate&start=1596758400000&category=login ``` ##### Returns the result ```json { "data": [ { "action": "listAllAuthRole", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006438, "key": "387355870552374748" }, { "action": "listUnAuthRole", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006441, "key": "4772693258708933626" }, { "action": "countRole", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006444, "key": "-6425375229108830572" }, { "action": "loadNodeConfig", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006448, "key": "-6602401010405792959" }, { "action": "getPeerID", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006449, "key": "-7006776427870311552" } ], "action": "onQueryNodeLogByDate" } ``` #### Node log — Query by offset ##### methods GET ##### parameter | 字段 |value| | ------------ | --------------------------------------------- | | action |queryNodeLogByOffset| | count |Long: required. Gets the number of logs| | offset |Long, not required. If there is no offset, the latest count bar is returned by default| | contractName |String, not required, contract name| ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogByOffset&count=5 ``` ##### Returns the result ```json { "data": [ { "action": "listAllAuthRole", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006438, "key": "387355870552374748" }, { "action": "listUnAuthRole", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006441, "key": "4772693258708933626" }, { "action": "countRole", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006444, "key": "-6425375229108830572" }, { "action": "loadNodeConfig", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006448, "key": "-6602401010405792959" }, { "action": "getPeerID", "pubKey": "04d1924329f72ced148f6f333fb985ccbaa31b1e3aacf10be5f43d4a4ff5ad88899a005e79e37fc06993e1d66ada8cf8b711cb36f59538bb7d3e39e70fa9360ddd", "status": "accept", "date": 1597376006449, "key": "-7006776427870311552" } ], "action": "onQueryNodeLogByOffset" } ``` #### Node Log — Collects statistics on invocation times by time range ##### methods GET ##### parameter | 字段 |value| | -------- | -------------------------------------------------- | | action |countLogGroupByCategory| | start |Long, must, start time| | end |Not required. End time. Default is current| | interval |Long, not necessary, statistical interval| | category |Action is concatenated with commas if not required, and counts all calls when not passed| In the category, Action is the action collection of the NodePortal interface. The value can be ping, startContract, and saveFile. ##### Sample request ``` http://127.0.0.1:18000/SCIDE/CMManager?action=countNodeLogGroupByCategory&start=1596758400000&interval=86400000 http://127.0.0.1:18000/SCIDE/CMManager?action=countNodeLogGroupByCategory&start=1596758400000&interval=86400000&category=ping,startContract ``` ##### Returns the result ```json { "start": 1596758400000, "interval": 86400000, "action": "onCountNodeLogGroupByCategory", "data": [ 0, 0, 0, 0, 0, 0, 912, 761 ] } ``` #### Example Output historical logs Send a request to the server for the TimeTravel log of the contract on the node server. ##### methods GET ##### parameter | 字段 |value| | ------ | ------------------ | | action |printTimeTravelLog| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=printTimeTravelLog ``` ##### Result ```json {"status":false,"data":"[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps/aa\n[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps/aa_1572335939893.dyjs\n[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps/memoryDumps\n[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps\n[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps\n[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps/.\n[CMActions] memory dir \u003d /Users/oliveds/docs/SmartContract/contractExamples/memoryDumps/.\n"} ``` #### Example Output node transfer logs Send a request to the server to get the state transition log of the node server. ##### methods GET ##### parameter | 字段 |value| | ------ | ---------------- | | action |printTransferLog| ##### Sample request ``` http://127.0.0.1:1717/SCIDE/SCManager?action=printTransferLog ``` ##### Result ```json {"status":false,"data":""} ``` ### Template generation class ## The ledger Http interface ``` {.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](https://tools.ietf.org/html/rfc4648#section-4). > **Note** > > When using hash strings in URL, they need to be encoded with > [encodeURIComponent](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent). ### Ledger information class #### Node.ClientVersion{#_node_clientversion} Get BDLedger node version GET http://{{IP}}:{{PORT}}/v0/node/version ##### Return the sample ``` {.json} { "version": "dev-210119.a88bf4eb" } ``` #### Ledger.CreateLedger{#_ledger_createledger} Create a new ledger POST http://{{IP}}:{{PORT}}/v0/ledgers ##### Sample request ``` {.json} { "name": "test" } ``` ##### Return the sample ``` {.json} { "ok": true } ``` #### Ledger.GetLedgers{#_ledger_getledgers} Get all ledgers GET http://{{IP}}:{{PORT}}/v0/ledgers ##### Return the sample ``` {.json} { "ledgers": [ "default", "test" ] } ``` #### Ledger.SendTransaction{#_ledger_sendtransaction} Send a new transaction POST http://{{IP}}:{{PORT}}/v0/ledgers/test/transactions ##### Sample request ``` {.json} { "transaction": { "type": 0, "from": "8A3K/vANyv7wDcr+8A3K/vANyv4=", "nonce": 52, "data": "lQItWZKS5hlUn6V/DMKKwvZXxvM=" } } ``` ##### Return the sample ``` {.json} { "hash": "VQBeA5Ee0Y5hqEileoQuYMHbOSE=" } ``` ### Query classes #### 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](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) ##### Return the sample ``` {.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 ``` {.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, orasciimath:\[\“end\_timestamp\”-\“start\_timestamp\”\>\“query.maxDuration\”\],then **end\_timestamp** will be set toasciimath:\[\“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 thegenesis block’s timestamp, and **end\_timestamp** will never be laterthan the current timestamp when the node process the query request. ##### Sample request ``` {.json} { "start_timestamp": 1611038000, "end_timestamp": 1611039000, "include_transactions": 0 } ``` ##### Return the sample ``` {.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" } ``` ##### Request Example 2 ``` {.json} { "start_timestamp": 1611038000, "end_timestamp": 1611039000, "include_transactions": 1 } ``` ##### Return to Example 2 ``` {.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.** ``` {.json} { "start_timestamp": 1611038000, "end_timestamp": 1611039000, "include_transactions": 2 } ``` **Response 3.** ``` {.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 withtimestamps later than **start\_timestamp**. If only **start\_timestamp** is not specified, then count all blockswith timestamps earlier than **end\_timestamp**. In all cases, **start\_timestamp** will never be earlier than thegenesis block’s timestamp, and **end\_timestamp** will never be laterthan the current timestamp when the node process the query request. ##### Sample request ``` {.json} {} ``` ##### Return the sample ``` {.json} { "count": "5", "startTimestamp": "0", "endTimestamp": "1611039957" } ``` ##### Request Example 2 ``` {.json} { "start_timestamp": 1611038000, "end_timestamp": 1611039000 } ``` ##### Return to Example 2 ``` {.json} { "count": "1", "startTimestamp": "1611038000", "endTimestamp": "1611039000" } ``` #### Query.GetRecentBlocks{#_query_getrecentblocks} Get recent **count** blocks (Only support IncludeTransactions=NONE fornow) GET http://{{IP}}:{{PORT}}/v0/ledgers/test/blocks/recent?count=2 ##### Return the sample ``` {.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](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) #### Return the sample ``` {.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 itsindex 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](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) #### Return the sample ``` {.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 requirementsand rules as in [???](#Query.GetBlocks). ##### Sample request ``` {.json} { "start_timestamp": 1611038000, "end_timestamp": 1611039000 } ``` ##### Return the sample ``` {.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 requirementsand rules as in [???](#Query.CountBlocks). ##### Sample request ``` {.json} {} ``` ##### Return the sample ``` {.json} { "count": "4", "startTimestamp": "0", "endTimestamp": "1611039957" } ``` ##### Request Example 2 ``` {.json} { "start_timestamp": 1611038000, "end_timestamp": 1611039000 } ``` ##### Return to Example 2 ``` {.json} { "count": "1", "startTimestamp": "1611038000", "endTimestamp": "1611039000" } ``` - - - ## Contract node WebSocket interface ### User Management #### Access to the Session Before login, obtain the session for signing. ##### parameter |field|value| | ------ | ------------ | |action|getSessionID| ##### Sample request ``` var req = {}; req.action = "getSessionID"; wssocket.send(JSON.stringify(req)); ``` ##### Returns the result ```json { "action": "onSessionID", "session": "9782323_session" } ``` #### The user login The user performs public-private key authentication ##### parameter |field| 值 | | ------ | ----- | |action| login | ##### Sample request ``` var loginParam = {}; loginParam.pubKey = global.sm2Key.publicKey; loginParam.signature = sm2.doSignature(global.session, global.sm2Key.privateKey); loginParam.action = "login"; wssocket.send(JSON.stringify(loginParam)); ``` ##### Returns the result ```json { "action": "onLogin", "data": "NodeManager,ContractProvider" } ``` #### Apply for role In the node administrator interface, you can apply for the names contract administrator, ContractUser, ContractProvider. ##### parameter | 字段 |value| | ------ | ------------- | | action |applyNodeRole| |role|Applying for a Role Name| ##### Sample request ``` var param = {}; param.action = "applyNodeRole"; param.role = "ContractUser"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ``` json { "action": "onApplyRole", "data": "success" } { "action":"onApplyRole", "data":"already has!" } ``` #### Authorization role ##### parameter | 字段 |value| | -------- | -------------------- | | action |authNodeRole| | isAccept |Bool: indicates no authorization| | pubKey |Authorized user public key| ##### Sample request ``` var param = {}; param.action = "authNodeRole"; param.isAccept = true; param.pubKey = "xxxxx"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "action": "onAuthNodeRole", "data": "success" } ``` #### Deleting a User Role ##### parameter | 字段 |value| | ------ | ---------- | | action |deleteRole| | role |Deleting a Role Name| ##### Sample request ``` var deleteInfo = {}; deleteInfo.pubKey = global.authorizedUsers.[publicKey]; deleteInfo.action = "deleteRole"; deleteInfo.role="ContractUser"; wssocket.send(JSON.stringify(deleteInfo)); ``` ##### Returns the result ```json { "action": "onDeleteRole", "data": "success" } ``` #### View the list of authorized users View authorized node administrators in the current network ##### parameter | 字段 |value| | ------ | --------------- | | action |listAllAuthRole| ##### Sample request ``` var param = {}; param.action = "listAllAuthRole"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status":false, "action":"onListAllAuthRole", "data": { "kv":[{"key":"04eafad549d0757cf67f360815e15e157c7428c9ea9fb933f31a5d45bfb6edd9809c5bf6a5f37d7b817207f19fb2d76b7dbdefe38084cd3282e37b9ac39959dfab", "value":"NodeManager,ContractProvider,ContractUser,ContractInstanceManager"}], "time":[{"key":"04eafad549d0757cf67f360815e15e157c7428c9ea9fb933f31a5d45bfb6edd9809c5bf6a5f37d7b817207f19fb2d76b7dbdefe38084cd3282e37b9ac39959dfab", "value":"1617178709933"}] } } ``` #### View the list of applied users ##### parameter | 字段 |value| | ------ | -------------- | | action |listUnAuthRole| ##### Sample request ``` var param = {}; param.action = "listUnAuthRole"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "action": "onListUnAuthRole", "kv": [{ "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7", "value": "ContractProvider,ContractUser" }], "time": [{ "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7", "value": "1587398989914" }] } ``` ##### Parameter (delete) | 字段 |value| | ------ | ------------- | | action |queryUserStat| ##### Sample request ``` var param = {}; param.action = "queryUserStat"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "action": "onQueryUserStat", "userListCount": 3, "applyListCount":0 } ``` ### Contract code management class #### Gets a list of public contract files ##### parameter | 字段 |value| | ------ | ------------ | | action |listProjects| ##### Sample request ``` var request = {}; request.action = "listProjects"; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onListProjects", "data":"[\"AnnotationSample\",\"AppDataAnalysis\",\"AppDataSource\",\"BiddingExample\",\"ContractExecutor\"]", "executeTime":0, "isPrivate":false } ``` #### Gets a list of private contract files ##### parameter | 字段 |value| | ------ | -------------------- | | action |listProjects| | pubKey |The public key of the user| |isPrivate|true| ##### Sample request ```javascript var request = {}; request.action = "listProjects"; request.pubKey = "global.sm2.publicKey"; request.isPrivate=true; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onListProjects", "data":"[\"CSVFromTemplate\",\"Empty22\",\"MySQLFromTemplate\",\"test\"]", "executeTime":0, "isPrivate":true } ``` #### Get the contract instance ##### parameter | 字段 |value| | ------ | ------------------- | | action |listContractProcess| ##### Sample request ``` var request = {}; request.action = "listContractProcess"; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "status":false, "action":"onListContractProcess", "data":"[{\"id\": \"1658407837\",\"name\": \"BDCoin\",\"port\": \"1617\"}]" } ``` #### Start the contract ##### parameter | 字段 |value| | --------- | ------------- | | action |startContract| | owner |pubkey| |requestID| 当前时间 | |script| 脚本内容 | | signature |The signature| ##### Sample request ``` request.action = "startContract"; request.owner = global.sm2Key.publicKey; request.requestID = new Date().getTime() + ""; request.script = global.projectScript; request.signature = sm2.doSignature("Algorithm|" + request.script + "|" + global.sm2Key.publicKey, global.sm2Key.privateKey); wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "data":"{\"needSeq\":false,\"seq\":0,\"status\":\"Success\",\"result\":\"\",\"isInsnLimit\":false,\"totalGas\":0,\"executionGas\":0,\"extraGas\":0,\"size\":0,\"eventRelated\":false}", "action":"onStartContract", "cid":"-506393888", "executeTime":2496, "responseID":"1617206735696" } ``` #### Start the trusted cluster contract ##### parameter | 字段 |value| | --------- | ------------------------------------ | | action |startContractP2PTrustfully| | owner |pubkey| | isPrivate |The current time| |path |Path where the script resides| | signature |The signature| | peersID |An array of peerids of nodes in the trusted execution cluster| | | | ##### Sample request ```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)); ``` ##### Returns the result ```json { "data":"{\"status\":\"Success\",\"result\":\"\"}", "action":"onStartContractP2PTrustfully", "cid":"-1543583350", "executeTime":1544 } ``` #### Distribution of contract items ##### parameter | 字段 |value| | ------------- | ------------------ | |action |distributeContract| |peersID| 集群中节点peer | | projectName |The contract of| |isPrivate| 是否在私有目录 | | sponsorPeerID |The originators of the ID| | signature |The signature| ##### Sample request ```javascript request.action = "distributeContract"; request.peersID = peersID; request.projectName = global.projects[global.lastClickedProjectId]; request.isPrivate = $("#privateDir-tab").hasClass("active"); request.sponsorPeerID = global.peerID; request.signature = sm2.doSignature("DistributeContract|" + request.projectName + "|" + global.sm2Key.publicKey, global.sm2Key.privateKey); wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onDistributeContract", "progress":"100.00%" } ``` #### Terminate the contract ##### parameter | 字段 |value| | --------- | ------------------- | | action |killContractProcess| | id |Contract id| | requestID |Request ID| ##### Sample request ``` request.action = "killContractProcess"; request.id = contractid; request.requestID = new Date().getTime() + ""; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "data": "ContractHandler: exit in 3 seconds!", "action": "onOutputStream" } ``` #### Termination of all contracts ##### parameter | 字段 |value| | ------ | --------------- | | action |killAllContract| ##### Sample request ``` request.action = "killAllContract"; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "status":false, "action":"onKillAllContract", "data":"Kill:7241,7245," } ``` #### Static analysis contract ##### parameter | 字段 |value| | ---------- | -------------------- | | action |staticVerifyContract| | owner |User private key| | isPartial |Is it part of| | contractid |contractid| | script |The script content| | path |Name of contract| ##### Sample request ```javascript request.action = "staticVerifyContract"; request.owner = global.sm2Key.privateKey request.isPartial = false; request.contractid = contractid; request.script = global.projectScript; request.path = global.projectName; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "data":"{\"needSeq\":false,\"seq\":0,\"status\":\"Success\",\"result\":{\"hello\":\"Ret:\"},\"isInsnLimit\":false,\"totalGas\":0,\"executionGas\":0,\"extraGas\":0,\"size\":0,\"eventRelated\":false}", "action":"onStaticVerifyResult", "cid":"verify", "executeTime":83 } ``` #### Delete the contract ##### parameter | 字段 |value| | ------ | ---------- | | action |deleteFile| | file |fileName| ##### Sample request ```javascript request.action = "deleteFile"; request.file = fileName; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onDeleteFile", "data":"success", "executeTime":0 } ``` #### Private contracts are uploaded to public directories ##### parameter | 字段 |value| | -------- | ------------ | | action |changePublic| |pubkey| 用户公钥 | | fileName |fileName| ##### Sample request ```javascript request.action = "changePublic"; request.pubkey = pubkey; request.fileName = fileName; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onChangePublic", "data":"success", "executeTime":0 } ``` #### Upload the contract ##### parameter | 字段 |value| | -------- | ----------- | | action |UploadFile| | isAppend | false | |fileName|fileName| | path | path | |isPrivate|true/false| | content |The fileContent (base64 encoding)| ##### Sample request ``` request.action = "uploadFile"; request.isAppend = false; request.fileName = "test1.yjs"; request.path = "test1"; text="Y29udHJhY3QgdGVzdDF7CglleHBvcnQgZnVuY3Rpb24gaGVsbG8oYXJnKXsgCiAgICAgICAgcmV0dXJuICJ3b3JsZCI7ICAKICAgIH0gICAKfQ==" request.content = text; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onUploadFile", "data":"success", "executeTime":0 } ``` #### Compile the contract ##### parameter | 字段 |value| | ---------- | -------------------------- | | action |compile| | path |String indicates the name of the project to be compiled| | privateTab |Bool, indicates whether the item is a private directory| ##### Sample request ```javascript var req = {"action":"compile","path":"Hello","privateTab":true} ``` ##### Returns the result ```json {"result":"Hello_2020-08-17-09:09:40.ypk","action":"onCompile"} ``` #### Locking private directories Lock the private directory editing function for a user ##### parameter | 字段 |value| | ------ | ---------------------- | | action |lockEdit| | pubKey |String Indicates the public key to be locked| ##### Sample request ```javascript var req = {}; req.action = "lockEdit"; req.pubKey = "xxxxxx"; wssocket.send(JSON.stringify(req)); ``` ```json { "action":"onLockEdit", "status":"success", "data":"04c4c855862b53f323e077ccfcc744ecc2c0a04645ed16d99ede8fd5866b38c0670a97ad22c6260d1a4672aba2a5fe229a2d4eba34627c054aab102620afa288c1" } ``` #### Unlock a private directory Unlock the private directory editing function for a user ##### parameter | 字段 |value| | ------ | ---------------------- | | action |unLockEdit| | pubKey |String Indicates the public key to be locked| ##### Sample request ```javascript var req = {}; req.action = unlockEdit; req.pubKey = "xxxxxx"; wssocket.send(JSON.stringify(req)); ``` ```json { "action":"onUnlockEdit", "status":"success", "data":"04c4c855862b53f323e077ccfcc744ecc2c0a04645ed16d99ede8fd5866b38c0670a97ad22c6260d1a4672aba2a5fe229a2d4eba34627c054aab102620afa288c1" } ``` ### Contract instance management class #### Querying the contract process Sends a request to the server for all the contract processes that have been started on the server. ##### parameter | 字段 |value| | ------ | ------------------- | | action |listContractProcess| ##### Sample request ```javascript var request = {}; request.action = "listContractProcess"; wssocket.send(JSON.stringify(request)); ``` ##### Result ```json { "status": false, "action": "onListContractProcess", "data": "[...]" } ``` #### Call the contract Send a request to the server to invoke a contract. ##### parameter | 字段 |value| | -------------------- | --------------------------- | | action |executeContract| | contractID |Contract ID| | withDynamicAnalysis |True /false Specifies whether to perform dynamic analysis. This parameter is optional| |operation| 调用合约的方法名 | |arg| 调用合约的parameter | | pubkey |Caller public key, optional| | signature |Caller signature, optional| `*` Indicates that the parameter is optional ```javascript //sm2 可从sm2.js中加载获得。 signature = sm2.doSignature(contractID+"|"+operation+"|"+arg+"|"+pubkey,privateKey); ``` ##### Sample request ```javascript var request = {}; request.action = "executeContract"; request.contractID = "2073401446"; request.operation = "main"; request.arg = "hhhhh"; wssocket.send(JSON.stringify(request)); ``` ##### Result ```json { "needSeq":false, "seq":0, "status":"Success", "result":"world", "isInsnLimit":false, "totalGas":0, "executionGas":0, "extraGas":0, "size":0, "eventRelated":false, "responseID":"1617211077264_223", "action":"onExecuteResult", "executeTime":"5" } ``` #### Output history log (delete) Send a request to the server for the TimeTravel log of the contract on the node server. ##### parameter | 字段 |value| | ------ | ------------------ | | action |printTimeTravelLog| ##### Sample request ```javascript var request = {}; request.action = "printTimeTravelLog"; wssocket.send(JSON.stringify(request)); ``` ##### Result ```json { "status": false, "data": "[CMActions] dumpContract :…t/contractExamples/memoryDumps/LicenceManager\n" } ``` #### Outputting node transition logs (delete) Send a request to the server to get the state transition log of the node server. ##### parameter | 字段 |value| | ------ | ---------------- | | action |printTransferLog| ##### Sample request ```javascript var request = {}; request.action = "printTransferLog"; wssocket.send(JSON.stringify(request)); ``` ##### Result ```json { "status": false, "data": "" } ``` #### Contract status migration Send a request to the server to get the state transition log of the node server. ##### parameter | 字段 |value| | ------------ | ------------ | | action | loadMemory | |contractName| 合约名称 | |memoryFile| 合约文件名称 | ##### Sample request ```javascript var request = {}; request.action = "loadMemory"; request.contractName = "JsonContract"; request.memoryFile = "2020-03-17.20/42/55"; wssocket.send(JSON.stringify(request)); ``` ##### Result ```json { "data":"success", "size":"0.00 B", "action":"onTransferTo", "time":"0.01s" } ``` ### Log Viewing Class #### Querying Local Node Logs in the last N Days (Deleted) ##### parameter | 字段 |value| | ------ | ---------------- | | action |listLocalNodeLog| | date |The current time| ##### Sample request ``` request.action = "listLocalNodeLog"; request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "data":"[{\"action\":\"login\",\"pubKey\":\"null\",\"status\":\"accept\",\"date\":1583139323822}\",]" } ``` #### Querying Local Contract Logs in the last N Days (Deleted) ##### parameter | 字段 |value| | ------ | -------------------- | | action |listLocalContractLog| | date |The current time| ##### Sample request ``` request.action = "listLocalContractLog"; request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "data":"[\"{\"action\":\"startContract\",\"pubKey\":\"04405d7ba358d9234939623ab51ea94ca685e6a1f36ed81fd9630ccba6473e632f163bb30faffd4c91f21e5bace20101d6d6e36c04ac67eea14cc24b4962b84f57\",\"contractID\":\"845581788\",\"contractName\":\"null\",\"date\":1583141525539}\"]" } ``` ### Node Configuration Class #### Obtain node configuration information ##### parameter | 字段 |value| | ------ | -------------- | | action |loadNodeConfig| ##### Sample request ``` var param = {}; param.action = "loadNodeConfig"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ``` { "status": true, "action": "onLoadNodeConfig", "data": { "nodeName": "04BF52213343C147E631B877BCEB17B794230EE551E85F58FA429C4BA03D690778CC384C6916C63DF36CB9E35C7E274FDB4E18491DFE3D611D347856D441CACC5AF9090B515F02AFC2DFBF56461EC83B5A4CD342466360D6CF82E6E40B637430AC4A329CCBC798DAF7D526AF9E3B3600E0BEA1BFAB8C160EF90128FAF67B19E45F37664F1E4B", "licence": "04AADCC7103CD02626D228AFFBEF53F8242ECA4DDD6F179D30B622440666715CFBB6FD1D3678A2B25812DEA9917073E79A65F7ADE517F784DC76288EFCEB37ECAA1025E6903540702F729DA1C2ECCD93F4E6FAFCE40DF443E7FD74387169D0C6D927C7BB12882D0471C8D3E6F31B0316A42FC38F6DD9978D4351B23B2AD63E2244909E98F51185D32CB99B4AE4E22D3AB4C04027BB", "expireTime": "Wed Aug 26 09:43:08 CST 2020", "nodes": "[\"node1\",\"node2\",\"node3\"]", "yjsPath": "/Users/xxx/docs/BDWareHttp/generatedlib/yjs.jar", "nodeCenter": "ws://127.0.0.1:1719/SCIDE/NodeCenter" } } { "status":true, "action":"onLoadNodeConfig", "data":{ "nodeName":"Node_180", "peerID":"", "masterAddress":"39.104.201.40:21031", "licence":"04AADCC7103C", "doipConfig":"{\\"LHSProxyAddress\\":\\"http://39.104.201.40:21042/\\",\\"ownerHandle\\":\\"86.5000.470/dou.TEST\\",\\"certPath\\":\\"keys/dou.TEST.keystore\\",\\"certPassword\\":\\"123456\\",\\"repoID\\":\\"86.5000.470/doip.vcg9Mu1gSq_bdw\\",\\"listeners\\":\\"[{\\\\\\"url\\\\\\":\\\\\\"tcp://39.104.201.40:21032\\\\\\",\\\\\\"protocolVersion\\\\\\":\\\\\\"2.1\\\\\\",\\\\\\"messageFormat\\\\\\":\\\\\\"packet\\\\\\"}]\\",\\"serviceDescription\\":\\"test local Contract Repository\\",\\"serviceName\\":\\"ContractEngine021\\"}", "clusterConnected":"false", "nodePubKey":"0492d974b8a5b473d0ed2c81800917f76e2a1ec3666067888c85fe6922a672223f2083f95402ae13a744df58deabbe7206c4a317dd14296b0d3941a26ca4e34dc5", "ipPort":"", "bdledger":"39.108.56.240:18091,39.108.56.12:1809139.104.70.160:18091 47.98.247.70:18091 47.98.248.208:18091 39.104.77.165:18091 47.98.249.131:18091", "yjsPath":"/data/bdwaas/bdcontract/yjs.jar", "nodeCenter":"ws://39.104.201.21040/SCIDE/NodeCenter" } } ``` #### Modifying Node Configuration ##### parameter | 字段 |value| | ------ | -------------- | | action |updateConfig| | key |The configuration item to change| | val |The target value to change| Options for key include: | key的示 |Val sample| 说明 | | ------------- | ----------------------------------- | ------------------------------- | | yjsPath |/User/xxx/cp/yjs.jar| 合约进程启动所需的jar | | dataChain | 192.168.1.8:18090,182.173.2.3:18091 | 账本节点的ip与端口 | | nodeCenter |ws://127.0.0.1:18002| CenterPortal所在的ip/端口 | | nodeName |Node_180| 字符串类型 | | masterAddress | 192.168.3.2:18001 | 该NodePortal节点的ip和的TCP端口 | The TCP port of the NodePortal is the HTTP/WS port number +1 of the Node. #### Modifying a Node Name ##### parameter | 字段 |value| | ------ | -------------- | | action |changeNodeName| | data |New node name| ##### Sample request ``` var param = {}; param.action = "changeNodeName"; param.data = "NewNodeName"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status": true, "action": "onChangeNodeName", "data": true } ``` #### Example Change the YJS path of a node ##### parameter | 字段 |value| | ------ | --------------------- | | action |changeYJSPath| | data |Yjs.jar path of the node server| ##### Sample request ``` var param = {}; param.action = "changeYJSPath"; param.data = "/Users/xxx/docs/BDWareHttp/generatedlib/yjs.jar"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status": true, "action": "onChangeYJSPath", "data": true } ``` #### Modify NodeCenter ##### parameter | 字段 |value| | ------ | ----------------------------------------- | | action |changeNodeCenter| | data |NodeCenterWebSocket path to which the node server is to connect| ##### Sample request ``` var param = {}; param.action = "changeNodeCenter"; param.data = "ws://127.0.0.1:1719/SCIDE/NodeCenter"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status": true, "action": "onChangeNodeCenter", "data": true } ``` #### Example Modify an account node ##### parameter | 字段 |value| | ------ | --------------------------- | | action |changeBDledger| | data |The IP address of the node is port, separated by commas (,)| ##### Sample request ``` var param = {}; param.action = "changeBDledger"; param.data = "39.108.56.240:18091,39.108.56.12:18091"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status": true, "action": "onChangeBDledger", "data": true } ``` #### Uploading the Node License ##### parameter | 字段 |value| | ------ | ----------------------- | | action |uploadLicence| | data |The content of the license on the node server| ##### Sample request ``` var param = {}; param.action = "uploadLicence"; param.data = "04AADCC7103C"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status": true, "action": "onUploadLicence", "data": true } ``` #### Obtaining Node ids ##### parameter | 字段 |value| | ------ | --------- | | action |getNodeID| ##### Sample request ``` var param = {}; param.action = "getNodeID"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "status": true, "action": "onGetNodeID", "data": "0431…d3a92e1184bbc5817ebda5c2ad498e4ff1d240009b4f06d" } ``` #### Gets the trusted execution cluster where the node resides ##### parameter | 字段 |value| | ---------- | ------------------------------------------------ | | action |getNodeTrustUnits| | data |The node ID| | msgHandler |MsgHandler for the callback function that receives a reply| | ws |WebSocket address of the NodeCenter to which the node belongs| ##### Sample request ``` centerportalws = createWssocket("ws://127.0.0.1:1718/NodeCenterWS",function() { var param = {}; param.action = "getNodeTrustUnits"; param.data = "0431e311bd70840fe69965e2cabea97fafe99f2133953c01abb9bd7cb62af42f8283f474d203051e920d3a92e1184bbc5817ebda5c2ad498e4ff1d240009b4f06d"; centerportalws.send(JSON.stringify(param)); }, msgHandler); ``` ##### Returns the result ```json { "data": [{ "key": "0475c7b061...65e55_4063665700873624164", "value": "[\"04541429c11b094…40009b4f06d\"]" }], "action": "onGetNodeTrustUnits" } ``` ### Template generation class #### Gets a list of contract templates ##### parameter | 字段 |value| | ------ | --------------- | | action |getTemplateList| ##### Sample request ``` javascript req={}; req.action = "getTemplateList"; wssocket.send(JSON.stringify(req)); ``` ##### Returns the result ``` json { "data": [ { "formDesc": { "dbPWD": { "label": "密码", "type": "input" }, "contractName": { "label": "合约名称", "type": "input" }, "accessPolicy": { "label": "访问控制策略", "type": "input", "option": [ { "text": "无访问控制", "value": "NAC" }, { "text": "直接访问控制", "value": "DAC" }, { "text": "基于角色的访问控制", "value": "RBAC" } ] }, "dbUserName": { "label": "用户名", "type": "input" }, "fieldList": { "label": "字段名", "type": "tag" }, "dbUrl": { "label": "数据库链接", "type": "input" }, "tableName": { "label": "表名", "type": "input" } }, "apiName": "generateMySQLProject" }, { "formDesc": { "contractName": { "label": "合约名称", "type": "input" }, "accessPolicy": { "label": "访问控制策略", "type": "input", "option": [ { "text": "无访问控制", "value": "NAC" }, { "text": "直接访问控制", "value": "DAC" }, { "text": "基于角色的访问控制", "value": "RBAC" } ] } }, "apiName": "generateEmptyProject" } ], "action": "onTemplateList" } ``` #### Blank Contract Template ##### parameter | 字段 |value| | ------------ | ----------------------------- | | action |generateEmptyProject| | contractName |The name of the contract is a string| | isPrivate |Boolean type, whether it is a private project| | accessPolicy |If the value is “DAC”, direct access control is implemented| ##### Sample request ```javascript var req = {}; req.contractName = "Empty22"; req.action = "generateEmptyProject"; req.accessPolicy = "DAC"; //wssocket为建立好的连接 wssocket.send(JSON.stringify(req)); ``` ##### Returns the result ```json { "action":"onListProjects", "data":"[\"AnnotationSample\",\"AppDataAnalysis\",\"AppDataSource\"]", "executeTime":0, "isPrivate":false } ``` #### MySQL Access Contract ##### parameter | 字段 |value| | ------------- | ------------------------------------------------------ | | action |generateMySQLProject| | contractName |The name of the contract is a string| | isPrivate |Boolean type, whether it is a private project| | dbUrl |The string is the URI of the database| | dbUserName |The value is a string of characters and the user name of the database| | dbPWD |The value is a string of characters and the database password| | accessPolicy |If it is “DAC”, direct access control is implemented; if it is “NAC”, no access control is implemented| | tableName |A string, the name of a database table| | fieldList |A list of strings, a list of database fields| | defaultAccept |Boolean value indicating whether the application is granted by default| ##### Sample request ```javascript var req = {}; req.contractName = "MySQLFromTemplate"; req.action = "generateMySQLProject"; req.pubKey = global.sm2Key.publicKey; req.isPrivate = true; req.tableName = "data"; req.dbUrl = "jdbc:mysql://xxx:xxx/xxx"; req.dbUserName = "loushuai"; req.dbPWD = "loushuai"; req.fieldList = [{"name":"名字","code":"*"}]; req.basicInfo={"type":"所属分类","name":"资源名称"}; req.accessPolicy = "DAC"; req.defaultAccept = true; //global.wssocket为建立好的连接 global.wssocket.send(JSON.stringify(req)); ``` ##### Returns the result ```json { "action":"onListProjects", "data":"[\"CSVFromTemplate\",\"Empty22\",\"Hello\",\"MySQLFromTemplate\",\"test\"]", "executeTime":0, "isPrivate":true } ``` #### CSV Access Contract ##### parameter | 字段 |value| | ----------------- | ------------------------------------------------------ | | action |generateCSVProject| | contractName |The name of the contract is a string| | base64EncodedData |The value is a string of characters in a Base64-encoded CSV file| | isPrivate |Optional fields, Boolean type, private item or not| | accessPolicy |If it is “DAC”, direct access control is implemented; if it is “NAC”, no access control is implemented| | defaultAccept |An optional field, a Boolean value that indicates whether the application is granted by default| ##### Sample request ```javascript var req = {}; req.contractName = "CSVFromTemplate"; req.action = "generateCSVProject"; req.pubKey = global.sm2Key.publicKey; req.isPrivate = true; req.tableName = "data"; req.accessPolicy = "DAC"; req.defaultAccept = true; req.base64EncodedData = "bmFtZSwgc2NvcmUsCmphY2ssIDkwLApsdWN5LCA5MQo="; //global.wssocket为建立好的连接 global.wssocket.send(JSON.stringify(req)); ``` ##### Returns the result ```json { "action":"onListProjects", "data":"[\"CSVFromTemplate\",\"Empty22\",\"Hello\",\"MySQLFromTemplate\",\"test\"]", "executeTime":0, "isPrivate":true } ``` - - - ## Routing node WebSocket interface ### User Management #### Access to the Session Before login, obtain the session for signing. ##### parameter | 字段 |value| | ------ | ------------ | | action |getSessionID| ##### Sample request ``` var req = {}; req.action = "getSessionID"; wssocket.send(JSON.stringify(req)); ``` ##### Returns the result ```json { "action": "onSessionID", "session": "9782323_session" } ``` #### The user login To authenticate the public key, the user needs to call “getSessionID” to obtain the sessionID for signature. ##### 参数 | 字段 | 值 | | ------ | ----- | | action | login | ##### Sample request ``` var loginParam = {}; loginParam.pubKey = global.sm2Key.publicKey; loginParam.signature = sm2.doSignature(global.session, global.sm2Key.privateKey); loginParam.action = "login"; wssocket.send(JSON.stringify(loginParam)); ``` ##### Result ```json { "action": "onLogin", "data": "CenterManager" } ``` #### User gets the current role (Delete) A user obtains a role based on the public key used during login. If it is the first login, the public key used during login is called the access administrator by default ##### parameter | 字段 |value| | ------ | ------- | | action |getRole| ##### Sample request ``` var param = {}; param.action = "getRole"; wssocket.send(JSON.stringify(param)); ``` ##### Result ```json { "action": "onGetRole", "data": "CenterManager" } ``` #### Apply for role On the Access administrator page, you can apply for a node administrator for a node in the network ##### parameter | 字段 |value| | ------ | --------- | | action |applyRole| |role|Specifies the name of the applied role| ##### Sample request ``` var param = {}; param.action = "applyRole"; param.role=" wssocket.send(JSON.stringify(param)); ``` ##### Result ```json { "action": "onApplyRole", "data": "failed" } ``` #### Add a node ##### parameter | 字段 |value| | ---------- | ---------------- | | action |addNode| |nodePubKey| 要添加的节点公钥 | #### Sample request ``` var req = {}; //某节点的publicKey可通过连接该节点,并通过"获取节点配置信息"接口获取 req.nodePubKey = publicKey; req.action = "addNode"; wssocket.send(JSON.stringify(req)); ``` #### Deleting a User Role ##### parameter | 字段 |value| | ------ | -------------- | | action |delete| | pubKey |The public key of the corresponding user| ##### Sample request ``` var deleteInfo = {}; deleteInfo.pubKey = user.publicKey; deleteInfo.action = "delete"; wssocket.send(JSON.stringify(deleteInfo)); ``` ##### Result ```json { "action": "onDelete", "data": "success" } ``` #### View the list of authorized users View authorized node administrators in the current network ##### parameter | 字段 |value| | ------ | ------------ | | action |listAllUsers| ##### Sample request ``` var param = {}; param.action = "onListAllUsers"; wssocket.send(JSON.stringify(param)); ``` ##### Result ```json { "action": "onListAllUsers", "kv": { "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7", "value": " NodeManager" }, "time": { "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7", "value": 1587398989914 } } ``` #### View the list of applied users ##### parameter | 字段 |value| | ------ | ------------- | | action |listApplyList| ##### Sample request ``` var param = {}; param.action = "onListApplyList"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "action": "onListApplyList", "kv": { "key": "04b00f32eab70c78d1b43738f190d326d36c021af2124acefe6d057016b11ea31c750bb473e565c9d89e4993a44f4d30adf447d3026a21ff4b3b64cef523074ef7", "value": " NodeManager" }, "time": { "key": "04b00f32eab70c78d1b43738f190d326d36c021af2124acefe6d057016b11ea31c750bb473e565c9d89e4993a44f4d30adf447d3026a21ff4b3b64cef523074ef7", "value": 1587398989914 } } ``` #### View the distribution of user types ##### parameter | 字段 |value| | ------ | ------------- | | action |queryUserStat| ##### Sample request ``` var param = {}; param.action = "onQueryUserStat"; wssocket.send(JSON.stringify(param)); ``` ##### Result ```json { "action": "onQueryUserStat", "userListCount": 3, "applyListCount":0 } ``` ### Node Management #### Viewing the Node List View the node list that the user has the permission to view (only available to access administrators and contract managers) ##### parameter | 字段 |value| | ------ | --------- | | action |listNodes| ##### Sample request ``` var param = {}; param.action = "listNodes"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "offline": [{ "key": "0431e31...40009b4f06d", "value": "0431e311bd708...b4f06d" }], "action": "onListNodes", "online": [{ "contracts": [], "pubKey": "0431e311...09b4f06d", "nodeName": "NewNodeName", "udpID": "528822126", "cimanager": "" }] } ``` #### View the list of trusted execution clusters View the node list that the user has permission to view (available only to the center administrator and contract manager) ##### parameter | 字段 |value| | ------ | -------------- | | action |listTrustUnits| ##### Sample request ``` var param = {}; param.action = "listTrustUnits"; wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "data": [{ "key": "0470b2f27f4f6…1cb855f1ecec11", "value": "[...]" }], "action": "onListTrustUnits" } ``` #### Establish a trusted execution cluster ##### parameter | 字段 |value| | ------ | ---------------------- | | action |createTrustUnit| | data |Json array of node public keys| | Msg |The name of the cluster| ##### Sample request ``` var param = {}; param.action = "createTrustUnit"; param.data = "[\"382r0934309t...\",\"345343rr3f34...\"]"; param.msg = "newUnit1"; global.wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "action": "onCreateTrustUnit", "status": "Success" } ``` #### Delete a trusted execution cluster ##### parameter | 字段 |value| | ------ | --------------- | | action |deleteTrustUnit| | data |Trusted execution cluster ID| ##### Sample request ``` var param = {}; param.action = "deleteTrustUnit"; param.data = "0475d34rf3434..._1583410158761"; global.wssocket.send(JSON.stringify(param)); ``` ##### Returns the result ```json { "action": "onDeleteTrustUnit", "status": "Success" } ``` ### Log Viewing Class #### View the statistics of network management operations ##### parameter | 字段 |value| | ------ | -------------- | | action |queryActionLog| | date |The current time| ##### Sample request ``` request.action = "onQueryActionLog"; request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "action":"onQueryActionLog", "data":"[{\"action\":\"login\",\"pubKey\":\"null\",\"status\":\"accept\",\"date\":1583139323822}\",]" } ``` #### View local contract logs in the last N days ##### parameter | 字段 |value| | ------ | -------------------- | | action |listLocalContractLog| | date |The current time| ##### Sample request ``` request.action = "listLocalContractLog"; request.date = new Date().getTime() - 24 * 3600 * 1000 * n; wssocket.send(JSON.stringify(request)); ``` ##### Returns the result ```json { "data":"[\"{\"action\":\"startContract\",\"pubKey\":\"04405d7b...\",\"contractID\":\"845581788\",\"contractName\":\"null\",\"date\":1583141525539}\"]" } ``` - - - ## Bash interface Has been abandoned. BDWareConfigTool can be used instead. Send Socket instructions through the command line, execute the call `ContractController` class method, complete the following functions(need to run the `ContractManager` instance on the local `1615` port) ![Schematic diagram of Bash interface functions](./_static/imgs/bash-api.png) ### instruction ```bash java -jar yjs.jar function_name arguments ``` `function_name` is the name of the called method; `arguments` is the method parameter. ### Start the contract #### parameter `function_name` is `startContract`; `arguments` to start the contract parameters, including the type of contract `type`, the contract ID `id`, contract script `script`. #### Order sample ```bash java -jar yjs.jar startContract "{\"type\":\"Algorigthm\",\"id\":\"656565\",\"script\":\"contract c{function main(arg){return arg/1.0+1;}}\"}" ``` ### Call the contract #### parameter `function_name` is `executeContract`; `arguments` need to invoke the contract parameters, including the call parameters `arg`, the contract ID `contractID`. #### Order sample ```bash java -jar yjs.jar executeContract "{\"arg\":\"http://www.baidu.com\",\"contractID\":\"656564\"}" ``` ### To stop the contract #### parameter `function_name` is `stopContract`; `arguments` is the parameter required to invoke the contract, that is, the contract ID `contractID`. #### Order sample ```bash java -jar yjs.jar stopContract "{\"arg\":\"http://www.baidu.com\",\"contractID\":\"656564\"}" ``` ### Termination of all contracts #### parameter `function_name` indicates that `stopAllContracts`. #### Order sample ```bash java -jar yjs.jar stopAllContracts ``` ### Query all contracts #### parameter `function_name` is `listContracts`. #### Order sample ```bash java -jar yjs.jar listContracts ```