package main import ( "encoding/json" "fmt" "bytes" "time" "strconv" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) type MarblesChaincode struct{ } type marble struct{ ObjectType string `json:"objectType"` Name string `json:"name"` Color string `json:"color"` Size int `json:"size"` Owner string `json:"owner"` } func (t *MarblesChaincode) Init (stub shim.ChaincodeStubInterface) peer.Response { return shim.Success(nil) } func (t *MarblesChaincode) Invoke (stub shim.ChaincodeStubInterface) peer.Response { //functions, params :=stub.GetFunctionAndParameters() fn , args := stub.GetFunctionAndParameters() if fn == "initMarble" { return t.initMarble(stub, args) } else if fn == "readMarble" { return t.readMarble(stub, args) } else if fn == "deleteMarble" { return t.deleteMarble(stub,args) } else if fn == "transferMarble" { return t.transferMarble(stub, args) } else if fn == "getMarblesByRange"{ return t.getMarblesByRange(stub,args) } else if fn == "queryMarblesByOwner" { return t.queryMarblesByOwner(stub, args) } else if fn == "getHistoryForMarble" { return t.getHistoryForMarble(stub,args) } return shim.Error("没有相应的方法!") } func (t *MarblesChaincode) initMarble (stub shim.ChaincodeStubInterface, args [] string) peer.Response{ marblename := args[0] //判断 marble 是否存在 marbleAsBytes , err := stub.GetState(marblename) if err != nil { return shim.Error(err.Error()) } if marbleAsBytes != nil { return shim.Error("marble 已经存在!") } color := args[1] size, err := strconv.Atoi(args[2]) if err != nil { return shim.Error("size 必须传数字字符串") } owner := args[3] objectType := "marble" marble := &marble{objectType,marblename,color,size,owner} marbleJsonAsBytes, err := json.Marshal(marble) err = stub.PutState(marblename,marbleJsonAsBytes) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } func (t *MarblesChaincode) readMarble(stub shim.ChaincodeStubInterface, args [] string) peer.Response{ marblename := args[0] marbleAsBytes , err := stub.GetState(marblename) if err != nil { return shim.Error(err.Error()) } else if marbleAsBytes == nil { return shim.Error("marble 信息不存在!") } return shim.Success(marbleAsBytes) } func (t *MarblesChaincode) deleteMarble(stub shim.ChaincodeStubInterface, args []string) peer.Response{ //判断marble 是否存在 marblename := args[0] marbleAsBytes , err := stub.GetState(marblename) if err != nil { return shim.Error(err.Error()) } if marbleAsBytes != nil { // 删除 marble err = stub.DelState(marblename) if err != nil { return shim.Error(err.Error()) } } return shim.Success(nil) } func (t *MarblesChaincode) transferMarble (stub shim.ChaincodeStubInterface, args []string) peer.Response{ marblename := args[0] newOwner := args[1] //判断marble 是否存在 marbleAsBytes , err := stub.GetState(marblename) if err != nil { return shim.Error(err.Error()) } else if marbleAsBytes == nil { return shim.Error("marble 不存在!") } marbleInfo := marble{} err = json.Unmarshal(marbleAsBytes,&marbleInfo) if err != nil { return shim.Error(err.Error()) } marbleInfo.Owner = newOwner marbleJsonAsBytes, err := json.Marshal(marbleInfo) if err != nil { return shim.Error(err.Error()) } err = stub.PutState(marblename, marbleJsonAsBytes) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } func(t *MarblesChaincode) getMarblesByRange( stub shim.ChaincodeStubInterface, args []string) peer.Response{ startKey := args[0] endKey := args[1] resultIterator, err := stub.GetStateByRange(startKey,endKey) if err != nil { return shim.Error(err.Error()) } defer resultIterator.Close() var buffer bytes.Buffer buffer.WriteString("[") isWrite := false for resultIterator.HasNext() { queryResponse, err := resultIterator.Next() if err != nil { return shim.Error(err.Error()) } if isWrite == true { buffer.WriteString(",") } buffer.WriteString("{ \"key\": ") buffer.WriteString(queryResponse.Key) buffer.WriteString(",\"record\":") buffer.WriteString(string(queryResponse.Value)) buffer.WriteString("}") isWrite = true } buffer.WriteString("]") return shim.Success(buffer.Bytes()) } func (t * MarblesChaincode) queryMarblesByOwner (stub shim.ChaincodeStubInterface, args [] string) peer.Response { owner := args[0] queryStr := fmt.Sprintf("{\"selector\":{\"owner\":\"%s\"}}",owner) resultIterator, err := stub.GetQueryResult(queryStr) if err != nil { return shim.Error(err.Error()) } defer resultIterator.Close() var buffer bytes.Buffer buffer.WriteString("[") isWrite := false for resultIterator.HasNext() { queryResponse , err := resultIterator.Next() if err != nil { return shim.Error(err.Error()) } if isWrite == true { buffer.WriteString(",") } buffer.WriteString("{\"key\":") buffer.WriteString(queryResponse.Key) buffer.WriteString(",\"record\": ") buffer.WriteString(string(queryResponse.Value)) buffer.WriteString("}") isWrite = true } buffer.WriteString("]") return shim.Success(buffer.Bytes()) } func (t *MarblesChaincode) getHistoryForMarble (stub shim.ChaincodeStubInterface, args [] string) peer.Response{ marblename := args[0] resultIterator, err := stub.GetHistoryForKey(marblename) if err != nil { return shim.Error(err.Error()) } defer resultIterator.Close() var buffer bytes.Buffer buffer.WriteString("[") isWrite := false for resultIterator.HasNext() { queryResponse , err := resultIterator.Next() if err != nil { return shim.Error(err.Error()) } if isWrite == true { buffer.WriteString(",") } buffer.WriteString("{ \"TxId\":") buffer.WriteString(queryResponse.TxId) buffer.WriteString(",\"Timestamp\": ") buffer.WriteString(time.Unix(queryResponse.Timestamp.Seconds , int64(queryResponse.Timestamp.Nanos)).String()) buffer.WriteString(",\"Value\": ") buffer.WriteString(string(queryResponse.Value)) buffer.WriteString(",\"IsDelete\": ") buffer.WriteString(strconv.FormatBool(queryResponse.IsDelete)) buffer.WriteString("}") isWrite = true } buffer.WriteString("]") return shim.Success(buffer.Bytes()) } func main() { err := shim.Start(new(MarblesChaincode)) if err != nil { fmt.Println("chaincode start error!") } }
相关推荐
### HyperLedger(超级账本)Fabric(2019年最新) #### 一、HyperLedger Fabric简介 HyperLedger Fabric是Linux基金会旗下的HyperLedger项目中的一个子项目,它是一个模块化、可扩展的企业级区块链框架。Fabric的...
其核心特性包括通道(Channels)、智能合约(Chaincode)以及权限控制,适合于联盟链和私有链场景。 ### 使用 Kubernetes 部署 Fabric 部署 Fabric 在 Kubernetes 上的优点在于可以利用 Kubernetes 的动态扩展、...
例如,Fabric-sdk-node和Fabric-sdk-java分别提供了Node.js和Java语言的SDK,这些SDK支持开发者调用链码,部署和管理智能合约,以及开发完整的区块链应用。 部署Hyperledger Fabric网络时,开发者需要创建和配置...
超级账本Hyperledger白皮书(中文版) 快速带你上手Hyperledger Fabric环境搭建+开发测试 性能基准测试和优化Hyperledger Fabric 区块链平台 An Introduction to Hyperledger Architecture of the Hyperledger ...
在 Fabric v1.0.0 中,链码(Chaincode)是指区块链网络中的智能合约。链码是 Fabric v1.0.0 的核心组件之一,负责执行业务逻辑并存储数据。 docker Docker 是一个容器化平台,提供了轻量级的虚拟化解决方案。...
5. 可升级的智能合约:支持智能合约(chaincode)的更新和升级。 6. 成员服务高可用:保证网络稳定运行,提供持续的服务。 【供应链应用场景】 供应链管理是Hyperledger Fabric的一个典型应用场景。通过构建不同的...
.pdf》中提及的“超级账本”指的是Hyperledger Fabric,它是一个开源的企业级区块链分布式账本平台,由Linux基金会主导,旨在支持跨行业跨市场的区块链解决方案。在文档的描述和部分示例内容中,我们可以提炼出以下...
链码(Chaincode)是 Hyperledger Fabric 中的一种智能合约,用于实现具体的业务逻辑。 在 Hyperledger Fabric 中,可以使用多种编程语言来编写链码,包括 Go、Node.js 和 Java 等。Go 语言是 Hyperledger Fabric ...
《超级账本Fabric在Windows平台上的实践:hyperledger-fabric-desktop-windows-x64.zip详解》 超级账本Hyperledger Fabric,作为一个开源的企业级区块链框架,为分布式账本技术提供了强大的支持,尤其在供应链、...
7. 建立第一个Fabric网络、合约部署、调用:学习如何创建一个基础的Fabric网络,部署链码(Chaincode,即Fabric中的智能合约),并进行链码的调用,这是区块链应用开发的必要步骤。 8. 运行第一个应用程序fabcar:...
在这个教程中,我们将专注于Hyperledger Fabric,它是超级账本项目中最成熟且广泛应用的组件之一。Fabric提供了一个可扩展的平台,允许开发人员构建和部署分布式应用程序(DApps),并支持企业级的隐私、安全和可...
《超级账本Fabric与Node.js接口程序详解》 在分布式账本技术的领域中,Hyperledger Fabric以其模块化、可扩展的架构以及强大的隐私保护能力,成为企业级区块链解决方案的重要选择。而Node.js,作为一款轻量级且高效...
fcc是一个以不动产登记业务为例,开发基于超级账本fabric的政务数据共享区块链。 功能特点: 关于业务流程 区域链(基于证书准入的联盟链)网络 业务流程时序 关于超级账本 关于区块链、超级账本、智能合约等概念,...
《超级账本Fabric Java SDK 1.3:深入探索区块链技术》 在当前数字化时代,区块链技术作为一种颠覆性的分布式数据库模式,已经在全球范围内引起了广泛关注。其中,Hyperledger Fabric以其强大的可扩展性和隐私保护...
您或许听说过区块链,但可能不...我将分步展示如何使用 Hyperledger Fabric v0.6 来构建、运行和执行使用 Java 语言编写的智能合约或链代码。您将安装一些工具,定义本地区块链网络,构建并运行一个链代码智能合约。
主要包含:公链开发视频目录、从零构建以太坊(Ethereum)智能合约到项目实战视频教程、Hyperledger Fabric 超级账本视频教程、Ethereum & IPFS去中心化Ebay区块链项目实战视频教程、区块链密码学视频教程、Go语言学习...
介绍Hyperledger Fabric 1.0的体系架构、块链结构、共识机制、智能合约、隐私安全、开发流程及开发中的常见问题与对策;从数据库角度分析联盟链应用于企业级应用时的主要优势和局限。
Hyperledger Fabric是Linux基金会所主导的Hyperledger(超级账本)的项目之一。Hyperledger Fabric旨在作为开发模块化体系结构的区块链应用程序的基础,以便诸如共识和会员服务等组件可以即插即用。它使用容器技术来...