Hyperledger fabric 在Hyperledger Fabric 1.4中存储非字符串

Hyperledger fabric 在Hyperledger Fabric 1.4中存储非字符串,hyperledger-fabric,hyperledger,Hyperledger Fabric,Hyperledger,从我阅读的内容来看,只能通过将字符串值从节点SDK传递到链码 但是,从链码的角度来看,创建一个包含布尔和整数的资产并存储它们是没有问题的 因此我的问题是:存储非字符串属性被认为是一种不好的做法吗?如果不是,实现它的最佳方法是什么?当然,我可以发送字符串,然后智能合约将其转换回bool/int,但这听起来相当难听。我还猜测,我可以发送一个JSON,而不是发送…args,但同样非常难看。好的,这是从JAVA HLF实现的角度来看的。假设Node JS和Java具有相同的功能,“putState”方法

从我阅读的内容来看,只能通过将字符串值从节点SDK传递到链码

但是,从链码的角度来看,创建一个包含布尔和整数的资产并存储它们是没有问题的


因此我的问题是:存储非字符串属性被认为是一种不好的做法吗?如果不是,实现它的最佳方法是什么?当然,我可以发送字符串,然后智能合约将其转换回bool/int,但这听起来相当难听。我还猜测,我可以发送一个JSON,而不是发送
…args
,但同样非常难看。

好的,这是从JAVA HLF实现的角度来看的。假设Node JS和Java具有相同的功能,“putState”方法接受“byte”或“String”数据类型,就我所知,putState是将数据放入分类账的唯一方法。因此,您不能在我的视图中放置字符串/字节以外的任何内容。所以,尽管这很难看,但我认为将字符串或字节放入分类账是放置和获取数据的唯一方法(至少在HLF 1.4中是这样)


所有写入分类账的数据实际上都会在后台存储到“CouchDB”中,因此如果您将JSON字符串写入分类账,您可以稍后编写“CouchDB查询”并从分类账中获取数据(就像使用SQL从传统RDBMS获取数据一样)。

关键是您希望将非字符串数据类型存储到分类账中。但是现在,节点JS/Java SDK只支持
putState
方法,只接受字符串或字节


例如,如果您想在
putState
方法上输入数字或布尔值。因此在
submitTransaction
的SDK端,您必须
JSON.stringify
输入数据(如果它不是字符串数据类型)。不幸的是,这是我们目前唯一的方法。

您总是需要在客户端和实际链码本身之间进行某种类型的转换|序列化/反序列化


链码本身只接受字节数组作为参数。如果您的参数有简单/基本类型(string、int、boolean等),那么从客户端将它们作为字符串传递,并在链码本身中转换它们是最简单的方法。我承认这不是非常干净,但鉴于我们支持多种语言的客户端和链码,并允许您进行混合和匹配,我们不能对类型使用一种语言的本机序列化。

我想我们谈的不是同一件事,我想我用了一个不好的标题。假设我想在区块链中存储
{id:'ABC123',available:true}
。在chaincode中,假设我有一个智能合约
save(ctx,id,available)
,它在序列化的JSON上调用
putState
,我们同意这一点,它是有效的。然而,我的问题是,在我的应用程序中,如何使用NodeSDK在调用
save
时传递布尔值作为参数。据我所知,该应用程序的唯一方法是
submitTransaction('save',id,available)
,它只接受整数。当然,我可以使用JSON参数,但它看起来很粗糙。是的,我认为数据类型还不支持这种方式。对于Java,我想知道HLF(从1.4开始)是否可以直接接收Java对象而不是“仅字符串”。这也将减少大量的锅炉板编码。关于我们不能/不支持本机对象或特定于语言的序列化,请参见下面我的回答。我认为在某个时候,如果支持特定于语言的序列化,那将是一件好事。想象一下,能够发送Java对象,从另一端获取并使用它。因此,锅炉板编码的大部分将被消除。我不确定这对HLF来说意味着什么,但它的卓越之处不仅在于创造的奇迹,还在于它的易用性。我要说的是,我们应该展示直接发送字节的能力。通过这种方式,您可以选择一种与语言无关的序列化,如protobufs、ASN1等