`
cywhoyi
  • 浏览: 421986 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Fabric超级账本智能合约

阅读更多
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!")
	}
}

 

0
0
分享到:
评论

相关推荐

    HyperLedger(超级账本)Fabric(2019年最新)

    ### HyperLedger(超级账本)Fabric(2019年最新) #### 一、HyperLedger Fabric简介 HyperLedger Fabric是Linux基金会旗下的HyperLedger项目中的一个子项目,它是一个模块化、可扩展的企业级区块链框架。Fabric的...

    用 Kubernetes 部署超级账本 Fabric 的区块链

    其核心特性包括通道(Channels)、智能合约(Chaincode)以及权限控制,适合于联盟链和私有链场景。 ### 使用 Kubernetes 部署 Fabric 部署 Fabric 在 Kubernetes 上的优点在于可以利用 Kubernetes 的动态扩展、...

    超级账本入门导航

    例如,Fabric-sdk-node和Fabric-sdk-java分别提供了Node.js和Java语言的SDK,这些SDK支持开发者调用链码,部署和管理智能合约,以及开发完整的区块链应用。 部署Hyperledger Fabric网络时,开发者需要创建和配置...

    Hyperledger Fabric开源区块链分布式账本-学习资料合集(37份).zip

    超级账本Hyperledger白皮书(中文版) 快速带你上手Hyperledger Fabric环境搭建+开发测试 性能基准测试和优化Hyperledger Fabric 区块链平台 An Introduction to Hyperledger Architecture of the Hyperledger ...

    CentOS7.0+Fabricv1.0.0区块链超级账本环境.pdf

    在 Fabric v1.0.0 中,链码(Chaincode)是指区块链网络中的智能合约。链码是 Fabric v1.0.0 的核心组件之一,负责执行业务逻辑并存储数据。 docker Docker 是一个容器化平台,提供了轻量级的虚拟化解决方案。...

    使用Kubernetes部署超级账本.pdf

    5. 可升级的智能合约:支持智能合约(chaincode)的更新和升级。 6. 成员服务高可用:保证网络稳定运行,提供持续的服务。 【供应链应用场景】 供应链管理是Hyperledger Fabric的一个典型应用场景。通过构建不同的...

    链客超级账本50问,链客有问必答!.pdf

    .pdf》中提及的“超级账本”指的是Hyperledger Fabric,它是一个开源的企业级区块链分布式账本平台,由Linux基金会主导,旨在支持跨行业跨市场的区块链解决方案。在文档的描述和部分示例内容中,我们可以提炼出以下...

    超级账本1

    链码(Chaincode)是 Hyperledger Fabric 中的一种智能合约,用于实现具体的业务逻辑。 在 Hyperledger Fabric 中,可以使用多种编程语言来编写链码,包括 Go、Node.js 和 Java 等。Go 语言是 Hyperledger Fabric ...

    hyperledger-fabric-desktop-windows-x64.zip

    《超级账本Fabric在Windows平台上的实践:hyperledger-fabric-desktop-windows-x64.zip详解》 超级账本Hyperledger Fabric,作为一个开源的企业级区块链框架,为分布式账本技术提供了强大的支持,尤其在供应链、...

    HyperLedger Fabric 1.什么是 区块链

    7. 建立第一个Fabric网络、合约部署、调用:学习如何创建一个基础的Fabric网络,部署链码(Chaincode,即Fabric中的智能合约),并进行链码的调用,这是区块链应用开发的必要步骤。 8. 运行第一个应用程序fabcar:...

    hyperledger:超级账本教程和项目

    在这个教程中,我们将专注于Hyperledger Fabric,它是超级账本项目中最成熟且广泛应用的组件之一。Fabric提供了一个可扩展的平台,允许开发人员构建和部署分布式应用程序(DApps),并支持企业级的隐私、安全和可...

    hyperledger fabric nodejs

    《超级账本Fabric与Node.js接口程序详解》 在分布式账本技术的领域中,Hyperledger Fabric以其模块化、可扩展的架构以及强大的隐私保护能力,成为企业级区块链解决方案的重要选择。而Node.js,作为一款轻量级且高效...

    fcc政务数据共享区块链-其他

    fcc是一个以不动产登记业务为例,开发基于超级账本fabric的政务数据共享区块链。 功能特点: 关于业务流程 区域链(基于证书准入的联盟链)网络 业务流程时序 关于超级账本 关于区块链、超级账本、智能合约等概念,...

    fabric-sdk-java-release-1.3.zip_fabric_fabric java sdk_java_lay

    《超级账本Fabric Java SDK 1.3:深入探索区块链技术》 在当前数字化时代,区块链技术作为一种颠覆性的分布式数据库模式,已经在全球范围内引起了广泛关注。其中,Hyperledger Fabric以其强大的可扩展性和隐私保护...

    fabric-sdk-java-master.zip

    您或许听说过区块链,但可能不...我将分步展示如何使用 Hyperledger Fabric v0.6 来构建、运行和执行使用 Java 语言编写的智能合约或链代码。您将安装一些工具,定义本地区块链网络,构建并运行一个链代码智能合约。

    区块链开发教学视频(从入门到精通系统性学习)

    主要包含:公链开发视频目录、从零构建以太坊(Ethereum)智能合约到项目实战视频教程、Hyperledger Fabric 超级账本视频教程、Ethereum & IPFS去中心化Ebay区块链项目实战视频教程、区块链密码学视频教程、Go语言学习...

    Hyperledger Fabric 1.0 架构与开发

    介绍Hyperledger Fabric 1.0的体系架构、块链结构、共识机制、智能合约、隐私安全、开发流程及开发中的常见问题与对策;从数据库角度分析联盟链应用于企业级应用时的主要优势和局限。

    区块链开源实现Hyperledge Fabric(一)

    Hyperledger Fabric是Linux基金会所主导的Hyperledger(超级账本)的项目之一。Hyperledger Fabric旨在作为开发模块化体系结构的区块链应用程序的基础,以便诸如共识和会员服务等组件可以即插即用。它使用容器技术来...

Global site tag (gtag.js) - Google Analytics