识别在 Hyperledger Fabric V1.0 链代码中调用 peer/organisation

Identify invoking peer/organisation inside Hyperledger Fabric V1.0 chaincode

有什么方法可以知道 golang chaincode for Hyperledger Fabric V1.0 中的调用节点和组织?

目前所有 API 可用于链码的信息都在 interface.go 文件中描述。目前没有 API 可以让你在链代码中识别调用节点和组织。我认为这样做的主要原因是链码必须对这种类型的信息不可知,因为所有由对等方和链码管理的 ACL 都应该对其保持不可知性,无论调用它的人是谁,都应保持确定性行为,并且是无状态的。

如果需要,您可能可以尝试利用创建交易提案请求的客户的身份,方法是使用 GetCreator API:

    // GetCreator returns `SignatureHeader.Creator` (e.g. an identity)
    // of the `SignedProposal`. This is the identity of the agent (or user)
    // submitting the transaction.
    GetCreator() ([]byte, error)

然后解析client certificate来了解client,也可以考虑使用transient fields让client把相关信息放在那里,以后chaincode可以读取:

// GetTransient returns the `ChaincodeProposalPayload.Transient` field.
// It is a map that contains data (e.g. cryptographic material)
// that might be used to implement some form of application-level
// confidentiality. The contents of this field, as prescribed by
// `ChaincodeProposalPayload`, are supposed to always
// be omitted from the transaction and excluded from the ledger.
GetTransient() (map[string][]byte, error)

在 fabric 1.1 中,似乎有一个新的库 cid 可以满足您的要求。

正在获取客户的 ID

// GetID returns the ID associated with the invoking identity.  This ID
// is guaranteed to be unique within the MSP.
func GetID(stub ChaincodeStubInterface) (string, error) 

获取 MSP ID

// GetMSPID returns the ID of the MSP associated with the identity that
// submitted the transaction
func GetMSPID(stub ChaincodeStubInterface) (string, error)

有关完整信息,您可以参考 Client Identity Chaincode Library

client identity 链代码库使开发人员能够编写基于客户端身份(即链代码的调用者)做出访问控制决策的链代码。

您可以使用 cid 包中的 GetID 函数获取调用客户端的 ID。

您可能会发现上述软件包中有用的其他一些功能是:

  • GetX509Certificate可用于获取客户端的X509证书
  • GetAttributeValue 以获取在注册期间与客户关联的属性。

除了 cid 包中提供的功能外,您可能会发现这些功能也很有用。

  • GetSignedProposal它returns签名的提议对象,它包含交易提议的所有数据元素部分。
  • GetCreator 它returns SignatureHeader.Creator(例如一个身份)的SignedProposal。这是提交交易的代理人(或用户)的身份。

我通过寻找一种方法来限制私有数据集合的非成员查询来自对等方的私有数据,从而结束了这个问题。我正在考虑在链代码中添加一个验证器,以查看客户端是否与对等方属于同一组织。

如果您希望这样做,请在创建私有数据集合时使用 memberOnlyRead 属性。您可以使用此技术构建更高级的限制。