# BDContract SDK

除使用可视化的智能合约在线IDE外,用户还可使用WebSocket接口、Http接口、Bash接口来启动和运行合约.

## WebSocketSDK下载与安装

合约SDK提供javascript版本与java版本的客户端。

java客户端的下载链接为:java source和jar 可参考java_source下的README.md及测试用例。

javascript的下载链接为:js SDK 内置的SM2加密库链接:sm2 SDK

### 建立连接

建立与节点服务器之间的WebSocket连接.

#### 参数

字段 | 值
--- | ---
url | 建立WebSocket的服务器URL. 使用`http`协议时, 前缀为`ws://`, 如`"ws://localhost:1717/SCIDE/SCExecutor"`; 使用`https`协议时, 前缀为`wss://`
msgHand ler | 收到服务器WebSocket回复后的回调函数, 用户可自行编写, 也可参考下面提供的示例

#### 请求示例

    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);

#### 返回结果示例

    {
      receiveSeg: [Function (anonymous)],
      isSending: false,
      sendList: [],
      monitor: [Function (anonymous)],
      send: [Function (anonymous)],
      sendNextSegment: [Function (anonymous)],
      isOpen: [Function (anonymous)]
    }

### ping

`ping`服务器测试

#### 参数

字段 | 值
--- | ---
action | ping

#### 请求示例

    var request = {};
    request.action = "ping";
    wssocket.send(JSON.stringify(request));

#### 返回结果示例

    {
        "action":"pong"
    }

### 登录

使用Websocket接口调用需要权限的接口时，不论是连接CenterPortal还是NodePortal必须先登录。 登录的流程有3步：

- 客户端向服务端建立连接，连接建立完成后发送{“action”:“getSessionID”}（可在onOpenHandler中实现）

- 服务端收到请求后，会向客户端返回类似{“action”:“onGetSessionID”,“session”:“-4959947809200104526_session”}的结果

- 客户端收到onGetSessionID后,会使用本地的公私钥对sessionID进行签名，并调用login接口

- 服务端会返回onLogin的结果，data字段返回的是该公钥对应的角色。

## 用户角色划分

### 合约节点的角色划分

在合约节点(NodePortal.html)中分为NodeManager/ContractProvider/ContractInstanceManager/ContractUser四类角色。

角色 | 说明
--- | ---
NodeManager | 该节点的管理者，拥有用户管理、节点配置等权限
ContractProvider | 拥有编辑合约、开发合约代码、运行调试等权限
ContractInstanceManager | 拥有启、停合约实例、配置合约实例IO等权限
ContractUser | 拥有查看合约实例列表、调用合约等权限
Anonymous | 匿名用户，可以调用合约，可以申请成为ContractProvider/InstanceManager等角色

接口 | 说明 | 角色
--- | --- | ---
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 | 启动合约 | 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 | 申请角色 | 任意角色
executeContract | 调用合约 | 任意角色
getConnCount |  | 任意角色
getHashAbstractLocally |  | 任意角色
getHashLocally |  | 任意角色
getNodeRoleDeprecated | 查询当前角色 | 任意角色
getSessionID |  | 任意角色
listAdapters |  | 任意角色
listTheContractProcess |  | 任意角色
login | 登录 | 任意角色
longStr |  | 任意角色
ping |  | 任意角色
queryDataByHash |  | 任意角色
queryDataByHashLocally |  | 任意角色
queryHashByOffset |  | 任意角色
queryHashByRequestID |  | 任意角色
queryHashSize |  | 任意角色
queryLedgers |  | 任意角色
queryRole |  | 任意角色
queryTransactionByHash |  | 任意角色
sendTransaction |  | 任意角色
setLogStage |  | 任意角色

### 合约准入中心角色划分

共分为两类角色：CenterManager和NodeManager。其中，CenterManager拥有对集群设置的权限。 NodeManager可以增加、删除节点等操作。

接口 | 说明 | 角色
--- | --- | ---
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 | 登录 | 任意角色

## 合约节点Http接口

`http://xxx.xxx.xxx.xxx:1717/SCIDE/SCManager`为提供Http接口服务的服务器 URL(`xxx.xxx.xxx.xxx:1717`为BDWare SCIDE运行的IP和端口号) , 用户可通过在URL后附加字段参数, 完成以下功能. `http://xxx.xxx.xxx.xxx:18000/SCIDE/SCManager` 为提供Http接口服务的服务器

URL（`xxx.xxx.xxx.xxx:1717` 为BDWare SCIDE运行的IP和端口号），用户可通过在URL后附加字段参数，完成以下功能：

### 用户管理类

#### ping

`ping`服务器测试

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | ping

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=ping

##### 返回结果示例

    {"data":"pong"}

### 合约代码管理类

#### 下载合约项目

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | downloadContract
projectName | 合约项目名
isPrivate | 是否在私有目录下
pubKey | 用户公钥
timestamp | 时间戳
sign | 签名

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=downloadContract&projectName=BDCoin&isPrivate=false&pubKey=0480204f4ef341359a5f64fcb11baf9ca2e6706ac20cba3
    8b7ff78aa631e97346086e2d48fac2ba7f5b75ccbd19ebf495c0e6f9934d69e3b083da4d42e46c991e0c2ea8bb45d59f31f46d0ec700fb01f2fdd275

#### 上传文件

##### 方法

POST

##### 参数

字段 | 值
--- | ---
path | 文件上传路径
fileName | 待上传文件名
isPrivate | 是否在私有目录下
order | 第几个数据包
count | 数据包总数
timestamp | 时间戳
sign | 签名

##### 请求示例

    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

##### 返回结果示例

    {"status":"true","data":"success"}

#### 保存合约脚本

向服务器发送请求, 向服务器本地保存合约脚本内容.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | writeDyjs
target | 合约脚本文件名
content | 合约脚本内容

##### 请求示例

    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

##### 返回结果示例

    {
        "status": false,
        "action": "onWriteDyjs",
        "data": "success"
    }

后续用户可启动并调用该合约.

### 合约实例管理类

#### 查询合约进程

向服务器发送请求, 查询服务器上已经启动的所有合约进程.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | listContractProcess

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=listContractProcess

##### 返回结果示例

    {
        "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]"
    }

#### 启动合约

向服务器发送请求, 启动某个合约.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | startContract
script | 合约脚本内容, 需进行进行URIEncode

##### 请求示例

    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

##### 返回结果示例

    {
        "data": "{\"status\":\"Success\",\"result\":\"\"}",
        "action": "onStartContract",
        "cid": "-562752842",
        "executeTime": 1187
    }

#### 调用合约

向服务器发送请求, 调用某个合约.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | executeContract
contractID | 合约ID
withDynamicAnalysis | true/false 是否进行动态分析
operation | 调用合约的方法名
arg | 调用合约的参数
pubkey | 可选，调用者公钥
signature | 可选，签名

其中pubkey为sm2的公钥，计算方式如下：

    //sm2 可从sm2.js中加载获得。
    signature = sm2.doSignature(contractID+"|"+operation+"|"+arg+"|"+pubkey,privateKey);

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=executeContract&contractID=-620602333&operation=main&arg=hhh

##### 返回结果示例

    {
        "data": "{\"status\":\"Success\",\"result\":\"3\"}",
        "action": "onExecuteResult",
        "executeTime": "13"
    }

#### 批量启动合约

向服务器发送请求, 启动服务器中保存有合约脚本的一系列合约.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | startContractBatched
fileList | 合约脚本文件列表(Json数组,URLEncode)

##### 请求示例

    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

##### 返回结果示例

    {"EventPuber.yjs":"{\"status\":\"Success\",\"result\":\"\"}","LicenceManager.yjs":"{\"status\":\"Success\",\"result\":\"\"}","EventSuber.yjs":"{\"status\":\"Success\",\"result\":\"\"}","action":"onStartContract"}

#### 启动Zip包合约

向服务器发送请求, 启动服务器中包装为`zip`格式的合约.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | startContractInTempZips
owner | 调用者公钥
path | zip合约(路径及)文件名
signature | 调用者签名

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=startContractInTempZips&owner=0475c7b061f32477c1e228dd04143daf58a5574dc3f6b02bd2857cc794eb92bfe98606dc314049e77fd8714f57a5a481cb470cc759e688fe60d40fc87092165e55&path=traceTest.zip&signature=650d3cad50509682937c253d84da99230e8ea1bcfb9b10f6d18f8888c7c4b6b4%2C72231a6daa078a3ce657c0a2ed38251b7db56cf725beaf86780d4c240b19ccc2

##### 返回结果示例

    {"data":"verify failed","action":"onStartContract"}

#### 获取合约代码

向服务器发送请求, 获取某个ID合约的脚本代码.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | getCodeByID
contractID | 合约ID

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=getCodeByID&contractID=814046805

##### 返回结果示例

    {"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"}

#### 保存合约状态

向服务器发送请求, 获取节点服务器的状态转移日志.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | dumpContract
contractID | 合约ID 或 合约Name=

##### 请求示例

    http://127.0.0.1:18000/SCIDE/SCManager?action=dumpContract&contractID=counter&pubKey=040461417efe01423ba603f71c689387e8aac4aa2a6f7cddfaf22c1d22c40222f7669a054e7ec2e8533b04ccbc7a0e6655ac4ae4acef81a2b1822ec6cabcaf6c1f&sign=3045022004ffd1346b936196f5b13953d2f3e11823a0d0a2d2f6fecea258cef8e20d99c0022100bbc219ed1f56799ba28a763b9e9e47063164e7ceecfbfa752de42f44551ffb83

##### 返回结果示例

    {"data":"success","size":"3.76 KB","time":"0.03s"}

#### 获取合约内存文件列表

向服务器发送请求, 获取某子文件夹中的所有内存文件列表.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | listMemoryFiles
contractID | 合约Id 或 合约Name

##### 请求示例

    http://127.0.0.1:18000/SCIDE/SCManager?action=listMemoryFiles&contractID=-247468535&pubKey=040461417efe01423ba603f71c689387e8aac4aa2a6f7cddfaf22c1d22c40222f7669a054e7ec2e8533b04ccbc7a0e6655ac4ae4acef81a2b1822ec6cabcaf6c1f&sign=3045022075c7268e888b0efdef167a3f4dfc6589d771c6be41b3c0a1dc12d057e811f395022100d44f460d0cc3643e169ef08231e75a1e895646c53295c0ef1d15c3b462a53d6b

##### 返回结果示例

    {"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"}

#### 停止合约

向服务器发送请求, 停止某个合约.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | killContractProcess
id | 合约ID
*requestID | 请求ID, String类型

`*`表示可选参数

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=killContractProcess&id=-1759263594

##### 返回结果示例

    {"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]"}

#### 停止所有合约

向服务器发送请求, 停止服务器上启动的所有合约.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | killAllContract

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=killAllContract

##### 返回结果示例

    {"status":false,"action":"onKillAllContract","data":"Kill:7357,7541,7548,7555,7584,7585,7591,7598,7609,7612,8440,8442,8444,8521,"}

#### 静态分析合约

向服务器发送请求, 静态分析合约脚本.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | staticVerifyContract
contractid | 合约ID
script | 请求ID, String类型

##### 请求示例

    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

##### 返回结果示例

    {"data":"{\"status\":\"Success\",\"result\":\"{\\\"main\\\":\\\"Ret:arg \\\"}\"}","action":"onExecuteResult","cid":"943728900","executeTime":54}

#### 获取合约静态分析流

向服务器发送请求, 获取某个合约的静态分析Control Flow.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | getControlFlowByFileName
path | 合约ID

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=getControlFlowByFileName&path=EventSuber.yjs

##### 返回结果示例

    {"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"}}]}}

### 日志查看类

#### 合约日志-查询数量

##### 方法

GET

contractName为空或是不传入时，则为查询全部合约的条数

##### 参数

字段 | 值
--- | ---
action | queryContractLogSize
contractName | 字符串，非必须，合约名称

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogSize&contractName=NanningDataSource

##### 返回结果示例

    {
        "size": 12,
        "action": "onQueryContractLogSize",
        "status": "success"
    }

#### 合约日志-根据日期查询

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryContractLogByDate
start | long，必须，起始时间
end | long，非必须，若无end，默认为当前时间
contractName | 字符串，非必须，合约名称

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogByDate&start=1597296300272&end=1597296305747

##### 返回结果

    {
        "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"
    }

#### 合约日志-根据偏移量查询

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryContractLogByOffset
count | long，必须，获取日志条数
offset | long，非必须，若无offset，默认返回最新count条
contractName | 字符串，非必须，合约名称

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogByOffset&count=5&contractName=NanningDataSource

##### 返回结果

    {
        "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"
    }

#### 合约日志-根据key查询

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryContractLogByKey
key | long，必须，该日志对应的key

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryContractLogByKey&key=203156239086062402

##### 返回结果

    {
        "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"
    }

#### 合约日志-按时间段统计调用次数

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | countContractLogGroupByCategory
start | long，必须，起始时间
end | 非必须，终止时间，默认为当前
interval | long，非必须，统计间隔
category | 非必须，合约名称以逗号连接，不传入时统计全部合约调用情况

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=countContractLogGroupByCategory&start=1596758400000&interval=86400000

##### 返回结果

    {
        "start": 1596758400000,
        "interval": 86400000,
        "action": "onCountContractLogGroupByCategory",
        "data": [
            0,
            0,
            0,
            0,
            0,
            0,
            43,
            14
        ]
    }

#### 账本日志-查询数量

查询通过本节点去账本上记录的日志数量

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryHashSize
contractName | 非必须，合约名称

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryHashSize&contractName=NanningDataSource

##### 返回结果

    {
        "count": "2",
        "action": "onQueryHashSize"
    }

#### 账本日志-根据偏移量查询

查询x条通过本节点去账本上记录的日志的哈希列表

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryHashByOffset
count | 整数，必须,表示条数
offset | 整数，非必须，表示偏移量，不传入offset则默认返回最新count条
contractName | 字符串，非必须，表示合约名称

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryHashByOffset&count=1&contractName=NanningDataSource

##### 返回结果

    {
        "data": [
            {
                "hash": "3a6c60621907146b77146c1f2d48700e47520173",
                "date": 1597296314658
            }
        ],
        "action": "onQueryHash",
        "status": "success"
    }

#### 账本日志-根据hash查询详情

根据hash来查询日志内容

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryDataByHash
hash | 字符串，可通过queryHashByOffset

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryDataByHash&count=1&contractName=NanningDataSource&hash=3a6c60621907146b77146c1f2d48700e47520173

##### 返回结果

    {
        "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"
    }

#### 账本日志-根据requestID查询Hash

根据requestID来查询日志内容，需由开发者保证requestID的唯一性

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryHashByRequestID
requestID | 字符串，在发起调用时生成

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=queryHashByRequestID&requestID=0987654321ab

#### 节点日志-查询数量

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryNodeLogSize
category | 非必须，不传入时查询全部情况

其中包括：ping、startContract、saveFile等。

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogSize

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogSize&category=login

##### 返回结果

    {
        "size": 177,
        "action": "onQueryNodeLogSize",
        "status": "success"
    }

#### 节点日志-按日期查询

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryNodeLogByDate
start | long，必须，起始日期
end | long，非必须
category | 非必须，不传入时查询全部情况

##### 请求示例

    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

##### 返回结果

    {
        "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"
    }

#### 节点日志-按偏移量查询

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | queryNodeLogByOffset
count | long，必须，获取日志条数
offset | long，非必须，若无offset，默认返回最新count条
contractName | 字符串，非必须，合约名称

##### 请求示例

    http://127.0.0.1:18000/SCIDE/CMManager?action=queryNodeLogByOffset&count=5

##### 返回结果

    {
        "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"
    }

#### 节点日志-按时间段统计调用次数

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | countLogGroupByCategory
start | long，必须，起始时间
end | 非必须，终止时间，默认为当前
interval | long，非必须，统计间隔
category | 非必须，action以逗号连接，不传入时统计全部调用情况

其中，category中的action为NodePortal的接口的action集合。 包括：ping、startContract、saveFile等。

##### 请求示例

    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

##### 返回结果

    {
        "start": 1596758400000,
        "interval": 86400000,
        "action": "onCountNodeLogGroupByCategory",
        "data": [
            0,
            0,
            0,
            0,
            0,
            0,
            912,
            761
        ]
    }

#### 输出历史记录日志

向服务器发送请求, 获取节点服务器上合约的TimeTravel日志.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | printTimeTravelLog

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=printTimeTravelLog

##### 返回结果示例

    {"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"}

#### 输出节点转移日志

向服务器发送请求, 获取节点服务器的状态转移日志.

##### 方法

GET

##### 参数

字段 | 值
--- | ---
action | printTransferLog

##### 请求示例

    http://127.0.0.1:1717/SCIDE/SCManager?action=printTransferLog

##### 返回结果示例

    {"status":false,"data":""}

### 模板生成类

## 合约节点WebSocket接口

### 用户管理类

#### 获取Session

登录前获取session以便进行签名。

##### 参数

字段 | 值
--- | ---
action | getSessionID

##### 请求示例

    var req = {};
    req.action = "getSessionID";
    wssocket.send(JSON.stringify(req));

##### 返回结果

    {
        "action": "onSessionID",
        "session": "9782323_session"
    }

#### 用户登录

用户进行公私钥身份验证

##### 参数

字段 | 值
--- | ---
action | login

##### 请求示例

    var loginParam = {};
    loginParam.pubKey = global.sm2Key.publicKey;
    loginParam.signature = sm2.doSignature(global.session,
                global.sm2Key.privateKey);
    loginParam.action = "login";
    wssocket.send(JSON.stringify(loginParam));

##### 返回结果

    {
        "action": "onLogin",
        "data": "NodeManager,ContractProvider"
    }

#### 申请角色

在节点管理员界面申请可以申请称为合约管理员(ContractInstanceManager)、合约使用者(ContractUser)、合约提供者（ContractProvider)

##### 参数

字段 | 值
--- | ---
action | applyNodeRole
role | 申请角色名称

##### 请求示例

    var param = {};
    param.action = "applyNodeRole";
    param.role = "ContractUser";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onApplyRole",
        "data": "success"
    }

    {
        "action":"onApplyRole",
        "data":"already has!"
    }

#### 授权角色

##### 参数

字段 | 值
--- | ---
action | authNodeRole
isAccept | bool类型，表示否授权
pubKey | 授权用户公钥

##### 请求示例

    var param = {};
    param.action = "authNodeRole";
    param.isAccept = true;
    param.pubKey = "xxxxx";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onAuthNodeRole",
        "data": "success"
    }

#### 删除用户角色

##### 参数

字段 | 值
--- | ---
action | deleteRole
role | 删除角色名称

##### 请求示例

    var deleteInfo = {};
    deleteInfo.pubKey = global.authorizedUsers.[publicKey];
    deleteInfo.action = "deleteRole";
    deleteInfo.role="ContractUser";
    wssocket.send(JSON.stringify(deleteInfo));

##### 返回结果

    {
        "action": "onDeleteRole",
        "data": "success"
    }

#### 查看授权用户列表

查看准入管理员当前组网中已经授权的节点管理员

##### 参数

字段 | 值
--- | ---
action | listAllAuthRole

##### 请求示例

    var param = {};
    param.action = "listAllAuthRole";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status":false,
        "action":"onListAllAuthRole",
        "data":
        {
            "kv":[{"key":"04eafad549d0757cf67f360815e15e157c7428c9ea9fb933f31a5d45bfb6edd9809c5bf6a5f37d7b817207f19fb2d76b7dbdefe38084cd3282e37b9ac39959dfab",
                  "value":"NodeManager,ContractProvider,ContractUser,ContractInstanceManager"}],
            "time":[{"key":"04eafad549d0757cf67f360815e15e157c7428c9ea9fb933f31a5d45bfb6edd9809c5bf6a5f37d7b817207f19fb2d76b7dbdefe38084cd3282e37b9ac39959dfab",
                    "value":"1617178709933"}]
        }
    }

#### 查看申请用户列表

##### 参数

字段 | 值
--- | ---
action | listUnAuthRole

##### 请求示例

    var param = {};
    param.action = "listUnAuthRole";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onListUnAuthRole",
         "kv": [{
            "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7",
            "value": "ContractProvider,ContractUser"
        }],
        "time": [{
            "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7",
            "value": "1587398989914"
        }]
    }

##### 参数(删除)

字段 | 值
--- | ---
action | queryUserStat

##### 请求示例

    var param = {};
    param.action = "queryUserStat";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onQueryUserStat",
        "userListCount": 3,
        "applyListCount":0
    }

### 合约代码管理类

#### 获取公共合约文件列表

##### 参数

字段 | 值
--- | ---
action | listProjects

##### 请求示例

    var request = {};
    request.action = "listProjects";
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "action":"onListProjects",
        "data":"[\"AnnotationSample\",\"AppDataAnalysis\",\"AppDataSource\",\"BiddingExample\",\"ContractExecutor\"]",
        "executeTime":0,
        "isPrivate":false
    }

#### 获取私有合约文件列表

##### 参数

字段 | 值
--- | ---
action | listProjects
pubKey | 该用户的公钥
isPrivate | true

##### 请求示例

    var request = {};
    request.action = "listProjects";
    request.pubKey = "global.sm2.publicKey";
    request.isPrivate=true;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "action":"onListProjects",
        "data":"[\"CSVFromTemplate\",\"Empty22\",\"MySQLFromTemplate\",\"test\"]",
        "executeTime":0,
        "isPrivate":true
    }

#### 获取合约实例

##### 参数

字段 | 值
--- | ---
action | listContractProcess

##### 请求示例

    var request = {};
    request.action = "listContractProcess";
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "status":false,
        "action":"onListContractProcess",
        "data":"[{\"id\": \"1658407837\",\"name\": \"BDCoin\",\"port\": \"1617\"}]"
    }

#### 启动合约

##### 参数

字段 | 值
--- | ---
action | startContract
owner | pubkey
requestID | 当前时间
script | 脚本内容
signature | 签名

##### 请求示例

    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));

##### 返回结果

    {
        "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"
    }

#### 启动可信集群合约

##### 参数

字段 | 值
--- | ---
action | startContractP2PTrustfully
owner | pubkey
isPrivate | 当前时间
path | 脚本所在路径
signature | 签名
peersID | 可信执行集群中的节点peerID组成的数组

##### 请求示例

    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));

##### 返回结果

    {
        "data":"{\"status\":\"Success\",\"result\":\"\"}",
        "action":"onStartContractP2PTrustfully",
        "cid":"-1543583350",
        "executeTime":1544
    }

#### 分发合约项目

##### 参数

字段 | 值
--- | ---
action | distributeContract
peersID | 集群中节点peer
projectName | 合约名
isPrivate | 是否在私有目录
sponsorPeerID | 发起者ID
signature | 签名

##### 请求示例

    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));

##### 返回结果

    {
        "action":"onDistributeContract",
        "progress":"100.00%"
    }

#### 终止合约

##### 参数

字段 | 值
--- | ---
action | killContractProcess
id | 合约id
requestID | 请求ID

##### 请求示例

    request.action = "killContractProcess";
    request.id = contractid;
    request.requestID = new Date().getTime() + "";
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "data": "ContractHandler: exit in 3 seconds!",
        "action": "onOutputStream"
    }

#### 终止所有合约

##### 参数

字段 | 值
--- | ---
action | killAllContract

##### 请求示例

    request.action = "killAllContract";
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "status":false,
        "action":"onKillAllContract",
        "data":"Kill:7241,7245,"
    }

#### 静态分析合约

##### 参数

字段 | 值
--- | ---
action | staticVerifyContract
owner | 用户私钥
isPartial | 是否是部分
contractid | contractid
script | 脚本内容
path | 合约文件名

##### 请求示例

    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));

##### 返回结果

    {
        "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
    }

#### 删除合约

##### 参数

字段 | 值
--- | ---
action | deleteFile
file | fileName

##### 请求示例

    request.action = "deleteFile";
    request.file = fileName;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "action":"onDeleteFile",
        "data":"success",
        "executeTime":0
    }

#### 私有合约传至公共目录

##### 参数

字段 | 值
--- | ---
action | changePublic
pubkey | 用户公钥
fileName | fileName

##### 请求示例

    request.action = "changePublic";
    request.pubkey = pubkey;
    request.fileName = fileName;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "action":"onChangePublic",
        "data":"success",
        "executeTime":0
    }

#### 上传合约

##### 参数

字段 | 值
--- | ---
action | UploadFile
isAppend | false
fileName | fileName
path | path
isPrivate | true/false
content | fileContent(base64编码）

##### 请求示例

    request.action = "uploadFile";
    request.isAppend = false;
    request.fileName = "test1.yjs";
    request.path = "test1";
    text="Y29udHJhY3QgdGVzdDF7CglleHBvcnQgZnVuY3Rpb24gaGVsbG8oYXJnKXsgCiAgICAgICAgcmV0dXJuICJ3b3JsZCI7ICAKICAgIH0gICAKfQ=="
    request.content = text;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "action":"onUploadFile",
        "data":"success",
        "executeTime":0
    }

#### 编译合约

##### 参数

字段 | 值
--- | ---
action | compile
path | string, 待编译的项目名称
privateTab | bool, 是否为私有目录的项目

##### 请求示例

    var req = {"action":"compile","path":"Hello","privateTab":true}

##### 返回结果

    {"result":"Hello_2020-08-17-09:09:40.ypk","action":"onCompile"}

#### 锁定私有目录

锁定某个用户的的私有目录编辑功能

##### 参数

字段 | 值
--- | ---
action | lockEdit
pubKey | string, 要被锁定的公钥

##### 请求示例

    var req = {};
    req.action = "lockEdit";
    req.pubKey = "xxxxxx";
    wssocket.send(JSON.stringify(req));

    {
        "action":"onLockEdit",
        "status":"success",
        "data":"04c4c855862b53f323e077ccfcc744ecc2c0a04645ed16d99ede8fd5866b38c0670a97ad22c6260d1a4672aba2a5fe229a2d4eba34627c054aab102620afa288c1"
    }

#### 解锁私有目录

解锁某个用户的的私有目录编辑功能

##### 参数

字段 | 值
--- | ---
action | unLockEdit
pubKey | string, 要被锁定的公钥

##### 请求示例

    var req = {};
    req.action = unlockEdit;
    req.pubKey = "xxxxxx";
    wssocket.send(JSON.stringify(req));

    {
        "action":"onUnlockEdit",
        "status":"success",
        "data":"04c4c855862b53f323e077ccfcc744ecc2c0a04645ed16d99ede8fd5866b38c0670a97ad22c6260d1a4672aba2a5fe229a2d4eba34627c054aab102620afa288c1"
    }

### 合约实例管理类

#### 查询合约进程

向服务器发送请求, 查询服务器上已经启动的所有合约进程.

##### 参数

字段 | 值
--- | ---
action | listContractProcess

##### 请求示例

    var request = {};
    request.action = "listContractProcess";
    wssocket.send(JSON.stringify(request));

##### 返回结果示例

    {
        "status": false,
        "action": "onListContractProcess",
        "data": "[...]"
    }

#### 调用合约

向服务器发送请求, 调用某个合约.

##### 参数

字段 | 值
--- | ---
action | executeContract
contractID | 合约ID
withDynamicAnalysis | true/false 是否进行动态分析,可选
operation | 调用合约的方法名
arg | 调用合约的参数
pubkey | 调用者公钥,可选
signature | 调用者签名 ,可选

`*`表示可选参数

    //sm2 可从sm2.js中加载获得。
    signature = sm2.doSignature(contractID+"|"+operation+"|"+arg+"|"+pubkey,privateKey);

##### 请求示例

    var request = {};
    request.action = "executeContract";
    request.contractID = "2073401446";
    request.operation = "main";
    request.arg = "hhhhh";
    wssocket.send(JSON.stringify(request));

##### 返回结果示例

    {
        "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"
    }

#### 输出历史记录日志(删除)

向服务器发送请求, 获取节点服务器上合约的TimeTravel日志.

##### 参数

字段 | 值
--- | ---
action | printTimeTravelLog

##### 请求示例

    var request = {};
    request.action = "printTimeTravelLog";
    wssocket.send(JSON.stringify(request));

##### 返回结果示例

    {
        "status": false,
        "data": "[CMActions] dumpContract :…t/contractExamples/memoryDumps/LicenceManager\n"
    }

#### 输出节点转移日志（删除）

向服务器发送请求, 获取节点服务器的状态转移日志.

##### 参数

字段 | 值
--- | ---
action | printTransferLog

##### 请求示例

    var request = {};
    request.action = "printTransferLog";
    wssocket.send(JSON.stringify(request));

##### 返回结果示例

     {
        "status": false,
        "data": ""
    }

#### 合约状态迁移

向服务器发送请求, 获取节点服务器的状态转移日志.

##### 参数

字段 | 值
--- | ---
action | loadMemory
contractName | 合约名称
memoryFile | 合约文件名称

##### 请求示例

    var request = {};
    request.action = "loadMemory";
    request.contractName = "JsonContract";
    request.memoryFile = "2020-03-17.20/42/55";
    wssocket.send(JSON.stringify(request));

##### 返回结果示例

    {
        "data":"success",
        "size":"0.00 B",
        "action":"onTransferTo",
        "time":"0.01s"
    }

### 日志查看类

#### 查看本地近n日节点日志（删除）

##### 参数

字段 | 值
--- | ---
action | listLocalNodeLog
date | 当前时间

##### 请求示例

    request.action = "listLocalNodeLog";
    request.date = new Date().getTime() - 24 * 3600 * 1000 * n;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
       "data":"[{\"action\":\"login\",\"pubKey\":\"null\",\"status\":\"accept\",\"date\":1583139323822}\",]"
    }

#### 查看本地近n日合约日志（删除）

##### 参数

字段 | 值
--- | ---
action | listLocalContractLog
date | 当前时间

##### 请求示例

    request.action = "listLocalContractLog";
    request.date = new Date().getTime() - 24 * 3600 * 1000 * n;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "data":"[\"{\"action\":\"startContract\",\"pubKey\":\"04405d7ba358d9234939623ab51ea94ca685e6a1f36ed81fd9630ccba6473e632f163bb30faffd4c91f21e5bace20101d6d6e36c04ac67eea14cc24b4962b84f57\",\"contractID\":\"845581788\",\"contractName\":\"null\",\"date\":1583141525539}\"]"
    }

### 节点配置类

#### 获取节点配置信息

##### 参数

字段 | 值
--- | ---
action | loadNodeConfig

##### 请求示例

    var param = {};
    param.action = "loadNodeConfig";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "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"
        }
    }

#### 修改节点配置

##### 参数

字段 | 值
--- | ---
action | updateConfig
key | 要改的配置项
val | 要更改的目标值

其中，key的可选项包括：

key的示 | val示例 | 说明
--- | --- | ---
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端口

其中NodePortal的TCP端口为Node的http/ws端口号+1。

#### 修改节点名称

##### 参数

字段 | 值
--- | ---
action | changeNodeName
data | 新的节点名称

##### 请求示例

    var param = {};
    param.action = "changeNodeName";
    param.data = "NewNodeName";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status": true,
        "action": "onChangeNodeName",
        "data": true
    }

#### 修改节点YJS路径

##### 参数

字段 | 值
--- | ---
action | changeYJSPath
data | 节点服务器yjs.jar路径

##### 请求示例

    var param = {};
    param.action = "changeYJSPath";
    param.data = "/Users/xxx/docs/BDWareHttp/generatedlib/yjs.jar";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status": true,
        "action": "onChangeYJSPath",
        "data": true
    }

#### 修改NodeCenter

##### 参数

字段 | 值
--- | ---
action | changeNodeCenter
data | 节点服务器要连接的NodeCenterWebSocket路径

##### 请求示例

    var param = {};
    param.action = "changeNodeCenter";
    param.data = "ws://127.0.0.1:1719/SCIDE/NodeCenter";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status": true,
        "action": "onChangeNodeCenter",
        "data": true
    }

#### 修改账本节点

##### 参数

字段 | 值
--- | ---
action | changeBDledger
data | 数链节点的IP:port,用“,”隔开

##### 请求示例

    var param = {};
    param.action = "changeBDledger";
    param.data = "39.108.56.240:18091,39.108.56.12:18091";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status": true,
        "action": "onChangeBDledger",
        "data": true
    }

#### 上传节点Licence

##### 参数

字段 | 值
--- | ---
action | uploadLicence
data | 节点服务器的Licence内容

##### 请求示例

    var param = {};
    param.action = "uploadLicence";
    param.data = "04AADCC7103C";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status": true,
        "action": "onUploadLicence",
        "data": true
    }

#### 获取节点ID

##### 参数

字段 | 值
--- | ---
action | getNodeID

##### 请求示例

    var param = {};
    param.action = "getNodeID";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "status": true,
        "action": "onGetNodeID",
        "data": "0431…d3a92e1184bbc5817ebda5c2ad498e4ff1d240009b4f06d"
    }

#### 获取节点所在的可信执行集群

##### 参数

字段 | 值
--- | ---
action | getNodeTrustUnits
data | 节点ID
msgHandler | 收到回复的回调函数, 可使用“建立连接”的msgHandler
ws | 节点所属的NodeCenter的WebSocket地址

##### 请求示例

    centerportalws = createWssocket("ws://127.0.0.1:1718/NodeCenterWS",function() {
    var param = {};
    param.action = "getNodeTrustUnits";
    param.data = "0431e311bd70840fe69965e2cabea97fafe99f2133953c01abb9bd7cb62af42f8283f474d203051e920d3a92e1184bbc5817ebda5c2ad498e4ff1d240009b4f06d";
    centerportalws.send(JSON.stringify(param));
    }, msgHandler);

##### 返回结果

    {
        "data": [{
            "key": "0475c7b061...65e55_4063665700873624164",
            "value": "[\"04541429c11b094…40009b4f06d\"]"
        }],
        "action": "onGetNodeTrustUnits"
    }

### 模板生成类

#### 获取合约模板列表

##### 参数

字段 | 值
--- | ---
action | getTemplateList

##### 请求示例

    req={};
    req.action = "getTemplateList";
    wssocket.send(JSON.stringify(req));

##### 返回结果

    {
        "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"
    }

#### 空白合约模板

##### 参数

字段 | 值
--- | ---
action | generateEmptyProject
contractName | 字符串类型，合约名称
isPrivate | 布尔类型，是否为私有项目
accessPolicy | 若为“DAC”，则实现直接访问控制

##### 请求示例

    var req = {};
    req.contractName = "Empty22";
    req.action = "generateEmptyProject";
    req.accessPolicy = "DAC";
    //wssocket为建立好的连接
    wssocket.send(JSON.stringify(req));

##### 返回结果

    {
        "action":"onListProjects",
        "data":"[\"AnnotationSample\",\"AppDataAnalysis\",\"AppDataSource\"]",
        "executeTime":0,
        "isPrivate":false
    }

#### MySQL接入合约

##### 参数

字段 | 值
--- | ---
action | generateMySQLProject
contractName | 字符串类型，合约名称
isPrivate | 布尔类型，是否为私有项目
dbUrl | 字符串类型，数据库的URI
dbUserName | 字符串类型，数据库的用户名
dbPWD | 字符串类型，数据库密码
accessPolicy | 若为“DAC”，则实现直接访问控制，若为“NAC”则没有访问控制
tableName | 字符串类型，数据库的表名
fieldList | 字符串列表，数据库的字段列表
defaultAccept | 布尔值，表示申请时是否默认有权

##### 请求示例

    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));

##### 返回结果

    {
        "action":"onListProjects",
        "data":"[\"CSVFromTemplate\",\"Empty22\",\"Hello\",\"MySQLFromTemplate\",\"test\"]",
        "executeTime":0,
        "isPrivate":true
    }

#### CSV接入合约

##### 参数

字段 | 值
--- | ---
action | generateCSVProject
contractName | 字符串类型，合约名称
base64EncodedData | 字符串类型，通过base64编码后的CSV文件内容
isPrivate | 可选字段，布尔类型，是否为私有项目
accessPolicy | 若为“DAC”，则实现直接访问控制，若为“NAC”则没有访问控制
defaultAccept | 可选字段，布尔值，表示申请时是否默认有权

##### 请求示例

    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));

##### 返回结果

    {
        "action":"onListProjects",
        "data":"[\"CSVFromTemplate\",\"Empty22\",\"Hello\",\"MySQLFromTemplate\",\"test\"]",
        "executeTime":0,
        "isPrivate":true
    }

## 路由节点WebSocket接口

### 用户管理类

#### 获取Session

登录前获取session以便进行签名。

##### 参数

字段 | 值
--- | ---
action | getSessionID

##### 请求示例

    var req = {};
    req.action = "getSessionID";
    wssocket.send(JSON.stringify(req));

##### 返回结果

    {
        "action": "onSessionID",
        "session": "9782323_session"
    }

#### 用户登录

用户进行公私钥身份验证，需先调用“getSessionID”获取sessionID以便于签名。

##### 参数

字段 | 值
--- | ---
action | login

##### 请求示例

    var loginParam = {};
    loginParam.pubKey = global.sm2Key.publicKey;
    loginParam.signature = sm2.doSignature(global.session,
                global.sm2Key.privateKey);
    loginParam.action = "login";
    wssocket.send(JSON.stringify(loginParam));

##### 返回结果示例

    {
        "action": "onLogin",
        "data": "CenterManager"
    }

#### 用户获取当前角色(删除)

用户根据登录时的公钥获取对应的角色，如果是第一次登录则此时的公钥默认称为准入管理员

##### 参数

字段 | 值
--- | ---
action | getRole

##### 请求示例

    var param = {};
    param.action = "getRole";
    wssocket.send(JSON.stringify(param));

##### 返回结果示例

    {
        "action": "onGetRole",
        "data": "CenterManager"
    }

#### 申请角色

在准入管理员界面可以申请称为组网中某个节点的节点管理员

##### 参数

字段 | 值
--- | ---
action | applyRole
role | 申请的角色名称

##### 请求示例

    var param = {};
    param.action = "applyRole";
    param.role="
    wssocket.send(JSON.stringify(param));

##### 返回结果示例

    {
        "action": "onApplyRole",
        "data": "failed"
    }

#### 添加节点

##### 参数

字段 | 值
--- | ---
action | addNode
nodePubKey | 要添加的节点公钥

#### 请求示例

    var req = {};
    //某节点的publicKey可通过连接该节点，并通过"获取节点配置信息"接口获取
    req.nodePubKey = publicKey;
    req.action = "addNode";
    wssocket.send(JSON.stringify(req));

#### 删除用户角色

##### 参数

字段 | 值
--- | ---
action | delete
pubKey | 对应用户的公钥

##### 请求示例

    var deleteInfo = {};
    deleteInfo.pubKey = user.publicKey;
    deleteInfo.action = "delete";
    wssocket.send(JSON.stringify(deleteInfo));

##### 返回结果示例

    {
        "action": "onDelete",
        "data": "success"
    }

#### 查看授权用户列表

查看准入管理员当前组网中已经授权的节点管理员

##### 参数

字段 | 值
--- | ---
action | listAllUsers

##### 请求示例

    var param = {};
    param.action = "onListAllUsers";
    wssocket.send(JSON.stringify(param));

##### 返回结果示例

    {
        "action": "onListAllUsers",
         "kv": {
            "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7",
            "value": " NodeManager"
        },
        "time": {
            "key": "049999ebd14ff3b96ebf7f7325e1da94a1c4c376573a1dc1cec2b4f7a3b09ed7b07252134e93b6ac2e1853268b82f4b541d34fb42b0182cd61043e99d3489e2cf7",
            "value": 1587398989914
        }
    }

#### 查看申请用户列表

##### 参数

字段 | 值
--- | ---
action | listApplyList

##### 请求示例

    var param = {};
    param.action = "onListApplyList";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onListApplyList",
         "kv": {
            "key": "04b00f32eab70c78d1b43738f190d326d36c021af2124acefe6d057016b11ea31c750bb473e565c9d89e4993a44f4d30adf447d3026a21ff4b3b64cef523074ef7",
            "value": " NodeManager"
        },
        "time": {
            "key": "04b00f32eab70c78d1b43738f190d326d36c021af2124acefe6d057016b11ea31c750bb473e565c9d89e4993a44f4d30adf447d3026a21ff4b3b64cef523074ef7",
            "value": 1587398989914
        }
    }

#### 查看用户类型分布

##### 参数

字段 | 值
--- | ---
action | queryUserStat

##### 请求示例

    var param = {};
    param.action = "onQueryUserStat";
    wssocket.send(JSON.stringify(param));

##### 返回结果示例

    {
        "action": "onQueryUserStat",
        "userListCount": 3,
        "applyListCount":0
    }

### 节点管理类

#### 查看节点列表

查看该用户有权限查看的节点列表(仅准入管理员及合约管理者可用)

##### 参数

字段 | 值
--- | ---
action | listNodes

##### 请求示例

    var param = {};
    param.action = "listNodes";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "offline": [{
            "key": "0431e31...40009b4f06d",
            "value": "0431e311bd708...b4f06d"
        }],
        "action": "onListNodes",
        "online": [{
            "contracts": [],
            "pubKey": "0431e311...09b4f06d",
            "nodeName": "NewNodeName",
            "udpID": "528822126",
            "cimanager": ""
        }]
    }

#### 查看可信执行集群列表

查看该用户有权限查看的节点列表(仅中心管理员及合约管理者可用)

##### 参数

字段 | 值
--- | ---
action | listTrustUnits

##### 请求示例

    var param = {};
    param.action = "listTrustUnits";
    wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "data": [{
            "key": "0470b2f27f4f6…1cb855f1ecec11",
            "value": "[...]"
        }],
        "action": "onListTrustUnits"
    }

#### 建立可信执行集群

##### 参数

字段 | 值
--- | ---
action | createTrustUnit
data | 节点公钥组成的Json数组
Msg | 集群名称

##### 请求示例

    var param = {};
    param.action = "createTrustUnit";
    param.data = "[\"382r0934309t...\",\"345343rr3f34...\"]";
    param.msg = "newUnit1";
    global.wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onCreateTrustUnit",
        "status": "Success"
    }

#### 删除可信执行集群

##### 参数

字段 | 值
--- | ---
action | deleteTrustUnit
data | 可信执行集群ID

##### 请求示例

    var param = {};
    param.action = "deleteTrustUnit";
    param.data = "0475d34rf3434..._1583410158761";
    global.wssocket.send(JSON.stringify(param));

##### 返回结果

    {
        "action": "onDeleteTrustUnit",
        "status": "Success"
    }

### 日志查看类

#### 查看组网管理操作的统计

##### 参数

字段 | 值
--- | ---
action | queryActionLog
date | 当前时间

##### 请求示例

    request.action = "onQueryActionLog";
    request.date = new Date().getTime() - 24 * 3600 * 1000 * n;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {   "action":"onQueryActionLog",
         "data":"[{\"action\":\"login\",\"pubKey\":\"null\",\"status\":\"accept\",\"date\":1583139323822}\",]"
    }

#### 查看本地近n日合约日志

##### 参数

字段 | 值
--- | ---
action | listLocalContractLog
date | 当前时间

##### 请求示例

    request.action = "listLocalContractLog";
    request.date = new Date().getTime() - 24 * 3600 * 1000 * n;
    wssocket.send(JSON.stringify(request));

##### 返回结果

    {
        "data":"[\"{\"action\":\"startContract\",\"pubKey\":\"04405d7b...\",\"contractID\":\"845581788\",\"contractName\":\"null\",\"date\":1583141525539}\"]"
    }

## Bash接口

已废弃。可使用BDWareConfigTool代替。 通过命令行发送Socket指令, 执行调用`ContractController`类中方法, 完成以下功能. (需要在本机的``1615``端口运行`ContractManager`实例)

Bash接口功能示意图

### 指令

    java -jar yjs.jar function_name arguments

`function_name`为调用的方法名;

`arguments`为方法参数.

### 启动合约

#### 参数

`function_name`为`startContract`;

`arguments`为启动合约需要的参数, 包括合约类型`type`, 合约ID`id`, 合约脚本`script`.

#### 指令示例

    java -jar yjs.jar startContract "{\"type\":\"Algorigthm\",\"id\":\"656565\",\"script\":\"contract c{function main(arg){return arg/1.0+1;}}\"}"

### 调用合约

#### 参数

`function_name`为`executeContract`;

`arguments`为调用合约需要的参数, 包括调用参数`arg`, 合约ID`contractID`.

#### 指令示例

    java -jar yjs.jar executeContract "{\"arg\":\"http://www.baidu.com\",\"contractID\":\"656564\"}"

### 停止合约

#### 参数

`function_name`为`stopContract`;

`arguments`为调用合约需要的参数, 即合约ID`contractID`.

#### 指令示例

    java -jar yjs.jar stopContract "{\"arg\":\"http://www.baidu.com\",\"contractID\":\"656564\"}"

### 停止全部合约

#### 参数

`function_name`为`stopAllContracts`.

#### 指令示例

    java -jar yjs.jar stopAllContracts

### 查询全部合约

#### 参数

`function_name`为`listContracts`.

#### 指令示例

    java -jar yjs.jar listContracts