重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
小编给大家分享一下Hyperledger Fabric如何实现Fabric node SDK样例之投票DAPP,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
韶山网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
参考 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()) } vote := Vote{} if userAsBytes != nil { err = json.Unmarshal(userAsBytes , &vote) if err != nil { return shim.Error(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 := 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 的目录下操作
运行启动网络 ./startFabric.sh
安装依赖: npm install
注册节点管理员: node enrollAdmin.js
注册用户:node registerUser.js
运行程序:node index.js
在浏览器访问:localhost:8080
以上是“Hyperledger Fabric如何实现Fabric node SDK样例之投票DAPP”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!