{"_id":"@ddn/asset-supervise","_rev":"4-5efaf24d230fdc5e8d0ad4aace7bb103","name":"@ddn/asset-supervise","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@ddn/asset-supervise","version":"0.1.1","description":"DDN monitoring plug-in","main":"lib/index.js","module":"dist/index.esm.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["ddn","monitoring"],"author":{"name":"creazy"},"license":"ISC","dependencies":{"@ddn/asset-base":"^0.3.10","@ddn/utils":"^0.1.24","bytebuffer":"^5.0.1"},"gitHead":"3d73773bf2e3d9e6934f7334b498ee9b0dbaab67","_id":"@ddn/asset-supervise@0.1.1","_nodeVersion":"10.21.0","_npmVersion":"lerna/3.22.1/node@v10.21.0+x64 (darwin)","dist":{"integrity":"sha512-UJBy9+b7EzaPp2wzltb2IEA+Ximi6qK+vHXwKVnL46fWUSYAf6Xugd1L1g4twEIE2AcTm5daijTfOXF3bbXNMg==","shasum":"b6cc536ee4cd373b64bf1cc8278fbc769cb62ffe","tarball":"https://registry.npmjs.org/@ddn/asset-supervise/-/asset-supervise-0.1.1.tgz","fileCount":13,"unpackedSize":56808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf0V23CRA9TVsSAnZWagAAS+AQAIRe7oqsf5IHSF7VE5Go\nVqFv7rOLl0zuk+FJ7zlnGNRaO4jAsReyJCoR+7O5QPlTMNul6AJVrX+vIOve\nMz0QUuCFlJMm6xLVLlOkv6rc5/EDZ/tztypMKwzkNzMbeG0C9kZov0pTru41\nhVfiNM4j+fChCQ9E1fJvNWLeR95t1Cmx2kLU4pPaCP+Xsq3RYO5nurOKWVxV\nua4iJPhf4uJs9gs5sfcpvWSDMyI7hgCvVMnQoyJ5Kl/a4sZCnP0Ki3gIAiO0\nIX0Ht2VcIRVwGVESL3pATjD0leaRtSWzr8DZzkgK9pIVgTQk7zO3s6M0yc+G\nWJawZCSMMNuN4IlPyG5cua+uQpkn+8d38CdmqW9Oj2jis3SVb6WeFbSsPVWi\ns6Xges8W67zBI50mcJJuG57i43M2yhpSQRN8wg5dcBBOq2R20YCbewS040+E\neEAX9F4swIQTNCQ9Z3I0yVjeb0e5d+r1da+t6t87nBc3VFuZcJMcmb86ztTr\nUwF1U0nNSLdh+h++CPEAamzFCFgI1hZFgzzKVFNhbwfeNXgawKcBpsKccxlK\nZQh//cwAPHSM6k50z2Byk4C5Pv9riOazVk2dOxqtAp1ScH0XIrVy8TPtNKko\nMK3SY5IV3cCPJ3BMnVY9VSPpj4BSQFuuPIG6qg17wu89o2yWhM8uTdJBSwro\n6VzZ\r\n=ywmY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD5nN17WnqtOCvZWStZCdiXJfZC0oslHvi5uHoO+LDRTQIhAPC0XODNEyq2dssY4xstqYEjHIpb5c1t5TWFJ182PQiX"}]},"_npmUser":{"name":"imfly","email":"kubying@qq.com"},"directories":{},"maintainers":[{"name":"softwaiter","email":"softwaiter@126.com"},{"name":"evanlai","email":"Evanlai1989@hotmail.com"},{"name":"imfly","email":"kubying@qq.com"},{"name":"ebookchain","email":"service@ebookchain.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/asset-supervise_0.1.1_1607556534850_0.4196619136111197"},"_hasShrinkwrap":false},"0.2.0":{"name":"@ddn/asset-supervise","version":"0.2.0","description":"DDN monitoring plug-in","main":"lib/index.js","module":"dist/index.esm.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["ddn","monitoring"],"author":{"name":"creazy"},"license":"ISC","dependencies":{"@ddn/asset-base":"^0.4.0","@ddn/utils":"^0.2.0","bytebuffer":"^5.0.1","request-promise":"^4.2.6"},"gitHead":"0f6a538f7179cd8e631651445adaca5c4e276278","_id":"@ddn/asset-supervise@0.2.0","_nodeVersion":"10.21.0","_npmVersion":"lerna/3.22.1/node@v10.21.0+x64 (darwin)","dist":{"integrity":"sha512-44vV3hDrkcQX9smijzvOOuKdgbgMFv9vgm87D0A1xWnO9mIldeeK0XcvLEfk2kpW2TaU9RoOd7JVP+37utpAwQ==","shasum":"196f585347188b9b300405196672d5d8313e8817","tarball":"https://registry.npmjs.org/@ddn/asset-supervise/-/asset-supervise-0.2.0.tgz","fileCount":13,"unpackedSize":139699,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf0vKcCRA9TVsSAnZWagAA7mkP/jqZcDGQkn8/FHhacAmw\njLzBg6Ya0TAzc+0akt+cNsQrCW9xshe2MDiJ0ol417Le7ZCmvnO4Yc+Xocq3\nxygkiYOSF0OMXrC/xbiUlLyrfsbl11uzV48PL7ESDbRuMz+L81wgLnctqUWx\nGW99B3lP9umv3KWyjBH7EHBI4Bo/JAZhJc1gRtxcp+2GnneA7PUNXAGtyi2r\nxNhD6v3O6zKR/kiTLkHuQXceJ7i8GBqdGHZyGNM03zCld42Lsd2W8p/cy2yo\naBtjyATZXgijL/2n465qYgBMxBcfJr5vUZ5N6i/VeYYbGBUNybXF+zY6vvRo\nWVeFtuGmheovRfZvq8G1kWeM2L0SgyViAUrx9NYC3h2Y/11Z+XiAX8RMARCZ\n87UZbrigFOWBFr1S42yC1RVS/xqNRXCbmEZMyXE1sseCRnC2ydJtXgtqeFGQ\nXDUAc7H0lPGw7iSauaIhuEIffl7SkRmZ+Bp1AewHq79LdVdxUIolV45IpiW0\nSDk73OFrPydiSTbiEF8L3E33fHJzxBDZQ5PBv8SQJgfjfBgL/YZzEIPhvFvy\nwdQLQlsFJzLZnv6w5taENear8KkoOeLdAtKGL8usJtWKnG70OHJcPlcPmEy5\nw4GFaJV9Njl0SjaUZZupsXzTsu3OmxknioUzYQZgGvy9AkkNtOA7gG0UORqS\nwXCO\r\n=P7i9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtKBuNI9GsBaVPxzpmotruhoqkjnKAGrEAUjgbAQvs9gIhANQcP/Q6Ddqj5ADhsLSFqU9ElnWn5afoOfErnfTiQbbf"}]},"_npmUser":{"name":"imfly","email":"kubying@qq.com"},"directories":{},"maintainers":[{"name":"evanlai","email":"Evanlai1989@hotmail.com"},{"name":"imfly","email":"kubying@qq.com"},{"name":"ebookchain","email":"service@ebookchain.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/asset-supervise_0.2.0_1607660187743_0.8009061050928235"},"_hasShrinkwrap":false}},"time":{"created":"2020-12-09T23:28:54.654Z","0.1.1":"2020-12-09T23:28:55.034Z","modified":"2022-04-05T03:25:07.708Z","0.2.0":"2020-12-11T04:16:27.952Z"},"maintainers":[],"description":"DDN monitoring plug-in","keywords":["ddn","monitoring"],"author":{"name":"creazy"},"license":"ISC","readme":"\n# 安装\n\n在package/peer中安装\n```bash\nnpm install @ddn/asset-supervise --save\n```\n# 使用\n \n 在.ddnrc.js文件中配置如下\n\n```bash\n assets: [\n  ...\n    \"@ddn/asset-supervise\",\n  ...\n  ],\n```\n\n# 屏蔽违规内容\n\n## 上传屏蔽交易\n请求参数说明：\n\n|名称\t|类型   |必填 |说明              |   \n|------ |-----  |---  |----              |   \n|transaction|json|Y|DdnJs.supervise.createSupervise根据txHash(对应交易id）、op:管控指令：destroy（过滤整个内容）、harmless(从滤敏感词转标记为无害)|\n\n返回参数说明：\n\n|名称|类型|说明|\n|------|-----|----|\n|success|boolean|是否成功获得response数据。|\n|transactionId|string|交易id|\n\n   \n请求示例：   \n```js   \nlet supervise={\n  txHash:\"2b6865011739b3b7e7a564a06609ba3a937cea718f873c0f650bcfe8cac96f34fc8e796da0c0161e911d7c5d6e5c8c9deedfd156beff2438fd185392a1fe4b8f\",//交易id\n  op:\"destroy\" // 屏蔽类型\n}\n let transaction=await DdnJs.supervise.createSupervise(supervise,Eaccount.password)\n console.log(JSON.stringify({transaction}))\n}\n结果\n\n{\"transaction\":{\"type\":90,\"nethash\":\"0ab796cd\",\"amount\":\"0\",\"fee\":\"0\",\"recipientId\":null,\"senderPublicKey\":\"155a780f875a3c384c1a0856e36b2de7e145a9738e72f9a75a85d26a16471757\",\"timestamp\":95972015,\"asset\":{\"supervise\":{\"txHash\":\"2b6865011739b3b7e7a564a06609ba3a937cea718f873c0f650bcfe8cac96f34fc8e796da0c0161e911d7c5d6e5c8c9deedfd156beff2438fd185392a1fe4b8f\",\"op\":\"destroy\"}},\"signature\":\"75b46d7d3143d30547151b98307f9b135edef731380dbdebcb685da44e0f274e645153538268172e93e521fe6d4546a786dd7c6860878005238e834d38cdff08\",\"id\":\"732afc1de17b16b57774b9ea6b98de0a54841fd3ea309f27115adb63a81a690c0b54f3b4f51708f3877d92108571f88b6266ea2b22b2355f8ee6582fdfaa53da\"}}\n\n发送交易\ncurl --location --request POST 'http://localhost:8001/peer/transactions' \\\n--header 'nethash: 0ab796cd' \\\n--header 'version: \"\"' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\"transaction\":{\"type\":90,\"nethash\":\"0ab796cd\",\"amount\":\"0\",\"fee\":\"0\",\"recipientId\":null,\"senderPublicKey\":\"155a780f875a3c384c1a0856e36b2de7e145a9738e72f9a75a85d26a16471757\",\"timestamp\":95971335,\"asset\":{\"supervise\":{\"txHash\":\"2b6865011739b3b7e7a564a06609ba3a937cea718f873c0f650bcfe8cac96f34fc8e796da0c0161e911d7c5d6e5c8c9deedfd156beff2438fd185392a1fe4b8f\",\"op\":\"destroy\"}},\"signature\":\"c1cae6624a38081d65183e2eb4a2d8ad251456aead1c0ce8840710eb9021960211ec1823fcc5873413696b316f94e149400ca52a2ecec7ff434f7897506a6602\",\"id\":\"13a9d70bedefac6f9690fac087e5972bd5da2b1d2491a2b7838b2211de5ae84043b49dba9f375c4ff58da025ab201a2890dc839bc73b4eee8e0e0e652759dd96\"}}'\n```\n## 查询屏蔽结果\n\n```bash\ncurl --location --request GET 'http://localhost:8001/api/transactions/get?id=2b6865011739b3b7e7a564a06609ba3a937cea718f873c0f650bcfe8cac96f34fc8e796da0c0161e911d7c5d6e5c8c9deedfd156beff2438fd185392a1fe4b8f' \\\n--header 'nethash: 0ab796cd' \\\n--header 'version: '\n```\n\n# 监管接口说明\n\n# 1 链上监管-下达巡检指令\n方向：监管系统 -> 受监管链 \n对受监管链下达巡检指令，受监管链接受该指令后返回响应表示接受该任务，并异步进行巡检，巡检完成后调用接口1003汇报巡检结果。\n\n对于受监管链而言：可以设置一个阈值，在该阈值时间内最多只接受一个活跃的巡检任务，以避免监管系统错误的频繁请求导致受监管链消耗大量的资源用于响应巡检需求（由于巡检任务会触发关键词检测，这个设计也同样保护监管系统的关键词服务）。\n\n 巡检：指全盘检测区块链上每一笔交易(例如遍历创世块到最新区块的每一笔交易)，并对交易内容做敏感词检测[(3.1 1000 敏感词检测)](#3.1 1000 敏感词检测)，命中敏感词的交易进行上报[(3.4 1003 链上监管-上报巡检结果)](#3.4 1003 链上监管-上报巡检结果) 。\n\n请求\nPOST /v1/sys/inspection\n\n```JSON\n{\n  \"taskId\": \"a55d649f3fc8464a7d32193d04a7e7\"\n}\n```\n参数说明\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|----              |   \ntaskId|string|是任务id，在接口1003会用到\n\n响应\n成功响应\n```JSON\n{\n  \"success\": true,\n  \"message\": \"ok\"\n}\n```\n失败响应\n```JSON\n{\n  \"success\": false,\n  \"message\": \"失败原因\"\n}\n```\n\n## 2  下发管控指令\n方向：监管系统 -> 受监管链 \n监管系统可以对接口1001和接口1003的内容下发管控指令，由监管系统对业务链包含敏感词的交易下达监管及屏蔽操作，业务链收到指令后需要安装指令对相关交做出屏蔽或过滤，防止其在公众领域进行传播。\n\n此接口需要受监管链进行实现，监管平台将根据受监管链IP：端口号或域名向受监管链发送该请求。\n\n若重复下达命令则幂等处理。\n\n请求\nPOST /v1/sys/cmd    \n\n```JSON\n{\n  \"txHash\": \"0x128acf9e443f371b8ebfb1082384ed2b64eade57fe6611ff5c5ccf697461ddc4\",\n  \"op\": \"destroy\"\n}\n```\n参数说明\n\n\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|----              |  \ntxHash|string|是|交易哈希|\nop|String|是|管控指令：destroy（过滤整个内容）、harmless(从滤敏感词转标记为无害)\n\n不同类型op对应的处理方式：\n\ndestroy: 对该交易全部内容过滤，可以用内容违反相关法规，不予显示替代\nharmless:对已过滤敏感词，转标记为无害\n响应\n成功响应\n```JSON\n{\n  \"success\": true,\n  \"message\": \"ok\",\n  \"data\": {\n    \"reviewType\": \"browser\",\n    \"reviewUrl\": \"http://browser.blockchain.org/tx/128acf9e443f371b8\"\n  }\n}\n```\n参数说明\n\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|---- |  \nreviewType|enum|是|核验类型：browser（浏览器跳转核验）、api（接口请求核验）\nreviewUrl|string|是|触发获取改管控后的交易信息，用于核验不同类型的reviewType对应的含义：browser: 通过浏览器来核验，一般是受监管链有一个类似区块链浏览器的访问界面，并且无需登录即可访问；监管系统可以通过reviewUrl访问该界面对管控后的结果进行核验；api: 通过api来核验，一般是受监管链因为业务限制，无法提供一个无需登录即可访问的界面，此时受监管链应该根据实际业务逻辑，返回一个同应用层读取该交易时结果一致的接口，监管系统可以通过reviewUrl的方式访问该接口（带鉴权）进行核验；\n失败响应\n```JSON\n{\n  \"success\": false,\n  \"message\": \"失败原因\"\n}\n```\n\n## 3 心跳检测\n方向：监管系统 -> 受监管链 \n受监管链通过监督管理节点和监管系统连接，由于链前监管上报和链上监管指令都是非定期行为，为了能及时感知所有受监管链的健康状态，需要在监管系统和受监管链设计一种心跳机制，保证监管系统有能力监控受监管链的存活状态。因此受监管链需要提供心跳检测接口由监管系统主动发起调用请求。\n\n流程\n心跳包由监管系统定期向受监管链发起，一次心跳包的往返流程如下所示：\n\nPlain  Text\n监管系统                                                受监管链\n---------------------------------------\n[send hearbeat]\n   |\n     |          \n     |----- (old checkpoint) ---->> |\n                                                                    |\n                                                  [receive & check]\n                                                            |\n     |<<-(new checkpoint, txs info)-|\n     |\n     |\n[save]\n   \n\n        \n\n这一过程的细节是：\n\n监管系统向受监管链发送一次心跳包，包内包含上一次的检查点信息，例如区块高度；\n受监管链收到心跳包后确认检查点信息，并搜集从该检查点之后产生的区块和交易信息[checkpoint,checkpint+n)(心跳检测属于同步响应请求，n自己定义，响应时间要在5秒内)；\n受监管链以checkpint+n作为新的检查点，连同区块和交易的摘要信息一起返回；\n监管系统接收到信息后进行保存，并更新该受监管链的健康状态。\n请求\nPOST /v1/sys/heartbeat\n\n```JSON\n{\n  \"taskId\":\"0x2345678abc12\",\n  \"checkpoint\": 0\n}\n```\n参数说明\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|---- |  \ntaskId|string|是|心跳任务Id\ncheckpoint|int|是|监管系统本地保存的最新检查点，受监管链应该根据该信息确认需返回的结果集合边界。集合边界应为[chekpoint, checkpoint+n)（左闭右开），因为checkpoint初始值为0，不同的受监管链区块链特性不同，可能不存在0区块的概念，则可用1来代替0\n\n响应\n成功响应\n```JSON\n{\n  \"success\": true,\n  \"message\": \"ok\",\n  \"data\": {\n    \"taskId\":\"0x123456acb\",\n    \"checkpoint\": 12,\n    \"blocks\": [\n      {\n        \"height\": 11,\n        \"hash\": \"0x128acf9e443f371b8ebfb1082384ed2b64eade57fe6611ff5c5ccf697461ddc4\",\n        \"parentHash\": \"0xec8e43d184e799695e723038eaf1acd7964547b65b1507c910e11e01da9bbe16\",\n        \"createdAt\": 1585387890,\n        \"txs\": [\n          {\n            \"hash\": \"0x128acf9e443f371b8ebfb1082384ed2b64eade57fe6611ff5c5ccf697461ddc4\",\n            \"fromAcct\": \"0xa55d649f3fc8464a7d32193d04a7e7eb30cc6bb7\",\n            \"toAcct\": \"0xa55d649f3fc8464a7d32193d04a7e7eb30cc6bb7\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n参数说明\n\n\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|----   \ntaskId|string|是|心跳任务Id\ncheckpoint|int|是|最新的检查点\nblocks|array|是|包含的区块集合\n -- height|int|是|区块高度\n|-- hash|string|是|区块哈希\n -- parentHash|string|是|父区块哈希，创世区块则为空字符串\n|-- createdAt|long|是|区块创建时间（秒）\n|-- txs|array|是|区块包含的交易集合\n｜｜-- hash|string|是|交易哈希\n｜｜-- fromAcct|string|是|交易发起方账号\n｜｜-- toAcct|string|是|交易接收方账号\n\n失败响应\n```JSON\n{\n  \"success\": false,\n  \"message\": \"失败原因\"\n}\n```\n如果是业务级失败，则返回失败原因。\n\n如果是其他原因失败（网络超时、网络中断），则由系统根据具体原因进行记录。\n\nPlain  Text\n类似这样：\n假设你当前最高块高是57，\n我发起心跳检测，checkpoint=1\n然后要返回 blocks [1,1+n) ,如果n=10 则[1,11) checkpoint=11\n然后我收到之后记录checkpoint=11\n下次发起心跳检测，则checkpoint=11\n然后要返回 blocks [1,1+n) ,如果n=10 则[1,21) checkpoint=21\n.....\n\n一直到最高块高\n\n## 4 链上监管-下达取消巡检指令\n方向：监管系统 -> 受监管链 \n对受监管链下达取消巡检指令，受监管链接受该指令后返回响应表示取消巡检指令任务。\n\n请求\nDELETE /v1/sys/inspection/{taskId}\n\n参数说明\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|---- |  \ntaskId|string|是|任务id，从1002获取任务Id\n\n响应\n成功响应\n```JSON\n{\n  \"success\": true,\n  \"message\": \"ok\"\n}\n```\n失败响应\n```JSON\n{\n  \"success\": false,\n  \"message\": \"失败原因\"\n}\n```\n## 5 链上监管-下达获取巡检状态\n方向：监管系统 -> 受监管链 \n对受监管链下达获取巡检状态，受监管链获取巡检状态。\n\n请求\nGET /v1/sys/inspection/{taskId}\n\n参数说明\n\n|名称\t|类型 |必填 |说明|   \n|------|-----|---|---- |  \ntaskId|string|是|任务id，从1002获取任务Id\n\n响应\n成功响应\n```JSON\n{\n  \"success\": true,\n  \"message\": \"ok\",\n  \"data\":{\n    \"status\": \"complete\",\n    \"height\": 100,\n    \"offset\": 0\n  }\n}\n```\n失败响应\n```JSON\n{\n  \"success\": false,\n  \"message\": \"失败原因\"\n}\n```\n参数说明\n\nstatus:  complete表示巡检完成，failure表示巡检失败，processing表示巡检执行中，none表示巡检任务已取消\nheight：表示下达巡检任务时刻的最高块高度\noffset：表示当前已经巡检的块高；例如：比如下达巡检任务时区块链最高块高度1000，当前已巡检到的块高度为56，这时 height=1000，offset=56","readmeFilename":"README.md"}