小编给大家分享一下Hyperledger Fabric如何实现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 的目录下操作
运行启动网络 ./startFabric.sh
安装依赖: npm install
注册节点管理员: node enrollAdmin.js
注册用户:node registerUser.js
运行程序:node index.js
在浏览器访问:localhost:8080
以上是“Hyperledger Fabric如何实现Fabric node SDK样例之投票DAPP”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/jonluo/blog/3002102