HyperledgerFabric如何实现FabricnodeSDK样例之投票DAPP

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

韶山网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

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

  • basic-network -- fabric-samples基础网络

  • app -- sdk 代码实现

    • controllers 控制器目录

    • routers 路由目录

    • views 页面目录

    • enrollAdmin.js 登记管理员

    • registerUser.js 注册用户

    • index.js app程序入口

  • chaincode -- 链码 , 其中 vote.go 的代码

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

  • 在 app 的目录下操作

  • 运行启动网络 ./startFabric.sh

  • 安装依赖: npm install

  • 注册节点管理员: node enrollAdmin.js

  • 注册用户:node registerUser.js

  • 运行程序:node index.js

  • 在浏览器访问:localhost:8080

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


网页题目:HyperledgerFabric如何实现FabricnodeSDK样例之投票DAPP
链接地址:http://azwzsj.com/article/gggoeg.html