|
87 | 87 | - **3.9 通过ChainSQL API对表的读操作** |
88 | 88 | - 表的读操作,直接传入底层读本地的数据库 |
89 | 89 |
|
90 | | -- **3.10 数据的回滚** |
91 | | - - 可以根据日志表进行数据的回滚,或整个表的重建 |
92 | | - |
93 | | -- **3.11 事务的支持** |
| 90 | +- **3.10 事务的支持** |
94 | 91 | - 上层API提供事务操作的接口,使用本功能的前提是按照3.5配置好本地数据库,然后按照3.7打开自动同步开关。 |
95 | 92 |
|
96 | | -- **3.12 Raw字段加密** |
| 93 | +- **3.11 Raw字段加密** |
97 | 94 | - 如果出于保密性考虑,对于某张表的操作不想让其它用户看到,可以选择在操作表时对Raw字段加密,密码在创建表时随机生成,用生成的密码对Raw字段进行对称加密,密码使用公钥加密存放,只有表的创建者与被授权的用户可以用自己的私钥去解密,拿到解密后的密码之后再对Raw字段进行对称解密,才能看到Raw字段的明文。 |
98 | 95 | - 如果需要同步某张使用Raw字段加密的表,需要在节点的配置文件中配置拥有读权限的用户私钥,配置格式参考3.4。 |
99 | 96 | - 需要注意的是,对于先入库功能,需要在配置先入库的节点提前配置用户私钥,对于事务类型的交易,因为交易中会出现查询类型的交易,其中包含加密的raw字段,所以需要在共识节点配置用户私钥才能共识通过。 |
100 | 97 |
|
101 | | -- **3.13 Strict模式** |
| 98 | +- **3.12 Strict模式** |
102 | 99 | - 在限制模式下,语句共识通过的条件是期望的表的快照HASH与预期一致。 |
103 | 100 | - 第一次建表时,快照HASH=HASH(建表的Raw)。 |
104 | 101 | - 增删改操作时,快照HASH=HASH(上次的快照HASH+操作的Raw)。 |
105 | 102 | - 授权、改表名、删除表时不修改快照HASH。 |
106 | 103 |
|
107 | | -- **3.14 表的行级控制(P2)** |
| 104 | +- **3.13 表的行级控制(P2)** |
108 | 105 | - 表的增删改查支持行级控制 |
109 | 106 | - 插入表可设置默认填写字段(账户字段、交易哈希字段) |
110 | 107 | - 插入表可限制单个账户的插入条数 |
111 | 108 | - 更新表可限制允许更新的字段 |
112 | 109 | - 更新、删除、查询表可限制条件,规则参见8.Raw字段详解 |
113 | 110 |
|
114 | | -- **3.15 表、交易的订阅(P2)** |
| 111 | +- **3.14 表、交易的订阅(P2)** |
115 | 112 | - 通过提供表的创建者账户地址与表名订阅一张表 |
116 | 113 | - 订阅表成功后,与表相关的交易结果(共识或入库)都会通过回调返回 |
117 | 114 | - 通过提供交易哈希订阅单个交易(支持Ripple始交易类型) |
118 | 115 | - 交易订阅成功后交易的共识结果与入库结果(Chainsql)会通过回调返回 |
119 | 116 | - 取消订阅必需与要取消的订阅在同一个websocket连接中执行 |
120 | 117 |
|
121 | | -- **3.16 表的重建(P2)** |
| 118 | +- **3.15 表的重建(P2)** |
122 | 119 | - 通过表的重建功能可对区块链进行“瘦身” |
123 | 120 | - 可通过表的重建功能将表的创建点移到新建区块 |
124 | 121 | - 重建表之前通过dump导出表相关交易 |
125 | 122 | - 表重建后可通过重新发送交易重建表的数据 |
126 | 123 |
|
127 | | -- **3.17 dump** |
| 124 | +- **3.16 dump** |
128 | 125 | - 将数据库表的操作以文档的形式进行记录,可以分多次对同一张表进行dump。 |
129 | 126 | - 实现方式:通过Commandline方式进行操作。 |
130 | 127 | - 命令形式:chainsqld “para1” “para2” |
|
133 | 130 | - 例:chainsqld t_dump “z9VF7yQPLcKgUoHwMbzmQBjvPsyMy19ubs table1 2000” “/chainsql/table1.dmp” |
134 | 131 |
|
135 | 132 |
|
136 | | -- **3.18 审计** |
| 133 | +- **3.17 审计** |
137 | 134 | - 对数据库表的指定条目特定字段进行追根溯源,将所有影响了指定条目特定字段的数据库表操作都记录下来。 |
138 | 135 | - 实现方式:通过Commandline方式进行操作。 |
139 | 136 | - 命令形式:chainsqld “para1” “para2” “para3” |
|
142 | 139 | - Para3 : 数据库表操作保存的目标路径。 |
143 | 140 | - 例:chainsqld t_audit “z9VF7yQPLcKgUoHwMbzmQBjvPsyMy19ubs table1 2000” “select name, salary from table1 where id=1” “/chainsql/table1.dmp” |
144 | 141 |
|
145 | | -- **3.19 Chainsql链瘦身操作步骤**<br> |
| 142 | +- **3.18 Chainsql链瘦身操作步骤**<br> |
146 | 143 | 前提:节点保存链上的所有表且所有表已经是最新的,并且在清理数据期间没有别的对表的操作。<br> |
147 | 144 | 操作步骤: |
148 | 145 | 1. 用dump命令将表导出至文件存档,以备以后检索 |
|
954 | 951 | "tx_json": { |
955 | 952 | "TransactionType": "TableListSet", |
956 | 953 | "Account": "rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q", |
957 | | - "Owner": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", |
958 | 954 | "Tables": [ |
959 | 955 | { |
960 | 956 | "Table": { |
961 | | - "TableName": "EName2" //hex形式 |
| 957 | + "TableName": "EName2", //hex形式 |
| 958 | + "TableNewName":"tableNewName", //hex形式 |
962 | 959 | } |
963 | 960 | } |
964 | 961 | ], |
965 | | - "TableNewName": "tableNewName", //hex形式 |
966 | | - "PublicKey": "cBP8JEiNXr3a9nnBFDNKKzAoGNezoXzsa1N8kQAoLU5F5HrQbFvs", |
967 | | - "Raw": [ |
968 | | - { |
969 | | - "field": "id", |
970 | | - "type": "int", |
971 | | - "length": 11, |
972 | | - "PK": 1, |
973 | | - "NN": 1, |
974 | | - "UQ": 1 |
975 | | - }, |
976 | | - { |
977 | | - "field": "age", |
978 | | - "type": "int" |
979 | | - } |
980 | | - ], //hex形式 |
981 | | - "Flags": 65536, |
982 | | - "StrictMode": true, |
983 | | - "OpType": 1 |
| 962 | + "OpType": 3 |
984 | 963 | } |
985 | 964 | } |
986 | 965 | ``` |
987 | | - 备注: |
988 | | - Raw字段、TableName字段以hex形式传入 |
| 966 | +``` |
| 967 | + 备注: |
| 968 | + Raw字段、TableName、TableNewName字段以hex形式传入 |
989 | 969 | TransactionType与OpType字段的取值根据实际操作来修改 |
990 | | - 创建表用到的字段:Secret,TransactionType,Account,Tables,Raw,OpType |
991 | | - 授权表用到的字段:Secret,TransactionType,Account,Tables,PublicKey,Flags,Optype |
992 | | - 增删改操作的字段:Secret,TransactionType,Account,Tables,Raw,OpType |
| 970 | + 创建表用到的字段:TransactionType,Account,Tables,Raw,OpType |
| 971 | + 授权表用到的字段:TransactionType,Account,Tables,PublicKey,User,Flags,Optype |
| 972 | + 增删改操作的字段:TransactionType,Account,Tables,Raw,OpType |
| 973 | +``` |
993 | 974 |
|
994 | 975 |   Response Format: |
995 | 976 |
|
|
999 | 980 | "status": "success", |
1000 | 981 | "tx_json": { |
1001 | 982 | "Account": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", |
1002 | | - "Flags": 65536, |
1003 | | - "OpType": 1, |
1004 | | - "Owner": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", |
1005 | | - "PublicKey": "cBP8JEiNXr3a9nnBFDNKKzAoGNezoXzsa1N8kQAoLU5F5HrQbFvs", |
1006 | | - "Raw": [ |
1007 | | - { |
1008 | | - "NN": 1, |
1009 | | - "PK": 1, |
1010 | | - "UQ": 1, |
1011 | | - "field": "id", |
1012 | | - "length": 11, |
1013 | | - "type": "int" |
1014 | | - }, |
1015 | | - { |
1016 | | - "field": "age", |
1017 | | - "type": "int" |
1018 | | - } |
1019 | | - ], //hex形式 |
1020 | | - "TableNewName": "tableNewName", //hex形式 |
| 983 | + "OpType": 3, |
1021 | 984 | "Tables": [ |
1022 | 985 | { |
1023 | 986 | "Table": { |
1024 | 987 | "NameInDB": "4728A301542B8CE647D41A8D000F35900AEB3E09", |
1025 | | - "TableName": "EName2" //hex形式 |
| 988 | + "TableName":"EName2", //hex形式 |
| 989 | + "TableNewName":"tableNewName", //hex形式 |
1026 | 990 | } |
1027 | 991 | } |
1028 | 992 | ], |
1029 | | - "TransactionType": "TableListSet", |
1030 | | - "TxCheckHash": "9336DE2AB6C901312CF23957462FA8596F546B4F76191F0578F80EC6C8CB1C79" |
| 993 | + "TransactionType": "TableListSet" |
1031 | 994 | } |
1032 | 995 | } |
1033 | 996 | } |
1034 | 997 | ``` |
1035 | | - 备注: |
1036 | | - Token:创建表与操作授权表操作会添加 |
1037 | | - Raw:所有提供Raw字段的操作(创建表/增删改),Raw字段会被加密 |
| 998 | + |
1038 | 999 | |
1039 | 1000 | - **7.4 g_userToken** |
1040 | 1001 | - 得到用户对应某张表的token,得到token后,需用用户自己的私钥去解密,得到密码明文,然后用密码明文对raw字段进行AES对称加密<br> |
|
1072 | 1033 | ```json |
1073 | 1034 |
|
1074 | 1035 | { |
1075 | | - "TransactionType": " TableListSet", |
| 1036 | + "TransactionType": "TableListSet", |
1076 | 1037 | "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", |
1077 | 1038 | "Tables": [ |
1078 | 1039 | { |
|
1131 | 1092 | } |
1132 | 1093 | } |
1133 | 1094 | ], |
1134 | | - "OpType": 2, |
1135 | | - "Fee": 12, |
1136 | | - "Sequence": 2 |
| 1095 | + "OpType": 2 |
1137 | 1096 | } |
1138 | 1097 |
|
1139 | 1098 | ``` |
|
1154 | 1113 | } |
1155 | 1114 | } |
1156 | 1115 | ], |
1157 | | - "OpType": 3, |
1158 | | - "Fee": 12, |
1159 | | - "Sequence": 2 |
| 1116 | + "OpType": 3 |
1160 | 1117 | } |
1161 | 1118 |
|
1162 | 1119 | ``` |
|
1168 | 1125 | ```json |
1169 | 1126 | { |
1170 | 1127 | "TransactionType": "TableListSet", |
1171 | | - " Account ": "zf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", |
| 1128 | + "Account ": "zf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", |
1172 | 1129 | "Tables": [ |
1173 | 1130 | { |
1174 | 1131 | "Table": { |
|
1189 | 1146 | ] |
1190 | 1147 | } |
1191 | 1148 | ``` |
1192 | | - 备注: |
1193 | | - Token字段是可选的,加密方式创建的表在授权操作中需要提供用用户公钥加密过的密码的密文 |
| 1149 | +``` |
| 1150 | + 备注: |
| 1151 | + User: 被授权账户地址 |
| 1152 | + PublicKey: 给加密表授权时才用到,被授权用户公钥 |
| 1153 | + Token: 加密方式创建的表在授权操作中需要提供用用户公钥加密过的密码的密文 |
| 1154 | +``` |
| 1155 | + |
1194 | 1156 |   Response Format 同上 |
1195 | 1157 |
|
1196 | 1158 | - **7.9 t_recreate** |
|
1247 | 1209 | "name": "hello" |
1248 | 1210 | } |
1249 | 1211 | ], |
1250 | | - "AutoFillField": "TRACE_NO", |
1251 | | - "StrictMode": true, //可选字段: 不设置表示不使用strictMode |
1252 | | - "TxCheckHash": "xxxxx", //可选字段: 由g_prepare根据StrictMode的指示自动计算并插入 |
1253 | | - "OpType": 6, |
1254 | | - "User": "zBGagHrWQ44SX3YE7eYehiDA8iNPdBssFY", |
1255 | | - "Flags": 65536, |
1256 | | - "Fee": 12, |
1257 | | - "Sequence": 6 |
| 1212 | + "StrictMode": true, //可选字段:不设置表示不使用strictMode |
| 1213 | + "TxCheckHash": "xxxxx", //可选字段:由t_prepare根据StrictMode的指示自动计算并插入 |
| 1214 | + "OpType": 6 |
1258 | 1215 | } |
1259 | 1216 |
|
1260 | 1217 | ``` |
|
1277 | 1234 | } |
1278 | 1235 | } |
1279 | 1236 | ], |
1280 | | - "StrictMode": true, //可选字段: 不设置表示不使用strictMode |
1281 | | - "TxCheckHash": "xxxx", //可选字段: 由g_prepare根据StrictMode的指示自动计算并插入 |
| 1237 | + "StrictMode": true, //可选字段:不设置表示不使用strictMode |
| 1238 | + "TxCheckHash": "xxxx", //可选字段:由g_prepare根据StrictMode的指示自动计算并插入 |
1282 | 1239 | "Raw": [ |
1283 | | - { |
1284 | | - "id": 1, |
1285 | | - "name": "test" |
1286 | | - }, |
1287 | | - { |
1288 | | - "id": 2, |
1289 | | - "name": "hello" |
1290 | | - } |
| 1240 | + {"age": "11","name":"abc"}, |
| 1241 | + {"id":1} |
1291 | 1242 | ], |
1292 | | - "OpType": 8, |
1293 | | - "Fee": 12, |
1294 | | - "Sequence": 7 |
| 1243 | + "OpType": 8 |
1295 | 1244 | } |
1296 | 1245 |
|
1297 | 1246 | ``` |
|
1313 | 1262 | } |
1314 | 1263 | } |
1315 | 1264 | ], |
1316 | | - "StrictMode": true, //可选字段: 不设置表示不使用strictMode |
1317 | | - "TxCheckHash": "xxx", //可选字段: 由g_prepare根据StrictMode的指示自动计算并插入 |
| 1265 | + "StrictMode": true, //可选字段:不设置表示不使用strictMode |
| 1266 | + "TxCheckHash": "xxx", //可选字段:由g_prepare根据StrictMode的指示自动计算并插入 |
1318 | 1267 | "Raw": [ |
1319 | | - { |
1320 | | - "id": 1, |
1321 | | - "name": "test" |
1322 | | - }, |
1323 | | - { |
1324 | | - "id": 2, |
1325 | | - "name": "hello" |
1326 | | - } |
| 1268 | + {"id":1} |
1327 | 1269 | ], |
1328 | | - "OpType": 9, |
1329 | | - "Fee": 12, |
1330 | | - "Sequence": 8 |
| 1270 | + "OpType": 9 |
1331 | 1271 | } |
1332 | 1272 |
|
1333 | 1273 | ``` |
1334 | 1274 |
|
1335 | 1275 |   Response Format 同上 |
1336 | 1276 |
|
1337 | 1277 | - **7.13 t_sqlTxs 事务操作** |
1338 | | - - 对应SQLTransaction请求,用帐户对应的私钥将下面JSON语句本地签名后,然后再调用7.15中的submit接口将交易发往全网共识<br> |
| 1278 | + - 对应SQLTransaction请求,用帐户对应的私钥将下面JSON语句本地签名后,然后再调用7.15中的submit接口将交易发往全网共识 |
| 1279 | + - 签名前,需要先将Statements中每个元素中的Raw,TableName转16进制,然后将整个Statements作为字符串转为16进制字符串,与插入中Raw字段的处理方法类似<br> |
1339 | 1280 | Request Format:<br> |
1340 | 1281 | ```json |
1341 | 1282 | { |
|
1346 | 1287 | "Tables": [ |
1347 | 1288 | { |
1348 | 1289 | "Table": { |
1349 | | - "TableName": "EName1", |
1350 | | - "NameInDB": "48C80D2CF136054DB6F0116D4833D4DAD1D4CED5" |
| 1290 | + "TableName": "EName1" |
1351 | 1291 | } |
1352 | 1292 | } |
1353 | 1293 | ], |
|
1368 | 1308 | "Tables": [ |
1369 | 1309 | { |
1370 | 1310 | "Table": { |
1371 | | - "TableName": "EName1", |
1372 | | - "NameInDB": "48C80D2CF136054DB6F0116D4833D4DAD1D4CED5" |
| 1311 | + "TableName": "EName1" |
1373 | 1312 | } |
1374 | 1313 | } |
1375 | 1314 | ], |
|
1385 | 1324 | "Tables": [ |
1386 | 1325 | { |
1387 | 1326 | "Table": { |
1388 | | - "TableName": "EName1", |
1389 | | - "NameInDB": "48C80D2CF136054DB6F0116D4833D4DAD1D4CED5" |
| 1327 | + "TableName": "EName1" |
1390 | 1328 | } |
1391 | 1329 | } |
1392 | 1330 | ], |
|
1409 | 1347 | "Tables": [ |
1410 | 1348 | { |
1411 | 1349 | "Table": { |
1412 | | - "TableName": "EName1", |
1413 | | - "NameInDB": "48C80D2CF136054DB6F0116D4833D4DAD1D4CED5" |
| 1350 | + "TableName": "EName1" |
1414 | 1351 | } |
1415 | 1352 | } |
1416 | 1353 | ], |
|
1453 | 1390 | "id", |
1454 | 1391 | "name" |
1455 | 1392 | ], |
1456 | | - { |
1457 | | - "id": 1, |
1458 | | - "name": "test" |
1459 | | - }, |
1460 | 1393 | { |
1461 | 1394 | "id": 2 |
1462 | 1395 | } |
1463 | 1396 | ], |
1464 | | - "OpType": 7, |
1465 | | - "TableFlags": 65536 |
| 1397 | + "OpType": 7 |
1466 | 1398 | } |
1467 | 1399 | } |
1468 | 1400 | ``` |
1469 | 1401 | 备注: |
1470 | | - 支持多表联合查询, 参考6.9节 |
| 1402 | + 支持多表联合查询, 参考6.9节<br> |
| 1403 | + Raw中第一个[]中的内容是要查询的字段名,后面是查询条件 |
1471 | 1404 |   Response Format: |
1472 | 1405 | ```json |
1473 | 1406 | { |
|
1565 | 1498 |   返回值与表的订阅返回类似 |
1566 | 1499 |
|
1567 | 1500 | ### 8. CommandLine 接口 |
| 1501 | +> 说明:Dump、审计功能,表名只支持英文 |
1568 | 1502 | - **8.1 t_dump 开始dump表** |
1569 | 1503 | - 开始dump一张表,参数1同3.4节的设置,参数2为存储路径<br> |
1570 | 1504 | Request Format:<br> |
|
0 commit comments