使用go语言开发部署链码

使用go语言开发部署链码

需要提前部署好测试网络,以下安装操作是基于测试网络的安装,fabric版本为2.4.1
注ps:链码在go版本1.13环境下会出问题,本文是在1.18环境下执行的,可以自行升级版本

第一步编写go链码

package main

import (
	"encoding/json"
	"fmt"
)
import "github.com/hyperledger/fabric-contract-api-go/contractapi"

//定义合约对象
type StudentContract struct {
	contractapi.Contract
}
//定义实体
type Student struct {
	Id      string `json:"id"`
	Name    string `json:"name"`
	Age     string `json:"age"`
	Address string `json:"address"`
}

//方便后期返回值接收
type QueryResult struct {
	Key    string `json:"key"`
	Record *Student
}

func init() {

}

//初始化链码
func (s *StudentContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
	students := []Student{
		{
			Id:      "1",
			Name:    "zs",
			Age:     "23",
			Address: "北京",
		},
		{
			Id:      "2",
			Name:    "ls",
			Age:     "24",
			Address: "河南",
		},
		{
			Id:      "3",
			Name:    "ww",
			Age:     "25",
			Address: "hn",
		},
	}
	for _, student := range students {
		studentAsBytes, _ := json.Marshal(student)
		err := ctx.GetStub().PutState(student.Id, studentAsBytes)
		if err != nil {
			return fmt.Errorf("添加失败 %s", err.Error())
		}
	}
	return nil
}

//创建一个学生
func (s *StudentContract) CreateStudent(ctx contractapi.TransactionContextInterface, Id string, Name string, Age string, Address string) error {
	student := Student{
		Id:      Id,
		Name:    Name,
		Age:     Age,
		Address: Address,
	}
	studentAsBytes, _ := json.Marshal(student)
	return ctx.GetStub().PutState(student.Id, studentAsBytes)
}

//查询一个学生
func (s *StudentContract) QueryStudent(ctx contractapi.TransactionContextInterface, studentId string) (*Student, error) {
	studentAsBytes, err := ctx.GetStub().GetState(studentId)
	if err != nil {
		return nil, fmt.Errorf("查询失败 %s", err.Error())
	}
	if studentAsBytes == nil {
		return nil, fmt.Errorf("%s 不存在", studentId)
	}
	student := new(Student)
	_ = json.Unmarshal(studentAsBytes, student)
	return student, nil
}

//查询全部学生
func (s *StudentContract) QueryAllStudents(ctx contractapi.TransactionContextInterface) ([]QueryResult, error) {
	startKey := ""
	endKey := ""
	resultsIterator, err := ctx.GetStub().GetStateByRange(startKey, endKey)
	if err != nil {
		return nil, err
	}
	defer resultsIterator.Close()
	results := []QueryResult{}
	for resultsIterator.HasNext() {
		queryResponse, err := resultsIterator.Next()
		if err != nil {
			return nil, err
		}
		student := new(Student)
		_ = json.Unmarshal(queryResponse.Value, student)
		queryResult := QueryResult{Key: queryResponse.Key, Record: student}
		results = append(results, queryResult)
	}
	return results, nil
}

//更新学生姓名
func (s *StudentContract) UpdateStudentName(ctx contractapi.TransactionContextInterface, studentId string, studentName string) error {
	student, err := s.QueryStudent(ctx, studentName)
	if err != nil {
		return err
	}
	student.Name = studentName
	studentAsByte, _ := json.Marshal(student)
	return ctx.GetStub().PutState(studentId,studentAsByte)
}
func main() {
	chaincode, err := contractapi.NewChaincode(new(StudentContract))
	if err!=nil {
		fmt.Errorf("Error create fabcar chaincode: %s", err.Error())
	}
	if err := chaincode.Start(); err != nil {
		fmt.Printf("Error starting fabcar chaincode: %s", err.Error())
	}
}

这个是根据fabcar修改的go链码,把这个代码文件放到想要安装的目录即可
我把这个文件放到了/fabric/fabric-samples/test-network/mychaincode/studentcontract目录,命名为了main.go文件
链码目录

第二步编译go的链码

在该目录下执行命令进行编译
可选操作,检查自己go的代理是否有配置,可以配置下代理

export GOPROXY="https://goproxy.cn"
go mod init 项目名 # 示例 go mod init studentcontract
go mod tidy
go mod vendor 

执行完成以后在该目录下生成的目录结构,
在这里插入图片描述

第三步部署go链码

切换到test-network目录下,执行命令

./network.sh deployCC -ccn studentcontract -ccp /fabric/fabric-samples/test-network/mychaincode/studentcontract -ccl go

解释该命令:根据自己的情况进行部署

参数含义
-ccnstudentcontract指定合约名字
-ccp/fabric/fabric-samples/test-network/mychaincode/studentcontract合约所在目录
cclgo合约所使用的语言

链码部署成功
在这里插入图片描述
可以使用docker ps -a 命令查看链码

docker ps -a

部署成功查看
即可完成调用,go写的链码也是可以通过java来进行调用的

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Hyperledger Fabric中,部署链码需要以下步骤: 1. 编写链码并打包成tar.gz格式的文件。 2. 将tar.gz文件安装到peer节点上。 3. 实例化链码并指定其初始参数。 具体步骤如下: 1. 编写链码并打包成tar.gz格式的文件。 在编写链码时,需要遵循Fabric提供的链码规范。链码可以使用Go、Java、Node.js等语言编写。编写完成后,需要将链码打包成tar.gz格式的文件。 2. 将tar.gz文件安装到peer节点上。 使用peer节点上的命令行工具(peer cli)将链码安装到peer节点上。安装命令如下: ``` peer chaincode install -n <chaincode_name> -v <chaincode_version> -p <chaincode_path> ``` 其中,`<chaincode_name>`为链码名称,`<chaincode_version>`为链码版本号,`<chaincode_path>`为链码所在路径。 3. 实例化链码并指定其初始参数。 使用peer节点上的命令行工具(peer cli)实例化链码并指定其初始参数。实例化命令如下: ``` peer chaincode instantiate -o <orderer_address> -C <channel_name> -n <chaincode_name> -v <chaincode_version> -c '{"Args":["init","arg1","arg2","arg3"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" ``` 其中,`<orderer_address>`为orderer节点的地址,`<channel_name>`为通道名称,`<chaincode_name>`为链码名称,`<chaincode_version>`为链码版本号,`'{"Args":["init","arg1","arg2","arg3"]}'`为链码的初始参数,`-P "OR ('Org1MSP.peer','Org2MSP.peer')"`为链码的背书策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的大狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值