Skip to content

Commit

Permalink
<doc>(develop,design): add log audit doc, add sys storage doc. (#1587)
Browse files Browse the repository at this point in the history
  • Loading branch information
kyonRay committed Nov 24, 2022
1 parent a41e02d commit 4c2f558
Show file tree
Hide file tree
Showing 3 changed files with 271 additions and 4 deletions.
25 changes: 24 additions & 1 deletion 3.x/zh_CN/docs/design/storage.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ class TransactionalStorageInterface : public virtual StorageInterface
```


## Ari与Pro版本数据提交

Air与Pro版本的提交与Max的区别在于一方面存储服务使用RocksDB作为后端数据库,另一方面执行服务与调度服务在同一进程中,不存在分布式事务的问题,相对于Max版本其提交逻辑较为简单,如下图所示。
Expand All @@ -80,4 +79,28 @@ Air与Pro版本的提交与Max的区别在于一方面存储服务使用RocksDB

对于调度服务和执行服务其处理逻辑与Max版本相同,只是在提交阶段,调度服务和执行服务提交数据时,其持有的存储对象为同一个,当调用`asyncPrepare`时,存储内部实现中会并不会真的将数据提交到RocksDB,而是将数据写入内存中,当调度服务调用`asyncCommit`方法时,将数据一次性提交写入RocksDB。

## 系统存储表

该章节叙述了在创世块就依据预先写入存储的数据表的存储结构和用途。

| 表名 | 字段 | 用途 |
| ----------------------- | ---------------------------------------------- | ---------------------------------------------- |
| s_tables | value | 记录创建表的表结构 |
| s_config | value, enable_number | 记录系统配置 |
| s_consensus | value | 记录共识节点和观察节点列表 |
| s_current_state | value | 记录当前块高、交易总数、失败交易总数 |
| s_hash_2_number | value | 记录区块哈希到区块高度的映射 |
| s_number_2_hash | value | 记录区块高度到区块哈希的映射 |
| s_block_number_2_nonces | value | 记录区块高度到nonce的映射 |
| s_number_2_header | value | 记录区块高度到区块头的映射 |
| s_number_2_txs | value | 记录区块高度到交易哈希列表的映射 |
| s_hash_2_tx | value | 记录交易哈希到交易对象的映射 |
| s_hash_2_receipt | value | 记录交易哈希到交易回执对象的映射 |
| s_code_binary | value | 记录code哈希到code的映射 |
| s_contract_abi | value | 记录code哈希到ABI的映射 |
| / | type,status,acl_type,acl_white,acl_black,extra | BFS根目录 |
| /apps | type,status,acl_type,acl_white,acl_black,extra | apps目录,用户的应用均在这个目录下 |
| /tables | type,status,acl_type,acl_white,acl_black,extra | tables目录,用户通过CRUD创建的表均在这个目录下 |
| /usr | type,status,acl_type,acl_white,acl_black,extra | usr目录,设置过状态的账户地址均在这个目录下 |
| /sys | type,status,acl_type,acl_white,acl_black,extra | sys目录,系统合约表 |

13 changes: 10 additions & 3 deletions 3.x/zh_CN/docs/develop/contract_life_cycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

```eval_rst
.. important::
合约生命周期管理冻结、解冻、废止操作以及合约部署调用权限控制,均需要将开启区块链权限模式,详情请参考【权限治理使用指南】
合约生命周期管理冻结、解冻、废止操作以及合约部署调用权限控制,均需要将开启区块链权限模式,详情请参考`【权限治理使用指南】 <https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/committee_usage.html>`_
```

## 1. 智能合约开发
Expand All @@ -22,9 +22,13 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形
**延伸阅读**

[WeBASE合约IDE](https://webasedoc.readthedocs.io/zh_CN/latest/)

[Solidity官方文档](https://solidity.readthedocs.io/en/latest/)

[Remix在线IDE](https://remix.ethereum.org/)

[Liquid官方文档](https://liquid-doc.readthedocs.io/zh_CN/latest/)

[预编译合约使用文档](https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/precompiled/index.html)

## 2. 智能合约部署与调用
Expand All @@ -37,8 +41,11 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形
**延伸阅读**

[开发第一个Solidity区块链应用](../quick_start/solidity_application.md)

[开发第一个Liquid区块链应用](../quick_start/wbc_liquid_application.md)

[Gradle SpringBoot 应用示例](./sdk/java_sdk/spring_boot_starter.md)

[Maven SpringBoot 应用示例](./sdk/java_sdk/spring_boot_crud.md)

## 3. 智能合约数据存储
Expand All @@ -53,8 +60,8 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形

| Key | Value |
|-------|----------------|
| code | 十六进制opcode |
| abi | ABI JSON字符串 |
| code | 十六进制opcode |
| state | ... |

## 4. 智能合约升级
Expand All @@ -71,7 +78,7 @@ FISCO BCOS平台支持Solidity、Liquid、Precompiled三种智能合约使用形

```eval_rst
.. important::
合约生命周期管理冻结、解冻、废止操作以及合约部署调用权限控制,均需要将开启区块链权限模式,详情请参考【权限治理使用指南】
合约生命周期管理冻结、解冻、废止操作以及合约部署调用权限控制,均需要将开启区块链权限模式,详情请参考`【权限治理使用指南】 <https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/committee_usage.html>`_
```

在开启区块链权限模式之后,每次合约部署将在存储层创建合约存储数据表之外,会额外创建一张合约权限数据表,用于记录合约管理员地址、合约状态、合约接口ACL。默认情况下,合约的管理员地址就是发起部署合约操作的账户地址(如果存在合约创建合约,合约管理员地址为交易发起账户tx.origin)。
Expand Down
237 changes: 237 additions & 0 deletions 3.x/zh_CN/docs/develop/system_log_audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
# 关键系统日志审计

标签:``系统交易`` ``日志审计``

---

本文将描述FISCO BCOS区块链节点内关键步骤的日志审计方法,意在用户可以快速了解区块链节点的状态、交易执行错误的依据。

## 1. 区块状态日志

### 1.1 区块打包成功

共识节点收到交易,在最小打包时间内将会主动打包共识Proposal广播到其他节点进行公示,Proposal内包含已排序待执行的所有交易。

- 日志关键词:++++++++++++++++ Generate proposal
- 日志级别:INFO
- 日志举例:

```log
info|2022-11-24 10:32:35.034810|[CONSENSUS][SEALER]++++++++++++++++ Generate proposal,index=32,curNum=31,hash=9c3c41de...,sysTxs=false,txsSize=1,version=50462720
```

- 日志解读:
- index: 当前打包区块的块高
- curNum: 当前已落盘的块高
- hash: proposal 的哈希
- sysTxs: 是否包含系统交易
- txsSize: 打包的交易数量
- version: 打包区块的版本号

### 1.2 区块开始执行

当共识在某个区块proposal上收到足够多Pre-Commit proposal,将会调用Scheduler模块请求执行区块。

当同步模块从其他节点同步区块到本地,也会调用Scheduler模块请求执行区块,以验证区块合法性。

- 日志关键词:ExecuteBlock request
- 日志级别:INFO
- 日志举例:

```log
info|2022-11-24 10:32:35.046634|[SCHEDULER][METRIC][blk-32]ExecuteBlock request,gasLimit=3000000000,verify=false,signatureSize=0,tx count=0,meta tx count=1,version=3.2.0,waitT=1
```

- 日志解读:
- blk-32: 执行的块高为32
- gasLimit: 当前执行区块的gas限制
- verify: 是否进行验证,如果当前节点就是leader节点,那么不需要验证
- signatureSize: 签名数量,如果当前节点就是leader节点,那么不需要验证签名
- tx count: 区块内交易数量,如果是从其他节点同步的区块,那么这一项大于0
- meta tx count: 区块内交易元信息数量,如果是共识模块发起的请求,那么这一项大于0
- version: 当前执行的区块版本号

### 1.3 区块执行成功

当共识模块或同步模块请求Scheduler模块执行区块完成后,将会输出该日志。

- 日志关键词:asyncExecuteBlock success
- 日志级别:INFO
- 日志举例:

```log
info|2022-11-24 10:32:35.048912|[CONSENSUS][Core][METRIC]asyncExecuteBlock success,sysBlock=false,number=32,result=989d3d4c...,txsSize=1,txsRoot=02e7ed51...,receiptsRoot=cf7d8528...,stateRoot=018b8af3...,timeCost=0,execPerTx=0
```

- 日志解读:
- sysBlock: 区块内是否带有系统交易
- number: 执行成功的块高
- result: 区块哈希
- txsSize: 交易数量
- txsRoot: 交易哈希的树根
- receiptsRoot: 回执哈希的树根
- stateRoot: 存储变化数据哈希的树根
- timeCost: 执行区块时间(ms)
- execPerTx: 每个交易平均执行时间(ms)

### 1.4 区块落盘

共识或同步模块在执行完区块后验证通过,将会发起调用Scheduler主动进行落盘操作。

- 日志关键词:^^^^^^^^Report
- 日志级别:INFO
- 日志举例:

```log
info|2022-11-24 10:32:35.058065|[CONSENSUS][PBFT][METRIC]^^^^^^^^Report,sealer=1,txs=1,committedIndex=32,consNum=33,committedHash=989d3d4c...,view=3,toView=3,changeCycle=0,expectedCheckPoint=33,Idx=1,unsealedTxs=0,sealUntil=0,waitResealUntil=0,nodeId=ffa9aa23...
```

- 日志解读:
- sealer: 打包节点
- txs: 交易数量
- committedIndex: 共识块高
- consNum: 当前打包块高
- committedHash: 落盘的区块哈希
- view: 当前视图
- toView: 下个视图,当出现视图切换时将会+1
- expectedCheckPoint: 下一个check point
- idx: 当前节点index
- unsealedTxs: 尚未打包交易
- nodeId: 当前node id

## 2. 系统配置更改日志

### 2.1 系统配置更改日志

当发起系统配置修改时,将会在日志输出。

- 日志关键词:SystemConfigPrecompiled
- 日志级别:INFO
- 日志举例:

```log
info|2022-11-24 12:07:04.180708|[EXECUTOR][PRECOMPILED][blk-6283][SystemConfigPrecompiled]setValueByKey,configKey=tx_gas_limit,configValue=3000000001
```

- 日志解读:
- blk: 当前执行块高
- configKey: 修改的系统配置名,目前支持:
- compatibility_version: 兼容性版本号
- consensus_leader_period: 共识选主间隔
- tx_count_limit: 区块内交易数量最大值
- tx_gas_limit: 单笔交易的gas使用上限
- configValue: 修改的系统配置值

### 2.2 共识节点操作日志

当发起节点加入共识节点、加入观察节点、修改共识节点权重、删除节点等操作,都将输出日志:

- 日志关键词:ConsensusPrecompiled
- 日志级别:INFO
- 日志举例:

```log
info|2022-11-24 12:27:04.210708|[EXECUTOR][PRECOMPILED][ConsensusPrecompiled]addSealer,nodeID=97af395f31cd52868162c790c2248e23f65c85a64cd0581d323515f6afffc0138279292a55f7bd706f8f1602f142b12a3407a45334eb0cf7daeb064dcec69369
```

- 日志解读
- addSealer: 上面举例的是添加到共识节点的请求, 此外还有以下类型:
- addObserver: 添加到观察节点
- setWeight: 设置共识节点权重
- remove: 删除节点
- nodeID: 修改的node id

## 3. 合约权限日志

### 3.1 部署合约权限写入

治理委员会通过了设置部署合约类型、部署合约权限的写入提案,将会在节点日志中输出。

- 日志关键词:AuthManagerPrecompiled
- 日志级别:INFO
- 日志举例1:

```log
info|2022-11-24 12:47:04.345608|[EXECUTOR][PRECOMPILED][AuthManagerPrecompiled]setDeployType,type=1
```

- 日志解读1
- 设置部署权限类型
- type: 部署合约权限的类型,0: 不需要权限;1: 白名单;2: 黑名单
- 日志举例2:

```log
info|2022-11-24 12:47:39.784532|[EXECUTOR][PRECOMPILED][AuthManagerPrecompiled]setDeployAuth,account=0x320b129f4e8dbd956eeb4c3ff3b5627c2945ff1a,isClose=false
```

- 日志解读2
- 设置某个账号的部署权限
- account: 账号地址
- isClose: 是否关闭部署权限

### 3.2 合约权限写入

合约管理员设置某个合约接口的ACL类型、设置某个账号对该合约接口ACL写入,将会在节点日志中输出。

- 日志关键词:ContractAuthMgrPrecompiled
- 日志级别:INFO
- 日志举例1:

```log
info|2022-11-24 12:47:04.345608|[EXECUTOR][PRECOMPILED][blk-31909][ContractAuthMgrPrecompiled]setMethodAuthType,path=0xa42a320743c2390eb8d8d5928a57a09ebbc6d2ec,func=0x7a23b101,type=1
```

- 日志解读1
- 设置合约接口func的权限类型
- blk: 块高
- path: 合约地址
- func: 合约接口Selector
- type: 合约接口权限的类型,0: 不需要权限;1: 白名单;2: 黑名单
- 日志举例2:

```log
info|2022-11-24 12:59:01.321412|[EXECUTOR][PRECOMPILED][blk-31912][ContractAuthMgrPrecompiled]setAuth,path=0xa42a320743c2390eb8d8d5928a57a09ebbc6d2ec,func=0x7a23b101,account=0x320b129f4e8dbd956eeb4c3ff3b5627c2945ff1a,
isClose=false
```

- 日志解读2
- 设置某个账号的对某个合约的func接口权限
- blk: 块高
- path: 合约地址
- func: 合约接口Selector
- account: 账号地址
- isClose: 是否关闭访问权限

### 3.3 合约状态写入

合约管理员设置所属合约的状态类型,将会在节点日志中输出。

- 日志关键词:ContractAuthMgrPrecompiled
- 日志级别:INFO
- 日志举例1:

```log
info|2022-11-24 13:27:11.123121|[EXECUTOR][PRECOMPILED][blk-31123][ContractAuthMgrPrecompiled]setContractStatus,address=0xa42a320743c2390eb8d8d5928a57a09ebbc6d2ec,status=1
```

- 日志解读1
- blk: 块高
- address: 合约地址
- status: 合约的状态类型,0: 正常;1: 冻结;2: 废止

## 4. 账户权限日志

治理委员设置所属某个账户的状态类型,将会在节点日志中输出。

- 日志关键词:ContractAuthMgrPrecompiled
- 日志级别:INFO
- 日志举例1:

```log
info|2022-11-24 13:38:51.783912|[EXECUTOR][PRECOMPILED][blk-31654][AccountManagerPrecompiled]setAccountStatus,account=0x320b129f4e8dbd956eeb4c3ff3b5627c2945ff1a,status=1
```

- 日志解读1
- blk: 块高
- account: 账户地址
- status: 合约的状态类型,0: 正常;1: 冻结;2: 废止

0 comments on commit 4c2f558

Please sign in to comment.