编写 Hyperledger Fabric Chaincode 时应遵循的最佳实践

2023-12-14

为了避免错误并编写高效的 Hyperledger Fabric Chaincode,应该遵循哪些最佳实践?


编写 Hyperledger Fabric 链码的一般指南。

有关详细说明,请参阅以下链接:

https://gist.github.com/arnabkaycee/d4c10a7f5c01f349632b42b67cee46db

下面简要提及一些步骤:

  1. 使用 Chaincode DevMode
  2. 使用链码日志记录

使用日志记录既简单又容易。使用 Fabric 的内置记录器。 Fabric提供的日志机制如下:

对于戈兰: https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeLogger

对于 NodeJS: https://fabric-shim.github.io/Shim.html#.newLogger__anchor

For Java:您可以使用任何标准日志记录框架,例如 Log4J

  1. 避免使用全局键- Hyperledger Fabric 在提交事务时使用乐观锁定模型。在背书和提交的两阶段过程中,如果您在背书中读取的密钥的某些版本发生了更改,直到您的事务到达提交阶段,您会收到 MVCC_READ_CONFLICT 错误。当一个或多个并发事务更新相同的密钥时,这通常是一种概率。

  2. 明智地使用 Couch DB 查询

    • Couch DB 查询不会更改事务的 READ SET- Mongo 查询仅用于查询键值存储(又名 StateDB)。它不会改变事务的读取集。这可能会导致事务中出现幻读。

    • 仅可搜索您存储在 couchDB 中的数据- 不要试图使用 MangoQuery 按名称搜索键。尽管您可以访问 CouchDB 的 Fauxton 控制台,但无法通过查询存储在数据库中的密钥来访问密钥。示例:查询方式频道名称\0000密钥名称不允许。最好将密钥作为数据本身的属性存储。

  3. 编写确定性链代码- 切勿编写不确定的链代码。这意味着,如果我在不同时间在 2 个或更多不同环境中执行链代码,结果应该始终相同,例如将值设置为当前时间或设置随机数。例如:避免诸如调用之类的语句rand.New(...) , t := time.Now()甚至依赖未持久保存到分类帐的全局变量(check)。 这是因为,如果生成的读写集不相同,验证系统链代码可能会拒绝它并抛出 ENDORSMENT_POLICY_FAILURE。

  4. 从您的链代码调用另一个链代码时要小心。- 当两个链码位于同一通道上时,从另一个链码调用是可以的。但请注意,如果它位于另一个通道上,那么您只能获得链码函数返回的内容(仅当当前调用者有权访问该通道上的数据时)。即使尝试写入一些数据,也不会在另一个通道中提交任何数据。目前,跨通道链码链码调用不会更改其他通道上的数据(更改写入集)。因此,每个事务一次只能写入一个通道。

  5. 记得设置Chaincode执行超时- 通常情况下,在高负载期间,您的链码可能无法在 30 秒内完成执行。根据您的需要自定义超时是一个很好的做法。这是由对等方 core.yaml 中的参数控制的。您可以通过在 docker compose 文件中设置环境变量来覆盖它: 例子:CORE_CHAINCODE_EXECUTETIMEOUT=60s

  6. 避免访问外部资源- 访问外部资源 (http) 可能会暴露链代码的漏洞和安全威胁。您不希望来自外部来源的恶意代码以任何方式影响您的链码逻辑。所以尽量远离外部来电。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写 Hyperledger Fabric Chaincode 时应遵循的最佳实践 的相关文章

随机推荐