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的更多相关文章

  1. hyperledger fabric超级账本java sdk样例e2e代码流程分析

     一  checkConfig  Before     1.1  private static final TestConfig testConfig = TestConfig.getConfig() ...

  2. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  3. Hyperledger Fabric 实战(十二): Fabric 源码本地调试

    借助开发网络调试 fabric 源码本地调试 准备工作 IDE Goland Go 1.9.7 fabric-samples 模块 chaincode-docker-devmode fabric 源码 ...

  4. Hyperledger Fabric Node SDK和应用开发

    Hyperledger Fabric 提供了多种语言的SDK版本,其中提出比较早.比较稳定而全面的是Node.js版本的SDK. 前面提到的fabric示例(如first-network和e2e-cl ...

  5. 使用Fabric Node SDK进行Invoke和Query

    前面的文章都是在讲解Fabric网络的搭建和ChainCode的开发,那么在ChainCode开发完毕后,我们就需要使用Fabric SDK做应用程序的开发了.官方虽然提供了Node.JS,Java, ...

  6. 搭建RESTful API来使用Fabric Node SDK 开篇

    在Balance-Transfer中,有关于Node SDK比较完备的例子. SDK的官方文档在这里:https://fabric-sdk-node.github.io/ Balance-Transf ...

  7. Service Fabric基本概念: Node, Application, Service, Partition/Replicas

    作者:张鼎松 (Dingsong Zhang) @ Microsoft 在上一节中,为大家简明扼要的介绍了微软针对现代分布式系统在Azure上实现的相关服务组件.紧接上文内容,本节将为大家介绍Azur ...

  8. fabric默认样例的分析

    参考资料 http://www.bubuko.com/infodetail-2092748.html http://www.ithao123.cn/content-11117437.html http ...

  9. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

随机推荐

  1. DSP5509的定时器实验-第2篇

    1. 导入Easy5509开发板的例程EX02_TIME,5509有2个16位的定时器,有点少啊 2. 直接编译,提示找不到CSL.h,其实我也好奇,CSL库是从哪里来的?RTS库从哪里来的?头文件在 ...

  2. Qt-QML-关于两个平级的qml文件中的函数调用问题

    这几天还在继续搞我的QML,感悟就QML是坑的同时,也是一门很号的语言,用于快速搭界面是很好的.那么,这几天, 遇到一个问题,在下用一个框框画一下,希望可以理解 抽象派,解释一下,QML1和QML3是 ...

  3. grep命令及正则

    文本查找 grep,egrep,fgrep grep :Global Research 根据模式搜索文本,并将符合模式的文本行显示出来 模式:Pattern,文本字符和正则的元字符组合而成匹配条件 g ...

  4. Java应用基础微专业-设计篇

    第1章--抽象与接口 1.1 抽象 An abstract class can be created without abstract methods, the purpose of doing th ...

  5. 题解 CF191C 【Fools and Roads】

    树上差分半裸题 常规思路是进行三次DFS,然后常规运算即可 这里提供两次dfs的思路(wyz tql orz) 我们以样例2为例 我们考虑任意一条路径,令其起点为u终点为v,每走一次当前路径则v的访问 ...

  6. 使用JavaScript判断手机是处于横屏还是竖屏

    移动端的浏览器一般都支持window.orientation这个参数,通过这个参数可以判断出手机是处在横屏还是竖屏状态.从而根据实际需求而执行相应的程序.通过添加监听事件onorientationch ...

  7. ionic 日期插件学习

    <ion-header> <ion-navbar> <ion-title> DateTime </ion-title> </ion-navbar& ...

  8. Java中定时器相关实现的介绍与对比之:Timer和TimerTask

    Timer和TimerTask JDK自带,具体的定时任务由TimerTask指定,定时任务的执行调度由Timer设定.Timer和TimerTask均在包java.util里实现. 本文基于java ...

  9. ajax的$.get()方法和tomcat服务器的交互

    AJAX AJAX = 异步 JavaScript 和 XML. AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. Ajax  get()方法 定义和用法 $.get() 方法 ...

  10. kafka stream 低级别的Processor API动态生成拓扑图

    public class KafkaSream { public static void main(String[] args) { Map<String, Object> props = ...