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文档

转载于:https://www.cnblogs.com/qwangxiao/p/10275808.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值