使用go语言开发部署链码

article/2025/10/3 4:41:04

使用go语言开发部署链码

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

第一步编写go链码

package mainimport ("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 = studentNamestudentAsByte, _ := 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来进行调用的


http://chatgpt.dhexx.cn/article/PSfQMIXt.shtml

相关文章

【fabric】部署链码

链码开发好后 参考文章:https://blog.csdn.net/taifei/article/details/85234632 1:启动网络后,查看容器 docker ps -a 部署链码是在cli容器里面。第一步我们可以先查看一下cli有没有成功启动,他的ID是什么。后续可以通过ID或者名字进入容器…

fabric2.0 概念,链码和私有数据

1.智能合约和链码 管理员将相关智能合约组织起来用于部署–链码。 智能合约中存储各方交易的业务模型,定义了术语、处理流程等。利用区块链可以将智能合约转换为可执行程序。应用通过调用智能合约来产生交易与在账本进行记录。使用智能合约可以实现自动化&#xf…

matlab计算图片链码,MATLAB--数字图像处理 计算图像链码及其相似多边形

题目 计算下面图像 边界阶数为20的形状数及其相应的近似多边形 在这里插入图片描述 概念 形状数:链码的最小一阶差分码 简单说来求形状数就是:先求出图像的链码 ,再求其一阶差分码,最后找一阶差分码的最小值 在这里插入图片描述 在…

链码的打包与升级

目录 1、链码的打包与签名 ​编辑 对链码的签名 1、安装已经添加签名的链码 2、安装成功之后进行链码的实例化操作,同时指定其背书策略 测试 1、查询链码 2、调用链码 3、查询链码 链码的升级 1、安装链码 2、升级链码 3、测试 1、查询 2、调用 3、…

fabric链码的编写-入门

链码的编写 前言:fabric链码的编写较简单,在熟悉了基本结构和相关API之后就可上手编写,但是要多多练习,提高编写链码的速度和正确度。 学习步骤: 1.熟悉链码的基本结构 2.熟练链码相关API 3.练习,练习&#xff0c…

Hyperledger Fabric 链码

懂哪写哪,随时补充 链码结构 链码API 链码在开发过程中需要实现链码接口,交易的类型决定了哪个接口函数将会被调用,链码的接口定义如下: type Chaincode interface {Init(stub ChaincodeStubInterface) pb.ResponseInvoke(stu…

fabric2.3链码对比1.4链码小记

最近实验室的项目要部署到fabric2.0以上版本,之前写的都是1.4的链码,现在看2.0版本的链码还是有些不一样的,主要是链码api改了: 前提:如果想在fabric2.0以上环境中还是想用shim和peerAPI的话:也就是&#…

Hyperledger Fabric 链码生命周期

目录 一、什么是链码 二、部署链码 2.1 安装和定义链码 2.1.1 打包智能合约 2.1.2 peer节点安装链码 2.1.3 组织批准链码 2.1.4 将链码提交到通道 2.2 升级链码 总结 一、什么是链码 ChainCode(链码)是一个程序,用Go、Node.js或Java编…

matlab freeman链码,对Freeman链码分析的角点检测算法

图像中的角点是图像的重要特征, 具有旋转不变性, 决定了图像形状, 可以降低图像信息的存储效率, 在目标跟踪, 目标检测, 图像匹配, 图像轮廓拟合等领域都有重要的应用价值. 近几十年来, 国内外学者提出的图像角点检测算法[, 各有各的优缺点, 大致可分为三大类: 基于灰度强度的角…

Fabric链码升级

一、修改链码,上传 二、打包链码 1、设置组织1环境变量 export PATH${PWD}/../bin:$PATH export FABRIC_CFG_PATH$PWD/../config/ # Environment variables for Org1 export CORE_PEER_TLS_ENABLEDtrue export CORE_PEER_LOCALMSPID"Org1MSP" export C…

图像特征-链码(Freeman code)

目录 引言链码编程实现轮廓提取链码计算 总结 引言 本文介绍了图像的形状特征–链码,以及通过python和opencv实现的链码提取方法。所有opencv的版本为3.4.2,已经移除了直接返回链码的选项。 链码 链码用于描述图像的形状特征,首先需要获得图像…

Java知识扫盲——向上转型(类向上转型、接口向上转型)以及向上转型的优势、灵活运用

目录 普通类示例 抽象类的向上转型, 接口向上转型: 作用:使用向上转型可以,提高代码的简洁性、灵活性、适用性。 普通类示例 父类: package 普通类向上转型;public class Father {public int age 48;public void…

java 向上转换_java的向上转型总结

在《think of java》中对向上转型有着如下的描述 看完之后很蒙圈,所以自己在网上找了一些描述,并自己做了简单的总结 简单的例子 class A{ public void A1(){ System.out.println("父类方法1"); } public void A2(){ System.out.println("…

JAVA中多态以及向上转型向下转型、重写的讲解

重写 重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变。 重写的好处在于子类可以根据需要&#x…

JAVA中的向上转型和向下转型

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点: 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方…

java转型 内存_Java向上转型及内存分析

学习设计模式的时候,发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。 概念 先从几个基本概念开始: 1. Java中的引用类型(reference type) Java中的数据类型分…

java向上转型_Java向上转型和向下转型

一、向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量, 基本的实现语法: 父类类型变量new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调用子类覆写了父类的方法,但是为什么不调用Worker的say()方法呢?原…

C++ 向上转型

在 C 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java 对象向上转型_JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话:“父类…

java 向上转型_Java 转型问题(向上转型和向下转型)

Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象? 从 2 个名词开始说起:向上转型(upcasting) 、向下转型(downcasting)。 举个例子:有2个类,Father 是父类&a…