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. 使用AutoFac实现依赖注入(封装一个注册类)

    public class AutoFacBootStrapper { public static void CoreAutoFacInit() { var builder = new Containe ...

  2. 「日常训练」Caterpillar(POJ-3310)

    题意与分析 一条很有趣的题目.给一个无向图,问它是否无环,且可以在上面找到一条线,使所有的顶点要么在线上要么不在线上但在与线相连的边上. 那么首先要确定所有点联系在一起.这个可以同判环一起处理:如果建 ...

  3. 安装mysql-5.7.12-winx64

    之前安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 1.mysql-5.7.12-winx64.zip下载 官方下载地址:http://dev.mysq ...

  4. JS获取HTML DOM元素的8种方法

    什么是HTML DOM 文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展置标语言的标准编程接口.简单理解就是HTML DOM 是关于如何获取.修改.添加或删除 ...

  5. 编写你自己的Python模块

    其实网上Python教程挺多的,编写你自己的模块很简单,这其实就是你一直在做的事情!这是因为每一个 Python 程序同时也是一个模块.你只需要保证它以 .py 为扩展名即可.下面的案例会作出清晰的解 ...

  6. leetcode-组合总数IV(动态规划)

    377. 组合总和 Ⅳ 给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数. 示例: nums = [1, 2, 3] target = 4   所有可能的组合为: (1, ...

  7. JAVA基础学习之路(四)定义简单java类

    简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...

  8. CSP201609-1:最大波动

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  9. 【C#】arcface人脸识别使用问题分析

    arcface上线了新版 正好有空 赶紧下载体验了一番 凡是过程中也遇到一些问题 1.初始化 [DllImport("libarcsoft_face_engine.dll", En ...

  10. 2018科大讯飞AI营销算法大赛全面来袭,等你来战!

    AI技术已成为推动营销迭代的重要驱动力.AI营销高速发展的同时,积累了海量的广告数据和用户数据.如何有效应用这些数据,是大数据技术落地营销领域的关键,也是检测智能营销平台竞争力的标准. 讯飞AI营销云 ...