首页区块链技术智能合约Hyperledger Fabric实现认证插件功能
  • 评论(0)

分享到

微博

微信

QQ

Hyperledger Fabric实现认证插件功能

实现认证插件

要实现认可插件,必须实现core / handlers / endorsement / api / endorsement.go中的插件接口:

// Plugin endorses a proposal response
type Plugin interface {
    // Endorse signs the given payload(ProposalResponsePayload bytes), and optionally mutates it.
    // Returns:
    // The Endorsement: A signature over the payload, and an identity that is used to verify the signature
    // The payload that was given as input (could be modified within this function)
    // Or error on failure
    Endorse(payload []byte, sp *peer.SignedProposal) (*peer.Endorsement, []byte, error)

    // Init injects dependencies into the instance of the Plugin
    Init(dependencies ...Dependency) error
}

通过让对等方在PluginFactory接口中调用New方法,为每个通道创建给定插件类型的认可插件实例(通过方法名称标识为HandlerLibrary的实例方法或插件.so文件路径),也将由插件开发人员实现:

// PluginFactory creates a new instance of a Plugin
type PluginFactory interface {
    New() Plugin
}

Init方法接收在core / handlers / endorsement / api /下声明的所有依赖项作为输入,标识为嵌入Dependency接口。

在创建Plugin实例之后,对等体在其上调用Init方法,并将依赖关系作为参数传递。

目前,Fabric为代言插件提供了以下依赖项:

SigningIdentityFetcher:根据给定的签名提议返回SigningIdentity的实例:

// SigningIdentity signs messages and serializes its public identity to bytes
type SigningIdentity interface {
    // Serialize returns a byte representation of this identity which is used to verify
    // messages signed by this SigningIdentity
    Serialize() ([]byte, error)

    // Sign signs the given payload and returns a signature
    Sign([]byte) ([]byte, error)
}

StateFetcher:获取与全局状态交互的State对象:

// State defines interaction with the world state
type State interface {
    // GetPrivateDataMultipleKeys gets the values for the multiple private data items in a single call
    GetPrivateDataMultipleKeys(namespace, collection string, keys []string) ([][]byte, error)

    // GetStateMultipleKeys gets the values for multiple keys in a single call
    GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error)

    // GetTransientByTXID gets the values private data associated with the given txID
    GetTransientByTXID(txID string) ([]*rwset.TxPvtReadWriteSet, error)

    // Done releases resources occupied by the State
    Done()
 }

插件功能验证

要实现验证插件,必须实现core / handlers / validation / api / validation.go中的Plugin接口:

// Plugin validates transactions
type Plugin interface {
    // Validate returns nil if the action at the given position inside the transaction
    // at the given position in the given block is valid, or an error if not.
    Validate(block *common.Block, namespace string, txPosition int, actionPosition int, contextData ...ContextDatum) error

    // Init injects dependencies into the instance of the Plugin
    Init(dependencies ...Dependency) error
}

每个ContextDatum都是由对等方传递给验证插件的其他运行时派生元数据。 目前,唯一传递的ContextDatum是代表chaincode规则的代码:

 // SerializedPolicy defines a serialized policy
type SerializedPolicy interface {
      validation.ContextDatum

      // Bytes returns the bytes of the SerializedPolicy
      Bytes() []byte
 }

通过让对等方在PluginFactory接口中调用New方法,为每个通道创建给定插件类型的验证插件实例(通过方法名称识别为HandlerLibrary的实例方法或插件.so文件路径),也将由插件开发人员实现:

// PluginFactory creates a new instance of a Plugin
type PluginFactory interface {
    New() Plugin
}

Init方法应该接收在core / handlers / validation / api /下声明的所有依赖项作为输入,标识为嵌入Dependency接口。

在创建Plugin实例之后,对等体在其上调用Init方法,并将依赖关系作为参数传递。

目前,Fabric为验证插件提供了以下依赖项:

IdentityDeserializer:将身份的字节表示转换为可用于验证由其签名的签名的Identity对象,根据其对应的MSP进行验证,并查看它们是否满足给定的MSP Principal。 完整规范可以在core / handlers / validation / api / identity / identities.go中找到。

PolicyEvaluator:评估是否满足给定策略:

// PolicyEvaluator evaluates policies
type PolicyEvaluator interface {
    validation.Dependency

    // Evaluate takes a set of SignedData and evaluates whether this set of signatures satisfies
    // the policy with the given bytes
    Evaluate(policyBytes []byte, signatureSet []*common.SignedData) error
}

StateFetcher:获取与全局状态交互的State对象:

// State defines interaction with the world state
type State interface {
    // GetStateMultipleKeys gets the values for multiple keys in a single call
    GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error)

    // GetStateRangeScanIterator returns an iterator that contains all the key-values between given key ranges.
    // startKey is included in the results and endKey is excluded. An empty startKey refers to the first available key
    // and an empty endKey refers to the last available key. For scanning all the keys, both the startKey and the endKey
    // can be supplied as empty strings. However, a full scan should be used judiciously for performance reasons.
    // The returned ResultsIterator contains results of type *KV which is defined in protos/ledger/queryresult.
    GetStateRangeScanIterator(namespace string, startKey string, endKey string) (ResultsIterator, error)

    // Done releases resources occupied by the State
    Done()
}

注意事项:

  1. 跨对等体的验证插件一致性:在未来的版本中,Fabric通道基础结构将保证在任何给定的区块链高度,通道中的所有对等体对给定的链代码使用相同的验证逻辑,以消除错误配置的可能性。可能会导致意外运行不同实现的同行之间的状态分歧。但是,目前系统操作员和管理员有责任确保不会发生这种情况。

  2. 验证插件错误处理:每当验证插件无法确定给定事务是否有效时,由于某些暂时执行问题(如无法访问数据库),它应返回在核心/处理程序中定义的ExecutionFailureError类型的错误/validation/api/validation.go。返回的任何其他错误都被视为认可策略错误,并将事务标记为验证逻辑无效。但是,如果返回ExecutionFailureError,则事物处理将暂停,而不是将事务标记为无效。这是为了防止不同同伴之间的状态分歧。

  3. 将Fabric代码导入插件:作为插件的一部分,非常不鼓励使用除protobufs之外的Fabric来导入代码,并且当Fabric代码在发行版之间发生更改时可能会导致问题,或者在运行混合对等版本时可能导致不可操作性问题。理想情况下,插件代码应该只使用给定的依赖项,并且应该导入除protobufs之外的最小值。

©免责声明和风险提示:本文系用户自行发布或转载,不代表比特万象任何观点,如有任何形式的转载请联系原作者。文章中的所有内容均不构成比特万象任何的投资建议及意见、立场,请您根据自身评估做出理性决策。比特万象仅提供网络存储空间服务,如文章侵犯到您的合法权利,请您通知比特万象予以删除。
粤ICP备17084271号-2 Copyright © 比特万象 版权所有