组织如何拒绝背书交易
How to refuse endorsing transactions as an organization
我脑子里一直有一个理论性的一般性问题:假设有两个组织:org1 和 org2。每个组织都有一个同行。如果背书策略设置为AND(org1, org2),这意味着每笔交易都需要org1和org2的peer的背书。
假设一个场景:org1和org2已经背书了5笔交易。但是有一天,比方说,org1 根本不想背书任何交易,这意味着对于每笔新的传入交易(例如第 6 笔交易),org1 都想说不,并拒绝背书新交易。所以我的问题是:
org1 如何拒绝认可新的传入交易?用更生动的话来说,作为一个组织,如何说不?提前致谢。
背书不是一个选项,用户可以在是和否之间进行选择。交易在具有链码的节点中执行,当节点按照背书策略的规定就结果达成一致时,交易就被认为是被背书的。交易的执行过程可能取决于对等方的分类账。例如,所有节点都在账本中存储了 Ram 有 50 个价值 Ram:50
,现在新的交易将 20 个价值添加到 Ram 的账户中。这在背书节点中执行,添加的结果 Ram:70
得到所有节点的同意。现在交易将被背书。但是,如果一个节点的分类账被更改为 Ram:40
并且该节点需要为交易背书,它会得出一个 Ram:60
的结果,这与其他节点的结果不匹配,并且交易不会被背书。
您实际上可以通过一些 custom pluggable code 实现这一点,它可以在对等点启动时加载。
您需要做的是创建一个身份验证过滤器,以防止背书和 return 错误,而不是将请求转发到下一个身份验证过滤器。
来自 core.yaml 文件:
handlers:
authFilters:
-
name: DefaultAuth
-
name: ExpirationCheck # This filter checks identity x509 certificate expiration
这些是对等体中存在的默认内置过滤器。例如 - ExpirationCheck 过滤器 - checks for expiration 客户端身份。
你需要做的是添加另一个过滤器,它只是拒绝来自客户的提议(我们将其命名为 - NopeFilter),然后将其编译为 golang 插件,并添加以下条目:
-
name: FilterOne
library: /opt/lib/filter.so
过滤器的内容将与 DefaulAuth 过滤器(什么都不做)非常相似:
func (nf *NopeFilter) ProcessProposal(ctx context.Context, signedProp *peer.SignedProposal) (*peer.ProposalResponse, error) {
return nil, errors.New("nope")
}
在对等启动时,从 core.yaml 部分读取过滤器列表,然后 chained into a chain of filters 拒绝提议,或将其传递给下一个过滤器。
最后一个过滤器始终是节点中真正的背书服务,它实际执行链代码执行和背书(对结果签名)。
我脑子里一直有一个理论性的一般性问题:假设有两个组织:org1 和 org2。每个组织都有一个同行。如果背书策略设置为AND(org1, org2),这意味着每笔交易都需要org1和org2的peer的背书。
假设一个场景:org1和org2已经背书了5笔交易。但是有一天,比方说,org1 根本不想背书任何交易,这意味着对于每笔新的传入交易(例如第 6 笔交易),org1 都想说不,并拒绝背书新交易。所以我的问题是: org1 如何拒绝认可新的传入交易?用更生动的话来说,作为一个组织,如何说不?提前致谢。
背书不是一个选项,用户可以在是和否之间进行选择。交易在具有链码的节点中执行,当节点按照背书策略的规定就结果达成一致时,交易就被认为是被背书的。交易的执行过程可能取决于对等方的分类账。例如,所有节点都在账本中存储了 Ram 有 50 个价值 Ram:50
,现在新的交易将 20 个价值添加到 Ram 的账户中。这在背书节点中执行,添加的结果 Ram:70
得到所有节点的同意。现在交易将被背书。但是,如果一个节点的分类账被更改为 Ram:40
并且该节点需要为交易背书,它会得出一个 Ram:60
的结果,这与其他节点的结果不匹配,并且交易不会被背书。
您实际上可以通过一些 custom pluggable code 实现这一点,它可以在对等点启动时加载。 您需要做的是创建一个身份验证过滤器,以防止背书和 return 错误,而不是将请求转发到下一个身份验证过滤器。
来自 core.yaml 文件:
handlers:
authFilters:
-
name: DefaultAuth
-
name: ExpirationCheck # This filter checks identity x509 certificate expiration
这些是对等体中存在的默认内置过滤器。例如 - ExpirationCheck 过滤器 - checks for expiration 客户端身份。
你需要做的是添加另一个过滤器,它只是拒绝来自客户的提议(我们将其命名为 - NopeFilter),然后将其编译为 golang 插件,并添加以下条目:
-
name: FilterOne
library: /opt/lib/filter.so
过滤器的内容将与 DefaulAuth 过滤器(什么都不做)非常相似:
func (nf *NopeFilter) ProcessProposal(ctx context.Context, signedProp *peer.SignedProposal) (*peer.ProposalResponse, error) {
return nil, errors.New("nope")
}
在对等启动时,从 core.yaml 部分读取过滤器列表,然后 chained into a chain of filters 拒绝提议,或将其传递给下一个过滤器。
最后一个过滤器始终是节点中真正的背书服务,它实际执行链代码执行和背书(对结果签名)。