Hyperledger Fabric如何实现Fabric node SDK样例之投票DAPP

发布时间:2021-12-06 14:27:35 作者:小新
来源:亿速云 阅读:263

小编给大家分享一下Hyperledger Fabric如何实现Fabric node SDK样例之投票DAPP,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Fabric node SDK 样例 - 投票DAPP

参考 fabric-samples 下的 fabcar 加以实现
目录结构
.
├── app
│   ├── controllers
│   │   └── index.js
│   ├── enrollAdmin.js
│   ├── index.js
│   ├── package.json
│   ├── README.md
│   ├── registerUser.js
│   ├── routers
│   │   └── index.js
│   ├── startFabric.sh
│   └── views
│   └── index.ejs
├── basic-network
│   └── ...
├── chaincode
│   └── vote.go
└── README.md

package main

import (
	"fmt"
	"bytes"
	"encoding/json"
	"github.com/hyperledger/fabric/core/chaincode/shim"
	"github.com/hyperledger/fabric/protos/peer"
)

type VoteChaincode struct {

}

type Vote struct {
	Name string `json:"name"`
	VoteNum int `json:"votenum"`
}

func (t * VoteChaincode) Init (stub shim.ChaincodeStubInterface) peer.Response {
	return shim.Success(nil)
}

func (t * VoteChaincode) Invoke (stub shim.ChaincodeStubInterface) peer.Response {

	fn , args := stub.GetFunctionAndParameters()

	if fn == "voteUser" {
		return t.voteUser(stub, args)
	} else if fn == "getUserVote" {
		return t.getUserVote(stub)
	}

	return shim.Error("调用方法不存在!")
}

func (t *VoteChaincode) voteUser (stub shim.ChaincodeStubInterface, args []string) peer.Response {

	if len(args) != 1 {
		return shim.Error("参数出错")
	}

	name := args[0]
	// 判断当前用户是否存在
	userAsBytes , err := stub.GetState(name)

	if err != nil {
		return shim.Error(err.Error())
	}

	vote := Vote{}

	if userAsBytes != nil {
		err = json.Unmarshal(userAsBytes , &vote)

		if err != nil {
			return shim.Error(err.Error())
		}

		vote.VoteNum += 1
	} else {
		vote = Vote{Name: name, VoteNum: 1}
	}

	voteJsonAsBytes , err := json.Marshal(vote)

	if err != nil {
		return shim.Error(err.Error())
	}

	err = stub.PutState(name, voteJsonAsBytes)

	if err != nil {
		return shim.Error(err.Error())
	}

	// 通知监听器,事件 eventInvokeVoteUser 已被执行,投票成功事件
	err = stub.SetEvent("eventInvokeVoteUser", []byte(name))
	if err != nil {
		return shim.Error(err.Error())
	}

	return shim.Success(nil)
}

func (t *VoteChaincode) getUserVote( stub shim.ChaincodeStubInterface) peer.Response {
	//获取投票列表
	resultIterator, err := stub.GetStateByRange("","")
	defer resultIterator.Close()
	if err != nil {
		return shim.Error(err.Error())
	}

	var buffer bytes.Buffer
	buffer.WriteString("[")
	isFrist := true
	for resultIterator.HasNext() {
		queryResponse , err := resultIterator.Next()
		if err != nil {
			return shim.Error(err.Error())
		}
        //第一个不加,
		if !isFrist {
			buffer.WriteString(",")
		}
		isFrist = false
		buffer.WriteString(string(queryResponse.Value))
	}
	buffer.WriteString("]")
	return shim.Success(buffer.Bytes())
}

func main() {

	if err := shim.Start(new(VoteChaincode)); err != nil {
		fmt.Println("chaincode start error")
	}
}

运行程序app

以上是“Hyperledger Fabric如何实现Fabric node SDK样例之投票DAPP”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. Hyperledger Fabric能否大规模运行?
  2. Hyperledger Fabric初识与环境搭建

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

fabric hyperledger fabric

上一篇:Ceph系统报时间不同步的问题该怎么解决

下一篇:elasticsearch ReceiveTimeoutTransportException的解决方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》