# Fabric 1.0源代码笔记 之 Chaincode(链码)
## 1、Chaincode概述
Chaincode,即链码或智能合约,代码分布在protos/peer目录、core/chaincode和core/common/ccprovider目录,目录结构如下:
* protos/peer目录:
* chaincode.pb.go,ChaincodeDeploymentSpec、ChaincodeInvocationSpec结构体定义。
* core/chaincode目录:
* platforms目录,链码的编写语言平台实现,如golang或java。
* platforms.go,Platform接口定义,及部分工具函数。
* java目录,java语言平台实现。
* golang目录,golang语言平台实现。
* core/common/ccprovider目录:ccprovider相关实现。
## 2、protos相关结构体定义
### 2.1、ChaincodeDeploymentSpec结构体定义(用于Chaincode部署)
#### 2.1.1 ChaincodeDeploymentSpec结构体定义
```go
type
ChaincodeDeploymentSpec
struct {
ChaincodeSpec *ChaincodeSpec
//ChaincodeSpec消息
EffectiveDate *google_protobuf1.Timestamp
CodePackage []
byte
//链码文件打包
ExecEnv ChaincodeDeploymentSpec_ExecutionEnvironment
//链码执行环境,DOCKER或SYSTEM
}
type
ChaincodeDeploymentSpec_ExecutionEnvironment
int32
const (
ChaincodeDeploymentSpec_DOCKER ChaincodeDeploymentSpec_ExecutionEnvironment =
0
ChaincodeDeploymentSpec_SYSTEM ChaincodeDeploymentSpec_ExecutionEnvironment =
1
)
//代码在protos/peer/chaincode.pb.go
```
#### 2.1.2、ChaincodeSpec结构体定义
```go
type
ChaincodeSpec
struct {
Type ChaincodeSpec_Type
//链码的编写语言,GOLANG、JAVA
ChaincodeId *ChaincodeID
//ChaincodeId,链码路径、链码名称、链码版本
Input *ChaincodeInput
//链码的具体执行参数信息
Timeout
int32
}
type
ChaincodeSpec_Type
int32
const (
ChaincodeSpec_UNDEFINED ChaincodeSpec_Type =
0
ChaincodeSpec_GOLANG ChaincodeSpec_Type =
1
ChaincodeSpec_NODE ChaincodeSpec_Type =
2
ChaincodeSpec_CAR ChaincodeSpec_Type =
3
ChaincodeSpec_JAVA ChaincodeSpec_Type =
4
)
type
ChaincodeID
struct {
Path
string
Name
string
Version
string
}
type
ChaincodeInput
struct {
//链码的具体执行参数信息
Args [][]
byte
}
//代码在protos/peer/chaincode.pb.go
```
### 2.2、ChaincodeInvocationSpec结构体定义
```go
type
ChaincodeInvocationSpec
struct {
ChaincodeSpec *ChaincodeSpec
//参考本文2.2
IdGenerationAlg
string
}
//代码在protos/peer/chaincode.pb.go
```
## 3、ccprovider目录相关实现
### 3.1、ChaincodeData结构体
```go
type
ChaincodeData
struct {
Name
string
Version
string
Escc
string
Vscc
string
Policy []
byte
//chaincode 实例的背书策略
Data []
byte
Id []
byte
InstantiationPolicy []
byte
//实例化策略
}
//获取ChaincodeData,优先从缓存中读取
func GetChainc