Hyperledger Fabric五大模組
《區塊鏈開發實戰——Hyperledger Fabric》學習筆記
一、 cryptogen
1.1 cryptogen功能
- 生成組織結構和賬號相關的檔案在
- 系統設計之後根據設計編寫cryptogen的配置檔案,然後根據配置檔案生成相關證書檔案
即用來生成證書檔案的工具,搭建網路的第一步就是使用cryptogen模組和配置檔案來生成整個fabric網路的組織架構與其對應的身份證書
1.2 cryptogen命令
執行 cryptogen --help得到:
usage: cryptogen [<flags>] <command> [<args> ...] Utility for generating Hyperledger Fabric key material Flags: --help Show context-sensitive help (also try --help-long and --help-man). Commands: help [<command>...] Show help. generate [<flags>] Generate key material showtemplate Show the default configuration template version Show version information extend [<flags>] Extend existing network
- help:顯示幫助資訊
- generate:根據配置檔案生成證書資訊
- showtemplate:顯示預設配置模板
- version:顯示模組版本號
- extend:根據現有組織結構生成新的配置檔案(不覆蓋現有的配置檔案)
1.3 cryptogen 生成祕鑰證書
執行 cryptogen showtemplate來顯示預設配置模板(去掉了註釋):
OrdererOrgs: # 定義orderer節點 - Name: Orderer # orderer節點的名稱 Domain: example.com # orderer節點的根域名 Specs: - Hostname: orderer # orderer節點的主機名 PeerOrgs: - Name: Org1 # 組織1的名稱 Domain: org1.example.com # 組織1的根域名 EnableNodeOUs: false # 如果設定為true,在msp下生成config.yaml檔案 Template: Count: 1 # 組織1中的節點數目 Users: Count: 1 # 組織1中的使用者數目 - Name: Org2 Domain: org2.example.com EnableNodeOUs: false Template: Count: 1 Users: Count: 1
根據模板稍加修改建立一個Fabric系統,具體資訊如下:
屬性名稱 | 屬性值 |
---|---|
系統根域名 | testcryptogen.com |
系統orderer節點名稱 | Orderer |
組成名稱 | peer節點數 | 使用者數
—|---
Org1 | 2 | 3
Org2 | 2 | 2
則crypto-config.yaml檔案內容為:
OrdererOrgs: - Name: Orderer Domain: testcryptogen.com Specs: - Hostname: orderer PeerOrgs: - Name: Org1 Domain: org1.testcryptogen.com EnableNodeOUs: false Template: Count: 2 Users: Count: 3 - Name: Org2 Domain: org2.testcryptogen.com EnableNodeOUs: false Template: Count: 2 Users: Count: 2
使用cryptogen 生成證書檔案:
[email protected]:/opt/hyperledger/fabricconfig# cryptogen generate --config=/opt/hyperledger/fabricconfig/crypto-config.yaml --output /opt/hyperledger/fabricconfig/crypto-config
org1.testcryptogen.com
org2.testcryptogen.com
使用tree檢視生成的具體檔案:
[email protected]:/opt/hyperledger/fabricconfig/crypto-config# tree -L 6
.
├── ordererOrganizations
│ └── testcryptogen.com #根域名為testcryptogen.com的orderer節點的相關證書檔案
│ ├── ca # CA伺服器簽名檔案
│ │ ├── 9fe7756ab2b8dd329ddc689a022f06773af70b1006e0df126f f22416671ff866_sk
│ │ └── ca.testcryptogen.com-cert.pem
│ ├── msp
│ │ ├── admincerts # orderer 管理員的證書
│ │ │ └── [email protected]
│ │ ├── cacerts # orderer 根域名伺服器的簽名證書
│ │ │ └── ca.testcryptogen.com-cert.pem
│ │ └── tlscacerts # TLS 連線用的身份證書
│ │ └── tlsca.testcryptogen.com-cert.pem
│ ├── orderers # orderer 節點需要的相關證書檔案
│ │ └── orderer.testcryptogen.com
│ │ ├── msp # orderer 節點相關證書
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ ├── keystore
│ │ │ ├── signcerts
│ │ │ └── tlscacerts
│ │ └── tls # orderer 節點和其他節點 TLS 連線用的身份證書
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── 0d5fa27337f1ebcfd424c61f791f0c76d67a3c06889a1ab97a 1d7de16d21936a_sk
│ │ └── tlsca.testcryptogen.com-cert.pem
│ └── users # orderer 節點使用者相關的證書
│ └── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── peerOrganizations
├── org1.testcryptogen.com # 組織的相關證書檔案
│ ├── ca # 組織根節點簽名證書
│ │ ├── 0b272c0067147eb26fe0ef41366bd8e841d41062df6209b094 3dfaa4e67264f7_sk
│ │ └── ca.org1.testcryptogen.com-cert.pem
│ ├── msp
│ │ ├── admincerts # 組織管理員的證書
│ │ │ └── [email protected]
│ │ ├── cacerts # 組織的根證書
│ │ │ └── ca.org1.testcryptogen.com-cert.pem
│ │ └── tlscacerts # TLS 連線身份證書
│ │ └── tlsca.org1.testcryptogen.com-cert.pem
│ ├── peers
│ │ ├── peer0.org1.testcryptogen.com
│ │ │ ├── msp
│ │ │ │ ├── admincerts # 組織的管理證書, 只有這些證書才能進行建立通道等操作
│ │ │ │ ├── cacerts # 組織根證書
│ │ │ │ ├── keystore # 當前節點的私鑰
│ │ │ │ ├── signcerts # 當前節點簽名的數字證書
│ │ │ │ └── tlscacerts # TLS 連線的身份證書
│ │ │ └── tls
│ │ │ ├── ca.crt # 組織的根證書
│ │ │ ├── server.crt # 驗證本節點簽名的證書
│ │ │ └── server.key # 當前節點的私鑰檔案用來簽名的
│ │ └── peer1.org1.testcryptogen.com
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ ├── keystore
│ │ │ ├── signcerts
│ │ │ └── tlscacerts
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── fe340ca55a6bec7593be46883c9aca164a007fea19dc6a0745 9a3099dd4e132f_sk
│ │ └── tlsca.org1.testcryptogen.com-cert.pem
│ └── users
│ ├── [email protected]
│ │ ├── msp
│ │ │ ├── admincerts # 組織的根證書作為管理員身份的驗證
│ │ │ ├── cacerts # 使用者所屬組織的根證書
│ │ │ ├── keystore # 使用者私鑰
│ │ │ ├── signcerts # 使用者的簽名證書
│ │ │ └── tlscacerts # TLS 連線通訊證書, SDK客戶端使用
│ │ └── tls
│ │ ├── ca.crt # 組織根證書
│ │ ├── client.crt # 管理員身份的證書
│ │ └── client.key # 管理員私鑰
│ ├── [email protected]
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ ├── keystore
│ │ │ ├── signcerts
│ │ │ └── tlscacerts
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ ├── [email protected]
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ ├── keystore
│ │ │ ├── signcerts
│ │ │ └── tlscacerts
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ └── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── org2.testcryptogen.com
├── ca
│ ├── ca.org2.testcryptogen.com-cert.pem
│ └── e7ba20f396a106784d9076b8d62d8d3e8627991dc84c6ba85f 31f382af9963ed_sk
├── msp
│ ├── admincerts
│ │ └── [email protected]
│ ├── cacerts
│ │ └── ca.org2.testcryptogen.com-cert.pem
│ └── tlscacerts
│ └── tlsca.org2.testcryptogen.com-cert.pem
├── peers
│ ├── peer0.org2.testcryptogen.com
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ ├── keystore
│ │ │ ├── signcerts
│ │ │ └── tlscacerts
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ └── peer1.org2.testcryptogen.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── server.crt
│ └── server.key
├── tlsca
│ ├── f2121a5969a1bfc7e8f7a04c2dd31e44f74d412f88dce68094 a3bb904d87e593_sk
│ └── tlsca.org2.testcryptogen.com-cert.pem
└── users
├── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
├── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── [email protected]
├── msp
│ ├── admincerts
│ ├── cacerts
│ ├── keystore
│ ├── signcerts
│ └── tlscacerts
└── tls
├── ca.crt
├── client.crt
└── client.key
二、 configtxgen
2.1 configtxgen的功能
configtxgen模組用來生成orderer的初始化檔案和channel的初始化檔案
即一般在cryptogen生成整個網路和證書後,用configtxgen生成Fabric系統的創始塊檔案和賬本(channel)的創始塊檔案
2.2 configtxgen的命令
使用configtxgen --help檢視幫助資訊:
[email protected]:/opt/hyperledger# configtxgen --help
Usage of configtxgen:
-asOrg string
Performs the config generation as a particular organization (by name), only including values in the write set that org (likely) has privilege to set
-channelID string
The channel ID to use in the configtx
-configPath string
The path containing the configuration to use (if set)
-inspectBlock string
Prints the configuration contained in the block at the specified path
-inspectChannelCreateTx string
Prints the configuration contained in the transaction at the specified path
-outputAnchorPeersUpdate string
Creates an config update to update an anchor peer (works only with the default channel creation, and only for the first update)
-outputBlock string
The path to write the genesis block to (if set)
-outputCreateChannelTx string
The path to write a channel creation configtx to (if set)
-printOrg string
Prints the definition of an organization as JSON. (useful for adding an org to a channel manually)
-profile string
The profile from configtx.yaml to use for generation. (default "SampleInsecureSolo")
-version
Show version information
- asOeg:所屬的組織
- channelID:channel的名字
- configPath:配置檔案的路徑
- inspectBlock:列印指定區塊檔案中的配置內容
- inspectChannelCreateTx:列印建立通道的交易的配置檔案
- outputAnchorPeersUpdate: 更新channel配置資訊
- outputBlock:輸出區塊檔案的路徑
- outputCreateChannelTx:標示輸出創始塊檔案
- profile:配置檔案的節點
- printOrg:以JSON格式列印組織的定義
- version:顯示版本資訊
2.3 使用configtxgen模組建立orderer初始塊和channel初始塊
與cryptogen一樣,configtxgen需要先寫一個配置檔案,樣例如下:
Profiles:
# 以下部分定義了整個系統的配置資訊
# 組織定義識別符號,可自定義,命令中的-profile引數對應該識別符號
TestTwoOrgsOrdererGenesis:
# orderer 配置屬性,系統關鍵字不得更改
Orderer:
#引用下面名為OrdererDefaults的屬性
<<: *OrdererDefaults
Organizations:
#引用下面的名為OrdererOrg的屬性
- *OrdererOrg
# 定義了系統中包含的組織
Consortiums:
SampleConsortium:
#系統中包含的組織
Organizations:
- *Org1 #引用了下文定義配置
- *Org2
# 以下內容為channel的配置資訊
# 通道定義識別符號,可自定義
TestTwoOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
# orderer節點相關資訊
Organizations:
# orderer節點配置資訊
- &OrdererOrg
# orderer節點名稱
Name: OrdererOrg
# orderer節點編號
ID: OrdererMSP
# mps資料夾路徑
MSPDir: msp
# Orderer節點中包含的組織,如果有多個組織可以配置多個
- &Org1
Name: Org1MSP # 組織名稱
ID: Org1MSP # 組織編號
MSPDir: msp # 組織msp檔名
AnchorPeers: # 組織的訪問域名和埠
- Host: peer0.org1.testcryptogen.com
Port: 7051
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: msp
AnchorPeers:
- Host: peer0.org2.testcryptogen.com
Port: 7051
# orderer節點的配置資訊
Orderer: &OrdererDefaults
OrdererType: solo # orderer節點共識辦法
Addresses:
- orderer.testcryptogen.com:7050 # orderer監聽的地址
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 98 MB
PreferredMaxBytes: 512KB
Kafka:
Brokers:
- 127.0.0.1:9092
Organizations:
Application: &ApplicationDefaults
Organizations:
- 建立orderer的創始塊:
configtxgen -profile TestTwoOrgsOrdererGenesis -outputBlock ./orderer.genesis.block
- 建立channel初始塊:
configtxgen -profile TestTwoOrgsChannel -outputCreateChannelTx ./roberttestchannel.tx -channelID roberttestchannel
- 建立錨點更新檔案:
configtxgen -profile TestTwoOrgsChannel -outputAnchorPeersUpdate ./Org1MSPanchors.tx -channelID roberttestchannel -asOrg Org1MSP
三、 configtxlator
3.1 configtxlator的功能
configtxlator模組可以吧區塊鏈的二進位制檔案轉化成JSON格式檔案,以便閱讀
3.2 configtxlator的命令
[email protected]:/opt/hyperledger/order# configtxlator --help
usage: configtxlator [<flags>] <command> [<args> ...]
Utility for generating Hyperledger Fabric channel configurations
Flags:
--help Show context-sensitive help (also try --help-long and --help-man).
Commands:
help [<command>...]
Show help.
start [<flags>]
Start the configtxlator REST server
proto_encode --type=TYPE [<flags>]
Converts a JSON document to protobuf.
proto_decode --type=TYPE [<flags>]
Converts a proto message to JSON.
compute_update --channel_id=CHANNEL_ID [<flags>]
Takes two marshaled common.Config messages and computes the config update which
transitions between the two.
version
Show version information
- start:啟動configtxlator REST伺服器
- proto_encode: 把JSON格式檔案轉化為protobuf
- proto_decode:protobuf轉化成JSON格式檔案
- compute_update: 計算配置更新量
四、orderer
4.1 orderer的功能
orderer模組 負責對交易進行排序,並將排好序的交易打包成區塊
4.2 orderer的命令
[email protected]:/opt/hyperledger/order# orderer --help
usage: orderer [<flags>] <command> [<args> ...]
Hyperledger Fabric orderer node
Flags:
--help Show context-sensitive help (also try --help-long and --help-man).
Commands:
help [<command>...]
Show help.
start*
Start the orderer node
version
Show version information
benchmark
Run orderer in benchmark mode
- start*:啟動orderer節點
- benchmark:採用基準本模式執行orderer
4.3 orderer兩種配置方法
4.3.1 使用環境變數方法配置
export set ORDERER_GENERAL_LOGLEVEL=debug
export set ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
export set ORDERER_GENERAL_LISTENPORT=7050
export set ORDERER_GENERAL_GENESISMETHOD=file
export set ORDERER_GENERAL_GENESISFILE=/opt/hyperledger/order/orderer.genesis.block
export set ORDERER GENERAL_LOCALMSPID=OrdererMSP
export set ORDERER_GENERAL_LOCALMSPDIR=/opt/hyperledger/fabricconfig/crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn.com/msp
export set ORDERER_GENERAL_LEDGERTYPE=file
export set ORDERER_GENERAL BATCHTIMEOUT=10s
export set ORDERER_GENERAL_MAXMESSAGECOUNT=10
export set ORDERER_GENERAL_TLS_ENABLED=false
export set ORDERER_GENERAL_TLS_PRIVATEKEY=/opt/hyperledger/fabricconfig/crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn com/tls/server.key
export set ORDERER_GENERAL_TLS_CERTIFICATE=/opt/hyperledger/fabricconfig/
crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn. com/tls/server.crt
export set ORDERER_GENERAL_TLS_ROOTCAS=[/opt/hyperledger/fabricconfig/cryptoconfig/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn.com/tls/ca.crt]
4.3.2 使用配置檔案方法來配置
General:
LedgerType: file
ListenAddress: 0.0.0.0
ListenPort: 7050
TLS:
Enabled: false
PrivateKey: /opt/hyperledger/fabricconfig/crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn.com/tls/server.key
Certificate: /opt/hyperledger/fabricconfig/crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn.com/tls/server.crt
RootCAs:
- /opt/hyperledger/fabricconfig/crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn.com/tls/ca.crt
#ClientAuthEnabled: false
ClientAuthRequired: false
ClientRootCAs:
LogLevel: debug
LogFormat: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
GenesisMethod: file
GenesisProfile: TestOrgsOrdererGenesis
GenesisFile: /opt/hyperledger/order/orderer.genesis.block
LocalMSPDir: /opt/hyperledger/fabricconfig/crypto-config/ordererOrganizations/qklszzn.com/orderers/orderer.qklszzn.com/msp
LocalMSPID: OrdererMSP
Profile:
Enabled: false
Address: 0.0.0.0:6060
BCCSP:
Default: SW
SW:
Hash: SHA2
Security: 256
FileKeyStore:
KeyStore:
FileLedger:
Location: /opt/hyperledger/order/production/orderer
Prefix: hyperledger-fabric-ordererledger
RAMLedger:
HistorySize: 1000
Kafka:
Retry:
ShortInterval: 5s
ShortTotal: 10m
LongInterval: 5m
LongTotal: 12h
NetworkTimeouts:
DialTimeout: 10s
ReadTimeout: 10s
WriteTimeout: 10s
Metadata:
RetryBackoff: 250ms
RetryMax: 3
Producer:
RetryBackoff: 100ms
RetryMax: 3
Consumer:
RetryBackoff: 2s
Verbose: false
TLS:
Enabled: false
PrivateKey:
Certificate:
RootCAs:
Version: 0.10.2.0
Debug:
BroadcastTraceDir:
DeliverTraceDir:
(1) General
General節點中包含了orderer模組的基本控制資訊配置項的詳細註釋如下所示:
- LedgerType:賬本的型別,有ram、json、file三種類型可以選擇。ram表示賬本的資料儲存在記憶體中,一般用於測試環境。json和file表示賬本資料儲存在檔案中
- ListenAddress:orderer伺服器監聽的地址,如果伺服器有多個網絡卡,一般需要指明監聽的具體地址
- ListenPort:監聽埠
- Enabled:啟用TLS時的相關配置
- PrivateKey:私鑰檔案
- Certificate:證書檔案
- RootCAs:根證書檔案
- ClientAuthRequired:啟用客戶端證書驗證
- ClientRootCAs:客戶端根證書
- LogLevel:日誌級別
- LogFormat:日誌格式
- GenesisMethod:初始塊的來源方式,provisional表示GenesisProfile選項指定的內容在預設配置檔案中的配置是自動生成的;file表示使用GenesisFile指定的現成初始的檔案
- GenesisProfile:初始塊的profile,在configtxgen模組的配置檔案中指定
- GenesisFile:初始塊檔案的路徑
- LocalMSPDir:orderer模組msp檔案的路徑
- LocalMSPID:orderer模組的編號,在configtxgen模組的配置檔案中指定
- Enabled:是否啟動go的profile資訊
- Address:go的profile資訊的訪問地址
- Default:採用的密碼機制,SW為軟體程式時間;PKCS11為硬體的實現方式
- Hash:演算法型別
(2) FileLedger
FileLedger節點中包含了orderer模組中賬本檔案相關的配置資訊
- Location:賬本檔案的路徑
- Prefix:賬本存放在臨時目錄時候的目錄名,如果已經指定了Location的值,則該選項無效
(3) RAMLedger
RAMLedger節點包含了orderer模組的賬本在記憶體中資料儲存方式的相關配置資訊
- HistorySize:如果LedgerType型別為RAM時記憶體中儲存的區塊的數目,超過這個數目的區塊將被放棄
(4) Kafka
Kafka節點中包含了orderer模組中連線Kafka相關的資訊,如果orderer節點的排序模式選擇了solo,那麼該節點所有配置均無效
- Retry:如果orderer在啟動的時候,Kafka還沒啟動或者Kafka宕機重試的次數
- ShortInterval:操作失敗短重試狀態下重試的時間間隔
- ShortTotal:短重試狀態下最多重試的時間間隔
- LongInterval:長重試狀態下重試的時間間隔
- LongTotal:長重試狀態下最多重試時間
- DialTimeout:等待超時時間
- ReadTimeout:讀超時時間
- WriteTimeout:寫超時時間
- RetryBackoff:Kafka叢集選舉leader的元資料
- RetryMax:Kafka叢集選舉leader的元資料
- RetryBackoff:重試訊息超時時間
- Verbose:Kafka客戶端的日誌級別,在orderer的執行日誌中顯示Kafka的日誌資訊
- Enabled:是否啟動TLS
- PrivateKey:私鑰前面
- certificate:Kafka的證書
- rootCAs:驗證Kafka的根證書
- version:Kafka的版本號
(5) Debug
Debug節點中包含了orderer模組除錯相關的選項
五、peer
5.1 peer的功能
peer模組是Fabric中最重要的模組,主要負責儲存區塊鏈資料、執行維護鏈碼、提供對外服務介面等作用
5.2 peer的命令
[email protected]:~# peer --help
Usage:
peer [command]
Available Commands:
chaincode Operate a chaincode: install|instantiate|invoke|package|query|signpackage|upgrade|list.
channel Operate a channel: create|fetch|join|list|update|signconfigtx|getinfo.
help Help about any command
logging Log levels: getlevel|setlevel|revertlevels.
node Operate a peer node: start|status.
version Print fabric peer version.
Flags:
-h, --help help for peer
--logging-level string Default logging level and overrides, see core.yaml for full syntax
Use "peer [command] --help" for more information about a command.
- chaincode:chaincode相關操作,相關子命令 install|instantiate|invoke|package|query|signpackage|upgrade|list
- channel:channel相關操作,相關子命令create|fetch|join|list|update|signconfigtx|getinfo
- logging:日誌級別操作,相關子命令getlevel|setlevel|revertlevels
- node:啟動peer節點伺服器
5.3 peer的環境變數和配置檔案
5.3.1 使用環境變數來配置
5.3.2 使用配置檔案來配置
peer的配置檔案的預設檔名為core.yaml,配置檔案為logging、peer、vm、chaincode、ledger這五大部分