Fabric GO SDK 的背书政策问题
Problem with Endorsment Policy with Fabric GO SDK
我有一个 hyperledger fabric testnet,它有 2 个组织,org1 中有 3 个对等点,org2 中有 2 个对等点。每个组织的 peer0 是锚节点。我想用只有一个组织的背书策略实例化一个链代码:Org1,所以我指定了策略:"AND('org1MSP.member')".
我只在 org1 的节点上安装了链码,因为 org2 不是背书者。但是,链代码不会实例化,因为它会将提议发送给其他组织 (org2) 中的对等方。
问题是因为 org2 中的这些节点没有安装链代码,但是...为什么 SDK 向不属于背书策略的节点发送背书请求?
这是我的配置文件,如您所见,我只有一个 org1 节点:https://gist.github.com/mtnieto/02dd17097de64a73bd627594056598ed
我已将以下功能添加到配置中,但它不起作用。
channels:
# multi-org test channel
examplechannel:
peers:
peer0.org1.example.com:
endorsingPeer: true
chaincodeQuery: true
ledgerQuery: true
eventSource: true
peer1.org1.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
peer2.org1.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
peer0.org2.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
peer1.org2.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
日志如下:
"error": "Error creating Chaincode: sending deploy transaction
proposal failed: Multiple errors occurred: - Transaction processing
for endorser [peer0.org2.example.com:8051]: Endorser Client Status
Code: (23) CHAINCODE_NAME_NOT_FOUND. Description: cannot get package
for chaincode (examplecc:2) - Transaction processing for endorser
[peer1.org2.example.com:6051]: Endorser Client Status Code: (23)
CHAINCODE_NAME_NOT_FOUND. Description: cannot get package for
chaincode (examplecc:2)"
实例化链码的代码如下。 (在之前的阶段我已经安装了链码)
sdk, err = fabsdk.New(config.FromFile("config.yaml"))
if err != nil {
log.Errorf("Failed to create new SDK: ", err)
return nil, err
}
adminContext := sdk.Context("admin", "org1"))
// Org resource management client
orgResMgmt, err := resmgmt.New(adminContext)
if err != nil {
log.Errorf("Failed to create resource management client %v: ", err)
return nil, err
}
ccPolicy, err := cauthdsl.FromString(instantiateReq.EndorsmentPolicy)
if err != nil {
log.Errorf(" Error parsing endorsment policy %v: ", err)
return "", err
}
instantiateRequest := resmgmt.InstantiateCCRequest{Name: instantiateReq.Name, Path: instantiateReq.Path, Version: instantiateReq.Version, Args: instantiateReq.Args, Policy: ccPolicy}
当对等点更新为锚点时会发生这种情况。换句话说,如果我在初始化网络时不在对等点执行以下命令,则不会发生错误。
(在 peer0 org1 上下文中)
peer channel update -o orderer0.example.com:7050 -c $CHANNEL_NAME --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -f ./channel-artifacts/org1MSPanchors.tx >&log.txt
在 peer0 org2 上下文中
peer channel update -o orderer0.example.com:7050 -c $CHANNEL_NAME --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -f ./channel-artifacts/org2MSPanchors.tx >&log.txt
1.4.1版本的bug,非背书组织正在尝试执行lscc对交易进行背书。
我已经将网络升级到1.4.2,现在问题似乎已经消失了。
我有一个 hyperledger fabric testnet,它有 2 个组织,org1 中有 3 个对等点,org2 中有 2 个对等点。每个组织的 peer0 是锚节点。我想用只有一个组织的背书策略实例化一个链代码:Org1,所以我指定了策略:"AND('org1MSP.member')".
我只在 org1 的节点上安装了链码,因为 org2 不是背书者。但是,链代码不会实例化,因为它会将提议发送给其他组织 (org2) 中的对等方。
问题是因为 org2 中的这些节点没有安装链代码,但是...为什么 SDK 向不属于背书策略的节点发送背书请求?
这是我的配置文件,如您所见,我只有一个 org1 节点:https://gist.github.com/mtnieto/02dd17097de64a73bd627594056598ed
我已将以下功能添加到配置中,但它不起作用。
channels:
# multi-org test channel
examplechannel:
peers:
peer0.org1.example.com:
endorsingPeer: true
chaincodeQuery: true
ledgerQuery: true
eventSource: true
peer1.org1.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
peer2.org1.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
peer0.org2.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
peer1.org2.example.com:
endorsingPeer: false
chaincodeQuery: false
ledgerQuery: true
eventSource: true
日志如下:
"error": "Error creating Chaincode: sending deploy transaction proposal failed: Multiple errors occurred: - Transaction processing for endorser [peer0.org2.example.com:8051]: Endorser Client Status Code: (23) CHAINCODE_NAME_NOT_FOUND. Description: cannot get package for chaincode (examplecc:2) - Transaction processing for endorser [peer1.org2.example.com:6051]: Endorser Client Status Code: (23) CHAINCODE_NAME_NOT_FOUND. Description: cannot get package for chaincode (examplecc:2)"
实例化链码的代码如下。 (在之前的阶段我已经安装了链码)
sdk, err = fabsdk.New(config.FromFile("config.yaml"))
if err != nil {
log.Errorf("Failed to create new SDK: ", err)
return nil, err
}
adminContext := sdk.Context("admin", "org1"))
// Org resource management client
orgResMgmt, err := resmgmt.New(adminContext)
if err != nil {
log.Errorf("Failed to create resource management client %v: ", err)
return nil, err
}
ccPolicy, err := cauthdsl.FromString(instantiateReq.EndorsmentPolicy)
if err != nil {
log.Errorf(" Error parsing endorsment policy %v: ", err)
return "", err
}
instantiateRequest := resmgmt.InstantiateCCRequest{Name: instantiateReq.Name, Path: instantiateReq.Path, Version: instantiateReq.Version, Args: instantiateReq.Args, Policy: ccPolicy}
当对等点更新为锚点时会发生这种情况。换句话说,如果我在初始化网络时不在对等点执行以下命令,则不会发生错误。
(在 peer0 org1 上下文中)
peer channel update -o orderer0.example.com:7050 -c $CHANNEL_NAME --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -f ./channel-artifacts/org1MSPanchors.tx >&log.txt
在 peer0 org2 上下文中
peer channel update -o orderer0.example.com:7050 -c $CHANNEL_NAME --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -f ./channel-artifacts/org2MSPanchors.tx >&log.txt
1.4.1版本的bug,非背书组织正在尝试执行lscc对交易进行背书。
我已经将网络升级到1.4.2,现在问题似乎已经消失了。