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

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

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

创建和发出自定义事件Hyperledger                包含一个事件框架,可以使用该框架发布/订阅预定义的或自定义的事件。您可以自由地在链代码中创建和发出自定义事件。例如,只要区块链的状态发生更改,就会生成一个事件。通过向区块链上的事件中心注册一个事件适配器,客户端应用程序可以订阅和使用这些事件。本系列的后续教程将详细介绍客户端应用程序如何使用                HFC SDK 订阅和使用通过链代码生成的事件。
除了自定义事件之外,Hyperledger 中包含的一些预定义的内部事件还包括:
  • 区块事件
  • 链代码事件
  • 拒绝事件
  • 注册事件
清单 12 中的代码展示了如何创建和发布自定义事件。
第 1-4 行定义了一个包含类型和描述字段的自定义事件对象。
CreateLoanApplication 函数从第 6                行开始,已被修改为包括在成功创建贷款申请时创建事件。
第 23 行创建了 customEvent                对象的实例并填入适当的事件细节。
第 24 行按照前面解释的方法将事件对象编组为 JSON 字符串字节数组。
第 28 行设置了自定义事件。stub.SetEvent 方法接受两个参数:事件                    name 和                payload。客户端应用程序可订阅同一个事件名称/主题,以便在链代码生成事件时接收它们。
清单 12. 创建和发布自定义事件
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
30
31
32
33
34
35
36
type customEvent struct {
    Type        string `json:"type"`
    Description string `json:"description"`
}

func CreateLoanApplication(stub shim.ChaincodeStubInterface, args []string) ([]byte, error) {
    fmt.Println("Entering CreateLoanApplication")

    if len(args) < 2 {
        fmt.Println("Invalid number of args")
        return nil, errors.New("Expected at least two arguments for loan application creation")
    }

    var loanApplicationId = args[0]
    var loanApplicationInput = args[1]

    err := stub.PutState(loanApplicationId, []byte(loanApplicationInput))
    if err != nil {
        fmt.Println("Could not save loan application to ledger", err)
        return nil, err
    }

    var event = customEvent = {"createLoanApplication", "Successfully created loan application with ID " + loanApplicationId}
    eventBytes, err ;= json.Marshal(&event)
    if err != nil {
            return nil, err
    }
    err = stub.SetEvent("evtSender", eventBytes)
    if err != nil {
        fmt.Println("Could not set event for loan application creation", err)
    }

    fmt.Println("Successfully saved loan application")
    return nil, nil

}

返回列表