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
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(www.michenggw.com))
}
vote := Vote{}
if userAsBytes != nil {
err = json.Unmarshal(userAsBytes , &vote)
if err != nil {
return shim.Error(www.boyunylpt1.com 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 :=www.gxgjpt1.com 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
相关文档
项目源码
fabric-sdk-node文档
Hyperledger Fabric 实战(十): Fabric node SDK 样例 - 投票DAPP的更多相关文章
- hyperledger fabric超级账本java sdk样例e2e代码流程分析
一 checkConfig Before 1.1 private static final TestConfig testConfig = TestConfig.getConfig() ...
- Scala学习十四——模式匹配和样例类
一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...
- Hyperledger Fabric 实战(十二): Fabric 源码本地调试
借助开发网络调试 fabric 源码本地调试 准备工作 IDE Goland Go 1.9.7 fabric-samples 模块 chaincode-docker-devmode fabric 源码 ...
- Hyperledger Fabric Node SDK和应用开发
Hyperledger Fabric 提供了多种语言的SDK版本,其中提出比较早.比较稳定而全面的是Node.js版本的SDK. 前面提到的fabric示例(如first-network和e2e-cl ...
- 使用Fabric Node SDK进行Invoke和Query
前面的文章都是在讲解Fabric网络的搭建和ChainCode的开发,那么在ChainCode开发完毕后,我们就需要使用Fabric SDK做应用程序的开发了.官方虽然提供了Node.JS,Java, ...
- 搭建RESTful API来使用Fabric Node SDK 开篇
在Balance-Transfer中,有关于Node SDK比较完备的例子. SDK的官方文档在这里:https://fabric-sdk-node.github.io/ Balance-Transf ...
- Service Fabric基本概念: Node, Application, Service, Partition/Replicas
作者:张鼎松 (Dingsong Zhang) @ Microsoft 在上一节中,为大家简明扼要的介绍了微软针对现代分布式系统在Azure上实现的相关服务组件.紧接上文内容,本节将为大家介绍Azur ...
- fabric默认样例的分析
参考资料 http://www.bubuko.com/infodetail-2092748.html http://www.ithao123.cn/content-11117437.html http ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
随机推荐
- python 水仙花
#简单def narcissus(): for n in range(100, 1000, 1): a, b, c = n//100, (n//10)%10, (n%100)%10 if a ** 3 ...
- 栈和队列ADT -数据结构(C语言实现)
数据结构与算法分析 栈模型 限制插入和删除只能在表的末端的表 表的末端叫做栈顶(top) 支持Push进栈和Pop入栈操作 //LIFO后进先出表 栈的实现 链表实现 类型声明 struct Node ...
- AttributeError: 'TimeLimit' object has no attribute 'monitor'
原报错代码部分: env.monitor.start(monitor_path, resume=True, video_callable=lambda count: count % record_vi ...
- Pandas dataframe数据写入文件和数据库
转自:http://www.dcharm.com/?p=584 Pandas是Python下一个开源数据分析的库,它提供的数据结构DataFrame极大的简化了数据分析过程中一些繁琐操作,DataFr ...
- Python高级编程-itertoos模块
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先我们看看itertools模块提供的几个“无限”迭代器, import itertools naturals = ...
- C语言文件进阶操作
Description文件a.dic.b.dic.c.dic中分别存有张三的三科成绩,每个文件都是16字节:前8个字节存储其英文名字zhangsan,后面是一个空格,其后的2个字节存储其年龄(文本方式 ...
- M2迭代分数分配
M2中仍然依据每个成员的工作量,贡献度分配相应得分. 成员 得分 申开亮 25 王皓南 24 许晋 21 黄玉冰 20 王宇杰 18 吴润凡 17 巴丹益昔 15
- ACM 第六天
图论 网络流 最大流 INF(初始值) 路径上权值最小的边,决定流量大小. 流量网络的三个特性: ①流量控制 ②反对称性 ③流量守恒 残余网络:保留了c(e)容量<f(e)流量[可以继续流,因为 ...
- lintcode-142-O(1)时间检测2的幂次
142-O(1)时间检测2的幂次 用 O(1) 时间检测整数 n 是否是 2 的幂次. 样例 n=4,返回 true; n=5,返回 false. 挑战 O(1) time 标签 比特位操作 思路 使 ...
- LintCode-374.螺旋矩阵
螺旋矩阵 给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素. 样例 给定如下矩阵: [ [ 1, 2, 3 ], [ 4, 5, 6 ...