Hyperledger Fabric V1.0学习之三---从开发者的角度看链码

这是Hyperledger Fabric V1.0 官方文档里的Chaincode for Developers章节。
第一次翻译,不妥之处还请网友指出,我们一起学习一起进步。
原文地址(http://hyperledger-fabric.readthedocs.io/en/latest/chaincode4ade.html)

链码是什么

Chaincode是一个用Go编写的程序,最终在其他编程语言(如Java)中实现了一个规定的界面。 链码运行在与背书节点相隔离的安全的Docker容器中。Chaincode通过由应用程序提交的交易来初始化和管理账本状态。

链码通常用来处理网络成员所同意的业务逻辑,因此可被视为“智能合约”。 由链码创建的状态仅限于该链码,不能被另一个链码直接访问。 然而,在同一个网络中,给定适当的权限,一个链码可以调用另一个链码来访问其状态。

在下面的章节中,我们将通过一个应用程序开发人员的眼睛探索chaincode。 我们将介绍一个简单的链码示例应用程序,并介绍 Shim API中的每个方法。

链码 API

每个链码程序必须实现链码接口(Chaincode interface),其方法在响应接收到的交易时被调用。 特别地,当链码接收到实例化或更新交易时,调用初始化Init方法,使得链码可以执行任何必需的初始化,包括应用程序状态的初始化。 Invoke方法在响应接收到一个用来处理交易提议的invoke交易时被调用。

链码“shim”API中的另一个接口是ChaincodeStubInterface,用于访问和修改账本,并在链码之间进行调用。

在本教程中,我们将通过实现一个用来管理简单资产的链码应用程序来演示这些API的使用。

简单资产链码

我们的应用程序是用来在账本上创建资产(键值对)的一个基本示例链码。

选择源代码的存放位置

如果你没有go语言的环境,请先确认正确安装和配置go语言。

现在你要在$*GOPATH*/src/下面为你的链码应用程序建立一个子目录。

为了让事情简单点,我们执行下面的命令:

mkdir -p $GOPATH/src/sacc && cd $GOPATH/src/sacc

现在让我们创建源文件并编写代码:

touch sacc.go

Housekeeping 准备工作

首先,让我们先进行一些准备工作。与每个链码一样,链码就是实现了链码接口Chaincode interface

https://github.com/hyperledger/fabric/blob/master/core/chaincode/shim/interfaces.go#L28

特别是 initinvoke函数。
所以我们要为链码导入必须的依赖包。
我们将导入链码的shim包和peer protobuf 包。

package main

import (
    "fmt"

    "github.com/hyperledger/fabric/core/chaincode/shim"
    "github.com/hyperledger/fabric/protos/peer"
)

初始化链码

接下来我们要实现一个初始化函数。

// Init is called during chaincode instantiation to initialize any data.
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {

}

请注意链码升级也会调用这个函数。当升级一个现有的链码时,请确保修改相应的初始化 Init 函数。特别是 如果没有进行迁移或者作为升级的一部分没有什么需要初始化时提供了一个空的初始化方法是更应当注意。

接下来,我们将使用ChaincodeStubInterface.GetStringArgs函数取出Init调用的参数,并检查其有效性。 在我们的例子中,我们期望获得一个键值对。

// Init is called during chaincode instantiation to initialize any
// data. Note that chaincode upgrade also calls this function to reset
// or to migrate data, so be careful to avoid a scenario where you
// inadvertently clobber your ledger's data!
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {
  // Get the args from the transaction proposal
  args := stub.GetStringArgs()
  if len(args) != 2 {
    return shim.Error("Incorrect arguments. Expecting a key and a value")
  }
}

接下来,现在我们将要建立起一个有效的函数调用,我们将把初始状态存储在账本中。 为此,我们将键和值作为参数传递给ChaincodeStubInterface.PutState方法。 假设一切顺利,将返回一个表示初始化已经成功的peer.Response对象。

// Init is called during chaincode instantiation to initialize any
// data. Note that chaincode upgrade also calls this function to reset
// or to migrate data, so be careful to avoid a scenario where you
// inadvertently clobber your ledger's data!
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {
  // Get the args from the transaction proposal
  args := stub.GetStringArgs()
  if len(args) != 2 {
    return shim.Error("Incorrect arguments. Expecting a key and a value")
  }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hyperledger Fabric 1.0 从零开始系列的第十二篇文章中,我们将介绍如何使用 fabric-sdk-java 应用程序来与 Hyperledger Fabric 交互。 fabric-sdk-java 是一个 Java 版本的 Hyperledger Fabric SDK,它提供了一种方便的方式来与 Hyperledger Fabric 网络进行交互。它使用 Fabric 的 Java 操作系统链码(Java Chaincode)来运行链码,同时也支持 Go 语言链码。 以下是使用 fabric-sdk-java 的步骤: 1. 下载 fabric-sdk-java,并将其添加到您的 Java 项目中。 2. 创建一个 ConnectionProfile 对象,该对象定义了与 Fabric 网络的连接参数。 3. 创建一个 HFClient 对象,该对象表示一个 Fabric 用户的身份。 4. 通过调用 HFClient 对象的 setUserContext() 方法来设置用户身份。 5. 创建一个 Channel 对象,该对象表示与一个 Fabric 通道的连接。 6. 调用 Channel 对象的 initialize() 方法来初始化通道对象。 7. 创建一个 QueryByChaincodeRequest 对象,该对象用于查询链码。 8.调用 Channel 对象的 queryByChaincode() 方法,并传递 QueryByChaincodeRequest 对象作为参数,以执行查询。 9. 创建一个 TransactionProposalRequest 对象,它用于提交一个事务提议。 10. 调用 Channel 对象的 sendTransactionProposal() 方法,并传递 TransactionProposalRequest 对象作为参数,以向 Fabric 提交事务提议。 11. 创建一个 TransactionRequest 对象,该对象包含有关要提交的事务的详细信息。 12. 调用 Channel 对象的 sendTransaction() 方法,并传递 TransactionRequest 对象作为参数,以提交事务。 通过使用 fabric-sdk-java,您可以轻松地与 Hyperledger Fabric 网络进行交互,并执行各种操作,例如查询链码和提交事务。 希望这篇文章对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值