智能合约
- 执行环境:以太坊虚拟智能合约执行环境EVM,fabric执行环境是docker
- 链码
- 是应用层和区块链底层的中间点
- 每一个链码执行环境是一个独立的docker
- 使用GRPC协议与背书节点通信,只有背书节点才能运行智能合约
- 链码的生命周期
- 打包,智能合约的编写和编译
- 安装,将打包好的文件,上传到背书节点
- 实例化,实际的安装了,执行Init方法,只执行一次,构造函数
- 升级,升级和修复链码
- 交互,自己定义的方法的调用
- 链码的交互流程

- 系统链码(了解)
- LSCC:管理链码的生命周期
- CSCC:配置管理链码,管理链的配置
- QSCC:查询账本存储,是一个区块索引的外部服务
- ESCC:交易背书的链码,交易执行后的链码进行封装签名,给客户端返回背书交易结果
- VSCC:交易验证的链码
- 链码编程的接口
- Init():链码初始化,只执行一次
- Invoke():链码的业务逻辑的编写
- 上面2个方法参数一样,参数是SDK的接口
- 链码SDK的接口:写代码再看
- 一些注意点:
- 分布式多机多节点执行,链码会执行很多次
- 不写随机函数,交易会无效,多次执行不一样
- 系统时间不写,多机时间不一定一样
网络搭建配置的实现
- 创建fabric_asset工程,在里面创建chaincode文件夹。

package main
import (
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
"bytes"
"strconv"
"math/rand"
"time"
"fmt"
)
type BadExampleCC struct {
}
//每一个链码必须实现2个方法
//链码的初始化
func (c *BadExampleCC) Init(stub shim.ChaincodeStubInterface) pb.Response {
//直接返回成功
return shim.Success(nil)
}
//链码交互的入口
func (c *BadExampleCC) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
//直接返回一个随机数结果
return shim.Success(bytes.NewBufferString(strconv.Itoa(int(rand.Int63n(time.Now().Unix())))).Bytes())
}
func main() {
err := shim.Start(new(BadExampleCC))
if err != nil {
fmt.Printf("Error starting Simple chaincode: %s", err)
}
}
- crypto-config.yaml:用于配置组织节点的个数,参考first-network去编写




- configtx.yaml:用于区块联盟中的组织信息,配置名字和证书等的位置,参考firs