注意:每个节点都会有数据的备份,因而数据的浪费是比较严重的
节点
客户端节点(应用程序/SDK/命令行工具),不可以独立存在,只能与order节点连接(channel的创建)或者peer节点(交易的执行)
Peer节点
(Anchor/Endorser/Commiter) :
Anchor
: 与组织紧密进行通讯,一个组织有多个peer节点,但是只有一个anchor节点,是锚节点,宕机的时候会自动选举的
,主节点:
Endorser
: (担保节点,担保交易的执行
)与智能合约进行绑定,Commiter
普通的peer节点:专业术语为记账节点
: 所有的节点都是commit节点,用于验证order节点发过来的区块的有效性和交易的有效性,然后记录到本地的账本中,同时修改区块链上的状态数据
Order节点
:排序节点
组织
的主节点
CA 节点( 可选)
: 证书颁发机构,只有被ca机构认可的节点才会被接受
注意
: 组织节点只是一个逻辑的概念,其实是并不存在的,同时组织之间并不会通讯,数据来源于排序节点
模拟执行的意思可以理解为未commit的事务操作
数据隔离问题: 可能不同的channel有相同的key,
历史数据如何实现:
链码
生命周期:
链码的交互流程: 图在本地
系统链码:
链码的编程接口
核心接口是Chaincode:
type Chaincode interface {
Init(stub ChaincodeStubInterface) pb.Response // 链码初始化
Invoke(stub ChaincodeStubInterface) pb.Response // 应用程序与链码交互的入口
}
前提是这个操作是有效的操作
隔离执行,一个交易在区块链网络中会执行很多次
,客户端会对返回的所有结果进行匹配,如果不一样就不会给order进行排序,所以当挂在多个endorser的时候要确保相同的交易结果一致
关注点:
都要大写
enviroment:
-ORDER_GENERAL_LOGLEVEL=debug
会被映射为general.loglevel=debug
-ORDER_GENERAL_LISENADDRESS=0.0.0.0
服务暴露地址
-ORDER_GENERAL_GENESISFILE=/etc/hyperledger/config/genesis.block
注入创始区块
-ORDER_GENERAL_LOCALMSPID=orderMSP
msp的名称
-ORDER_GENERAL_LOCALMSPDIR=/etc/hyperledger/order/msp
证书的位置
ports:
-- 7050:7050
本机的7050映射到order服务的7050端口
- 文件的映射:通过 volumes 在环境变量中,如上述的msp证书地址,用的都是容器中的地址
,
volumes:
-- ./config:/etc/hyperledger/config
既将本地的./config 映射到了容器中的/etc/hyperledger/config 内容
// Initialize the SDK with the configuration file
sdk, err := fabsdk.New(config.FromFile(setup.ConfigFile))
if err != nil {
return errors.WithMessage(err, "failed to create SDK")
}
在这个模块中,使用的是sdk.Context
// 注意,这个是名字,不是域名之类的
context := sdk.Context(fabsdk.WithOrg(setup.OrgName), fabsdk.WithUser(setup.UserName))
在这个模块中,使用的是sdk.ChannelContext
context := sdk.ChannelContext(setup.ChannelID, fabsdk.WithOrg(setup.OrgName), fabsdk.WithUser(setup.UserName))
context := sdk.ChannelContext(setup.ChannelID, fabsdk.WithUser(setup.UserName), fabsdk.WithOrg(setup.OrgName))
client, _ := ledger.New(context)
在这个模块中,使用的是sdk.ChannelContext
context := sdk.ChannelContext(setup.ChannelID, fabsdk.WithOrg(setup.OrgName), fabsdk.WithUser(setup.UserName))
context := sdk.ChannelContext(setup.ChannelID, fabsdk.WithUser(setup.UserName), fabsdk.WithOrg(setup.OrgName))
client, _ := channel.New(context)
client.Execute(channel.Request{})
client.Query(channel.Request{})
在这个模块中,使用的是sdk.ChannelContext
context := sdk.ChannelContext(setup.ChannelID, fabsdk.WithOrg(setup.OrgName), fabsdk.WithUser(setup.UserName))
在这个模块中,使用的是sdk.ChannelContext
context := sdk.ChannelContext(setup.ChannelID, fabsdk.WithOrg(setup.OrgName), fabsdk.WithUser(setup.UserName))
// 系统事件
response, err := setup.client.Execute(channel.Request{
ChaincodeID: setup.ChainCodeID,
Fcn: args[0],
Args: [][]byte{[]byte(args[1])},
TransientMap: transientDataMap})
if err != nil {
return result, fmt.Errorf("failed to find : %v", err)
}
context := setup.sdk.ChannelContext(setup.ChannelID, fabsdk.WithUser(setup.UserName), fabsdk.WithOrg(setup.OrgName))
client, _ := event.New(context)
registration, events, _ := client.RegisterTxStatusEvent(string(response.TransactionID))
defer client.Unregister(registration)
for {
select {
case eve := <-events:
fmt.Println(eve)
case <-time.After(20 * time.Second):
fmt.Println("time out ")
}
}
// 业务事件, 需要在ChainCode实现类中的Invoke方法,通过SetEvent实现:
stub.SetEvent("aaa",[]byte(""))
version: 1.0.0
client:
organization: org1 # 表示这个client是属于哪个组织的
logging:
level: debug # 日志打印级别
eventService:
type: eventhub
cryptoconfig: # 指定msp的根目录
path: ${GOPATH}/src/github.com/hyperledger/fabric/imocc/deploy/crypto-config
credentialStore:
path: "/tmp/state-store"
cryptoStore:
path: /tmp/msp
BCCSP: # 密码学相关的配置,默认即可
security:
enabled: true
default:
provider: "SW"
hashAlgorithm: "SHA2"
softVerify: true
level: 256
tlsCerts: # tls 配置
systemCertPool: true
client:
key:
path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/config/mutual_tls/client_sdk_go-key.pem
cert:
path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/config/mutual_tls/client_sdk_go.pem
channels: # 核心配置,这个配置可以认为是全局声明,具体的是在下面配置的
assetschannel: # channel 名称
orderers: # order order节点配置 既排序节点
- orderer.imocc.com
peers:
peer0.org1.imocc.com:
endorsingPeer: true
chaincodeQuery: true
ledgerQuery: true
eventSource: true
peer1.org1.imocc.com:
endorsingPeer: true
chaincodeQuery: true
ledgerQuery: true
eventSource: true
policies:
queryChannelConfig:
minResponses: 1
maxTargets: 1
retryOpts:
attempts: 5
initialBackoff: 500ms
maxBackoff: 5s
backoffFactor: 2.0
organizations: # 组织信息的配置
org1:
mspid: Org1MSP
cryptoPath: peerOrganizations/org1.imocc.com/users/{username}@org1.imocc.com/msp # 指定证书的位置,是一个相对路径
peers: # 指定组织下边有多少个peer
- peer0.org1.imocc.com
certificateAuthorities:
ordererorg: # 配置order节点的信息
mspID: "OrdererMSP"
cryptoPath: ordererOrganizations/imocc.com/users/{username}@imocc.com/msp
orderers:
orderer.imocc.com:
url: 127.0.0.1:7050
grpcOptions:
ssl-target-name-override: orderer.imocc.com
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
allow-insecure: true # 非tls连接
tlsCACerts:
path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
peers:
peer0.org1.imocc.com:
url: 127.0.0.1:27051
eventUrl: 127.0.0.1:27053
grpcOptions:
ssl-target-name-override: peer0.org1.imocc.com
keep-alive-time: 0s
keep-alive-timeout: 20s
keep-alive-permit: false
fail-fast: false
allow-insecure: true
tlsCACerts:
path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem