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-sdk-node实现投票DAPP的过程,包括网络启动、依赖安装、管理员与用户注册及程序运行。文章深入解析了链码结构与功能,如投票与获取投票结果,并提供代码示例。

2333

被折叠的 条评论
为什么被折叠?



