首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Go 编写智能合约(1)

使用 Go 编写智能合约(1)

在本教程中,将学习如何使用 Golang 为基于 Hyperledger Fabric v0.6                的区块链网络开发链代码。我不但会介绍一些基础知识,比如链代码的角色和与底层 Fabric 交互的                API,还会介绍各种高级主题,比如数据建模、访问控制和事件。大量的代码示例演示了区块链上的一个住房贷款和购买合同流程。(参见本教程末尾部分的                “可下载资源”,下载完整的示例链代码。)
本教程是本系列的第一篇;后续教程将介绍如何对链代码执行单元测试,以及如何开发可调用您部署的链代码的客户端应用程序。
链代码是什么?在 IBM Cloud 上开发-- 免费试用 30 天您可以获得 2GB 运行时和容器内存,配置最多 10 个云服务,以及获得免费的服务台支持。,只需单击一次即可通过                     开始构建和测试区块链网络。

链代码也称为智能合约,实质上是控制区块链网络中的不同实体或相关方如何相互交互或交易的业务逻辑。简言之,链代码将业务网络交易封装在代码中。可以调用链代码来设置和获取账本或                world state。
在发表本教程时,Hyperledger 支持使用 Golang 或 Java™ 语言编写链代码,链代码最终在一个 Docker                容器内运行。因为 Java                链代码支持还处于公测阶段,所以本教程将重点介绍 Go。
设置开发环境区块链开发人员推荐阅读内容借助  内的 developerWorks                    教程、课程、博客和社区支持,提高您的开发技能。

按照 IBM Bluemix 文档中的步骤开始 “”。到达题为 “设置开发管道” 的小节时,您已经为开始使用 Go 开发链代码做好了准备。
链代码结构让我们仔细看看链代码的结构。前面已经提到过,清单 1 及整篇教程中的示例链代码,以及所讨论的架构都严格遵守 Hyperledger Fabric                v0.6 预览版的规定。
清单 1 的第 4 行将 shim 包导入您的链代码包中。shim                    包 提供了一些                API,以便您的链代码与底层区块链网络交互来访问状态变量、交易上下文、调用方证书和属性,并调用其他链代码和执行其他操作。
清单 1. 示例链代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import "fmt"
import "github.com/hyperledger/fabric/core/chaincode/shim"

type SampleChaincode struct {
}

func (t *SampleChaincode) Init(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) {
    return nil, nil
}

func (t *SampleChaincode) Query(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) {
    return nil, nil
}

func (t *SampleChaincode) Invoke(stub shim.ChaincodeStubInterface, function string, args []string) ([]byte, error) {
    return nil, nil
}

func main() {
    err := shim.Start(new(SampleChaincode))
    if err != nil {
        fmt.Println("Could not start SampleChaincode")
    } else {
        fmt.Println("SampleChaincode successfully started")
    }

}




Main 函数任何 Go 程序的起点都是 main 函数,因此该函数被用于引导/启动链代码。当对等节点部署其链代码实例时,就会执行 main 函数。
如清单 2 中第 2 行所示,shim.Start(new(SampleChaincode))                行启动了链代码并向对等节点注册它。要在本地验证这一点,可在您的开发环境中运行该代码,这将生成以下错误:[shim] CRIT :                peer.address not configured, can't connect to peer.
清单 2. Main()
1
2
3
4
5
6
7
8
9
func main() {
    err := shim.Start(new(SampleChaincode))
    if err != nil {
        fmt.Println("Could not start SampleChaincode")
    } else {
        fmt.Println("SampleChaincode successfully started")
    }

}




SampleChaincode 是实现 shim.Chaincode 接口所需的结构,它必须包含 3 种方法 — Init、Query                和 Invoke — 才能被 shim 包视为有效的链代码类型。让我们逐一看看这 3 种方法。
返回列表