
# 链代码结构
本章以Go语言为例来介绍。链代码即一个Go文件，创建好文件后进行函数开发等操作。
当前支持两种方式编写链码：1.4风格（使用shim包）和2.2风格（使用fabric-contract-api-go包）。
![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
区块链服务BCS支持使用两种风格编写的链代码。
#### 链代码接口
**Fabric架构版本的区块链实例：**
- 链代码启动必须通过1.4风格（调用shim包）中的Start函数，入参为shim包中定义的Chaincode接口类型。实际开发中， 您需要自行定义一个结构体，实现Chaincode接口。
  ```
  type Chaincode interface { 
     Init(stub ChaincodeStubInterface) pb.Response 
     Invoke(stub ChaincodeStubInterface) pb.Response  
  }
  ```
  
- 2.2风格（使用fabric-contract-api-go包）的链代码实际开发中， 您需要自行定义一个结构体，实现Chaincode接口。
  ```
  type Chaincode interface {    
      Init(ctx contractapi.TransactionContextInterface, args…) error    
      Invoke(ctx contractapi.TransactionContextInterface, args…) error  
  }
  ```
  
 
#### 链代码结构
- Fabric架构版本的区块链实例1.4风格Go语言的链代码结构如下：
  ```
  package main 
   
  // 引入必要的包 
  import ( 
     "github.com/hyperledger/fabric/core/chaincode/shim" 
     pb "github.com/hyperledger/fabric/protos/peer" 
  ) 
   
  // 声明一个结构体 
  type SimpleChaincode struct {} 
   
  // 为结构体添加Init方法 
  func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { 
          // 在该方法中实现链代码初始化或升级时的处理逻辑 
      // 编写时可灵活使用stub中的API 
  } 
   
  // 为结构体添加Invoke方法 
  func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { 
          // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 
      // 编写时可灵活使用stub中的API 
  } 
   
  //主函数，需要调用shim.Start()方法 
  func main() { 
     err := shim.Start(new(SimpleChaincode)) 
     if err != nil { 
        fmt.Printf("Error starting Simple chaincode: %s", err) 
     } 
  }
  ```
  
- Fabric架构版本的区块链实例2.2风格Go语言的链代码结构如下：
  ```
  package main  
  // 引入必要的包 
  import (   
   "github.com/hyperledger/fabric/plugins/fabric-contract-api-go/contractapi")  
  // 声明一个结构体 
  type Chaincode struct {
      contractapi.Contract
  }
    
  // 为结构体添加Init方法 
  func (ch * Chaincode) Init(ctx contractapi.TransactionContextInterface, args…) error {     
      // 在该方法中实现链代码初始化或升级时的处理逻辑 
  }
  // 为结构体添加Invoke方法 
  func (ch * Chaincode) Invoke(ctx contractapi.TransactionContextInterface, args…) error { 
      // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 
  }  
  //主函数
  func main() {    
      cc, err := contractapi.NewChaincode(new(ABstore))
      if err != nil {
          panic(err.Error())
      }
      if err := cc.Start(); err != nil {
          fmt.Printf("Error starting ABstore chaincode: %s", err)
      }
  }
  ```
  
 
