Home | 简体中文 | 繁体中文 | 杂文 | 知乎专栏 | 51CTO学院 | CSDN程序员研修院 | Github | OSChina 博客 | 腾讯云社区 | 阿里云栖社区 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏多维度架构

20.2. Chaincode 结构

Chaincode 实现 shim.ChaincodeStubInterface 接口,有三个方法,分别是:Init、Query 和 Invoke

https://github.com/hyperledger-archives/fabric/blob/master/core/chaincode/shim/chaincode.go

20.2.1. 包

由于需要编译为可执行文件,所以需要 main 包

		
package main		
		
		

20.2.2. 导入库

这里需要导入两个包 "github.com/hyperledger/fabric/core/chaincode/shim" 和 "github.com/hyperledger/fabric/protos/peer" 其他包,根据实际需要而定。

		
import (
	"fmt"
	"strconv"

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

20.2.3. 定义类

		
type SimpleChaincode struct {
}		
		
		

20.2.4. Init 方法

负责初始化工作,链码首次部署到区块链网络时调用,将由部署自己的链代码实例的每个对等节点执行。此方法可用于任何与初始化、引导或设置相关的任务。

		
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
}		
		
		

20.2.5. Query

只要在区块链状态上执行任何读取/获取/查询操作,就需要调用 Query 方法。如果尝试在 Query 方法内修改区块链的状态,将会抛出异常。

20.2.6. Invoke

此方法主要是做修改操作,但是很多例子中一些用户也在 Invoke 做查询。

put, get, del 等操作都在可以在 Invoke 中运行

		
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
}		
		
		

参考例子

		
func (s *SmartContract) Invoke(stub shim.ChaincodeStubInterface) sc.Response {

	// Retrieve the requested Smart Contract function and arguments
	function, args := stub.GetFunctionAndParameters()
	// Route to the appropriate handler function to interact with the ledger appropriately
	if function == "balanceToken" {
		return s.balanceToken(stub, args)
	} else if function == "initLedger" {
		return s.initLedger(stub)
	} else if function == "transferToken" {
		return s.transferToken(stub, args)
	}

	return shim.Error("Invalid Smart Contract function name.")
}		
		
		



在 Invoke 函数中,首先使用 stub.GetFunctionAndParameters() 获取合约函数
function, args := stub.GetFunctionAndParameters()

然后判断函数名称,实现对应的逻辑关系。

if function == "balanceToken" {
return s.balanceToken(stub, args)
} else if function == "initLedger" {
return s.initLedger(stub)
} else if function == "transferToken" {
return s.transferToken(stub, args)
}


20.2.7. func main()

任何 Go 程序的都需要 main 函数,他是程序的入口,因此该函数被用于引导/启动链代码。当对peer节点部署chaincode并实例化时,就会执行 main 函数。

		
func main() {
	err := shim.Start(new(SimpleChaincode))
	if err != nil {
		fmt.Printf("Error starting Simple chaincode: %s", err)
	}
}		
		
		

shim.Start(new(SampleChaincode)) 启动链代码并注册到peer 节点。