在我看来,我总是有一个理论上和一般性的问题:让我们假设有两个组织:org1和org2。每个组织都有一个同伴。如果认可政策设置为AND(org1,org2),这意味着每个交易都需要得到org1和org2同行的认可。
让我们假设一个场景:org1和org2已经认可了5个交易。但有一天,让我们说,org1根本不想支持任何交易,这意味着对于每个新的传入交易(例如第6个交易),org1想要拒绝,并拒绝支持新交易。所以我的问题是:org1如何拒绝支持新的传入事务?用更生动的话说,作为一个组织,怎么说不?提前致谢。
认可不是一种选择,用户在是和否之间选择。交易在具有链码的对等体中执行,并且当由认可策略指定的对等体对结果达成一致时,则认为该交易被认可。执行事务的过程可能取决于对等方的分类账。例如,所有同行都存储在分类账中,Ram有50个值Ram:50
,现在新交易为Ram的账户增加了20个值。这将在赞同对等体中执行,并且所有对等体都同意添加的结果Ram:70
。现在该交易将得到认可。但是如果一个对等方的分类账被改为Ram:40
并且该对等方需要支持该交易,那么它将得出Ram:60
的结果,该结果与其他同行的结果不匹配,并且该交易将不会被认可。
实际上你可以用一个可以在同伴启动时加载的custom pluggable code来关闭它。您需要做的是创建一个身份验证过滤器,它将阻止认可和返回错误,而不是将请求转发到下一个身份验证过滤器。
来自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拒绝提议,或将其传递给下一个过滤器。
最后一个过滤器始终是对等体中真正的代言人服务,它实际上执行链代码执行和认可(签署结果)。