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. ASP.NET MVC 微信JS-SDK认证

    layout: post title: ASP.NET MVC 微信JS-SDK认证 category: .net date: 2016-11-01 00:00:00 tags: .net javas ...

  2. oracle分区表按时间自动创建

    表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式.表进行分区后,逻辑上仍然是一张 ...

  3. react-native android 初始化问题

    最近开始接触rn,官方起手,装了一堆工具,然后启动项目的时候出现了一堆问题,这里针对我遇到的一些问题提供一些解决方案. 本人开发环境mac,在启动ios的时候没啥大问题,可以直接启动,这里提示一点,因 ...

  4. 【廖雪峰老师python教程】——进程与线程

    多进程 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去.表面上看,每个任务都是交替执行的,但是,由于CPU ...

  5. hdu1051 Wooden Sticks(贪心+排序,逻辑)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. selenium,unittest——驾照科目一网上答题自动化

    需求很简单,所有题目全选A,然后点提交出分,校验是否到达出分这步 遇到的坑有这几个,一个是assertIn哪个是校验哪个是文本要分清,还有code的编码统一到Unicode,最后就是xpath定位各个 ...

  7. 关于java获取网页内容

    最近项目需求,做一些新闻站点的爬取工作.1.简单的jsoup爬取,静态页面形式: String url="a.atimo.cn";//静态页面链接地址Document doc = ...

  8. Navicat和DBeaver的查询快捷键

    1.Navicat for MySQL(连接MySQL数据库的工具) ctrl + r 执行查询页中所有的sql语句 ctrl + shift + r 只运行选中的sql语句 2.DBeaver(支持 ...

  9. JVM--Java类加载机制

    一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其存放在运行时数据区的方法区内,然后在java堆区创建一个java.lang.Class对象,用来封装类在方法区内 ...

  10. ORACLE高级部分内容

    1.pl/sql基本语句 DECLARE BEGIN END; / 循环语句 DECLARE I  NUMBER(2):=1; BEGIN WHILE I<100 LOOP I:=I+1; EN ...