新的Hyperledger Fabric:Go SDK软件模型



上一篇文章中,我们讨论了Hyperledger Fabric中代码代码的新编程模型。尽管尚未发布新的Go SDK,但没有任何东西可以阻止我们现在看到未来的情况,甚至无法在测试版本中对其进行测试。尚未实现所有功能(例如commit handler),但是软件模型的计划设计已经很明确,因此让我们仔细研究一下。

在此存储库中,我对示例网格进行了少许修改,使其以我们在上一篇文章中看到的链代码开头,并添加了一个使用新API编写的简单客户端。该存储库包含有关启动和配置网络的简单说明。

如您在go.mod所见,要使用新的API,我们不会发布(尚无发布),而是对特定提交进行的所有更改(这是发布之前的临时措施): 在我们的应用程序中,我们将网关包导入app.go中 。新API的本质为所有SDK(go,node,java)提供通用抽象,并减少了开发人员在项目之间转移的样板。钱包就是这样一种抽象

require github.com/hyperledger/fabric-sdk-go v1.0.0-beta1.0.20200404205634-0e550fc1a918



"github.com/hyperledger/fabric-sdk-go/pkg/gateway"

钱包的初始化如下所示:

wallet, err := gateway.NewFileSystemWallet("wallet")
if err != nil {
	fmt.Errorf(err.Error())
}

err = wallet.Put("admin", gateway.NewX509Identity("Org1MSP", string(cert), string(privKey)))
if err != nil {
	fmt.Errorf(err.Error())
}

Wallet是WalletStore接口的实现:

type WalletStore interface {
	Put(label string, stream []byte) error
	Get(label string) ([]byte, error)
	List() ([]string, error)
	Exists(label string) bool
	Remove(label string) error
}

如您所见,该界面描述了用户身份存储库的基本操作除了文件系统之外,身份还可以存储在内存中,只需使用另一个内置工厂-NewInMemoryWallet()即可

连接到网络:

gw, err := gateway.Connect(gateway.WithConfig(config.FromFile("./../connection-org1.yaml")),
gateway.WithIdentity(wallet, "admin"),
gateway.WithDiscovery(true),
gateway.WithCommitHandler(gateway.DefaultCommitHandlers.OrgAny))

gateway.Connect()返回指向Gateway的指针,该对象提供网络连接。gateway.WithCommitHandler-一种功能选项,用于设置等待提交事件的策略。到目前为止,尚未实施任何策略(这意味着将使用“旧” SDK 默认策略“等待所有背书人的提交”),但是计划了以下策略:

  • gateway.DefaultCommitHandlers.OrgAll-等待组织中所有对等方的提交(默认情况下)
  • gateway.DefaultCommitHandlers.OrgAny-等待任何组织对等方的提交
  • gateway.DefaultCommitHandlers.NetworkAll-等待通道中所有组织的所有对等方的提交
  • gateway.DefaultCommitHandlers.NetworkAny-等待通道中任何对等方的提交

您甚至根本不能等待任何提交,稍后再讨论,但是首先请注意以下几点:

network, err := gw.GetNetwork("mychannel")
if err != nil {
	panic(err)
}

contract := network.GetContract("mycc")

首先,我们从通道中获取将要与之交互的同级的子集,然后是指向Contract的指针,Contract的方法将使我们能够与链码进行交互。

现在,我们有机会确定是否使用某种策略来等待提交。首先,让我们看一下等待提交的事务:

result, err := contract.SubmitTransaction("Create", "b", "50")


在这里,我们开始在对等方进行事务模拟,获得答案,将投标响应发送给订购者,等待验证并按照上述等待提交的策略进行提交。标准和熟悉的行为。我们进一步看。

result, err := contract.EvaluateTransaction("Read", "b")
	if err != nil {
		panic(err)
	}
fmt.Println(string(result))

在这种情况下,客户会收到提案响应,并且不执行其他任何操作。我们不希望有任何提交这应该用于读取状态。

transient := make(map[string][]byte)
transient["someTransient"] = []byte("mytransientdata")
txn, err := contract.CreateTransaction("Update", gateway.WithTransient(transient))
if err != nil {
	panic(err)
}
result, err = txn.Submit("b", "100")
if err != nil {
	panic(err)
}

contract.CreateTransaction提供了对事务的更多控制,即传递功能选项的能力:

  • gateway.WithTransient(transient) -发送私有数据
  • gateway.WithEndorsingPeers(“ peer0.org1.example.com”) -用于手动确定目标


尝试调用app.go,将各种键,值和选项替换为事务方法,以了解其工作原理。

至此,新API的审查结束了。顺便说一句,实施您自己的钱包,提交处理程序,身份非常容易,因此您可以向适合您目标的实施添加标准实施,或者向社区提供您自己的想法和代码。

谢谢您的关注。

All Articles