应该采取哪些最佳实践来避免错误并编写有效的Hyperledger Fabric Chaincode? p>
答案 0 :(得分:2)
编写Hyperledger Fabric链码的一般准则。
有关以下内容的详细说明,请参见以下链接:
https://gist.github.com/arnabkaycee/d4c10a7f5c01f349632b42b67cee46db
下面简要介绍了一些步骤:
使用日志记录非常简单。使用Fabric的内置记录器。 Fabric提供了以下日志记录机制:
对于Golang :https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeLogger
对于NodeJS :https://fabric-shim.github.io/Shim.html#.newLogger__anchor
对于Java :您可以使用任何标准的日志记录框架,例如Log4J
避免使用全局密钥-Hyperledger Fabric在提交事务时使用乐观锁模型。在认可和承诺的两阶段过程中,如果您在认可中读取的某些密钥版本已更改,直到您的交易到达提交阶段,您将收到MVCC_READ_CONFLICT错误。当一个或多个并发事务正在更新同一密钥时,通常是这种可能性。
明智地使用Couch数据库查询
沙发数据库查询请勿更改事务的读取集- Mongo查询仅用于查询键值存储(也称为StateDB)。它不会更改事务的读取集。这可能会导致事务中的幻像读取。
仅可搜索存储在沙发数据库中的数据-不要试图使用MangoQuery通过键的名称搜索键。尽管您可以访问CouchDB的Fauxton控制台,但是您无法通过查询存储在数据库中的密钥来访问密钥。示例:不允许通过 channelName \ 0000KeyName 查询。最好将密钥作为属性存储在数据本身中。
写确定性链代码-切勿编写非确定性链代码。这意味着,如果我在2个或更多不同的环境中在不同的时间执行链码,则结果应始终相同,例如将值设置为当前时间或设置随机数。例如:避免使用诸如调用rand.New(...)
,t := time.Now()
之类的语句,甚至避免依赖未持久保存到分类帐中的全局变量(check)。
这是因为,如果生成的读写集不相同,验证系统链码可能会拒绝它并抛出ENDORSEMENT_POLICY_FAILURE。
从您的链码中调用“其他链码”时要小心。-当两个链码都在同一通道上时,可以从另一个链中调用一个链码。但是请注意,如果它在另一个通道上,则只会得到chaincode函数返回的内容(仅当当前调用者有权访问该通道上的数据时)。即使试图写入一些数据,也不会在其他通道中提交任何数据。当前,跨通道链码链码调用不会更改其他通道上的数据(更改写集)。因此,每个事务一次只能写入一个通道。
记住要设置链码执行超时-通常,在高负载期间,您的链码可能无法在30秒内完成执行。最好根据需要自定义设置超时。这由对等方的core.yaml中的参数控制。您可以通过在docker compose文件中设置环境变量来覆盖它:
示例:CORE_CHAINCODE_EXECUTETIMEOUT=60s
避免访问外部资源-访问外部资源(http)可能会给您的链码暴露漏洞和安全威胁。您不希望来自外部来源的恶意代码以任何方式影响链式代码逻辑。因此,请尽可能避免拨打外部电话。