Hyperledger Fabric 实战(十): Fabric node SDK 样例 - 投票DAPP

原创
2019/01/16 10:29
阅读数 1.7K

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

相关文档

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部