艺术品区块链溯源防伪平台(连载三)数字资产如何上链

发布时间:2018年11月22日 价值:20000.00 / 共识:32

Netkiller Blockchain 手札

作者正在找工作,联系方式 13113668890

Mr. Neo Chan, 陈景峯(BG7NYT)

中国广东省深圳市望海路半岛城邦三期
518067
+86 13113668890

netkiller@msn.com

文档始创于2018-02-10

版权 © 2018 Netkiller(Neo Chan). All rights reserved.

版权声明
转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

http://www.netkiller.cn
http://netkiller.github.io
http://netkiller.sourceforge.net
微信订阅号 netkiller-ebook (微信扫描二维码)
QQ:13721218 请注明“读者”
QQ群:128659835 请注明“读者”

2.10.6. 资产上链的 Hyperledger Fabic 链码

我们希望资产上链适用于任何领域,后面也方便将业务拓展。所以我实现了一个万能合约。以不变应万变。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/hyperledger/fabric/core/chaincode/shim"
  5. pb "github.com/hyperledger/fabric/protos/peer"
  6. )
  7. type SmartContract struct {}
  8. func (s *SmartContract) Init(stub shim.ChaincodeStubInterface) pb.Response {
  9. return shim.Success(nil)
  10. }
  11. func (s *SmartContract) Query(stub shim.ChaincodeStubInterface) pb.Response {
  12. return shim.Success(nil)
  13. }
  14. func (s *SmartContract) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
  15. // Retrieve the requested Smart Contract function and arguments
  16. function, args := stub.GetFunctionAndParameters()
  17. // Route to the appropriate handler function to interact with the ledger appropriately
  18. if function == "create" {
  19. return s.create(stub, args)
  20. } else if function == "find" {
  21. return s.find(stub, args)
  22. } else if function == "update" {
  23. return s.update(stub, args)
  24. } else if function == "delete" {
  25. return s.delete(stub, args)
  26. }
  27. return shim.Error("Invalid Smart Contract function name.")
  28. }
  29. func (s *SmartContract) create(stub shim.ChaincodeStubInterface, args []string) pb.Response {
  30. if len(args) != 2 {
  31. return shim.Error("Incorrect number of arguments. Expecting 2")
  32. }
  33. _key := args[0]
  34. _data := args[1]
  35. if(_data == ""){
  36. return shim.Error("Incorrect string of data")
  37. }
  38. existAsBytes,err := stub.GetState(_key)
  39. if string(existAsBytes) != "" {
  40. fmt.Println("Failed to create account, Duplicate key.")
  41. return shim.Error("Failed to create account, Duplicate key.")
  42. }
  43. err = stub.PutState(_key, []byte(_data))
  44. if err != nil {
  45. return shim.Error(err.Error())
  46. }
  47. fmt.Printf("create %s %s \n", _key, string(_data))
  48. return shim.Success(nil)
  49. }
  50. func (s *SmartContract) find(stub shim.ChaincodeStubInterface, args []string) pb.Response {
  51. if len(args) != 1 {
  52. return shim.Error("Incorrect number of arguments. Expecting 1")
  53. }
  54. _key := args[0]
  55. _data, err := stub.GetState(_key)
  56. if err != nil {
  57. return shim.Error(err.Error())
  58. }
  59. if string(_data) == "" {
  60. return shim.Error("The key isn't exist.")
  61. }else{
  62. fmt.Printf("query %s %s \n", _key, string(_data))
  63. }
  64. return shim.Success(_data)
  65. }
  66. func (s *SmartContract) update(stub shim.ChaincodeStubInterface, args []string) pb.Response {
  67. if len(args) != 2 {
  68. return shim.Error("Incorrect number of arguments. Expecting 2")
  69. }
  70. _key := args[0]
  71. _data := args[1]
  72. if(_data == ""){
  73. return shim.Error("Incorrect string of data")
  74. }
  75. err := stub.PutState(_key, []byte(_data))
  76. if err != nil {
  77. return shim.Error(err.Error())
  78. }else{
  79. fmt.Printf("update %s %s \n", _key, string(_data))
  80. }
  81. return shim.Success(nil)
  82. }
  83. // Deletes an entity from state
  84. func (t *SmartContract) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response {
  85. if len(args) != 1 {
  86. return shim.Error("Incorrect number of arguments. Expecting 1")
  87. }
  88. _key := args[0]
  89. // Delete the key from the state in ledger
  90. err := stub.DelState(_key)
  91. if err != nil {
  92. return shim.Error("Failed to delete state")
  93. }
  94. return shim.Success(nil)
  95. }
  96. func main() {
  97. err := shim.Start(new(SmartContract))
  98. if err != nil {
  99. fmt.Printf("Error creating new Smart Contract: %s", err)
  100. }
  101. }

链码有四个函数,分别是创建,查找,更新,删除。

  1. if function == "create" {
  2. return s.create(stub, args) // 创建
  3. } else if function == "find" {
  4. return s.find(stub, args) // 查找
  5. } else if function == "update" {
  6. return s.update(stub, args) // 更新
  7. } else if function == "delete" {
  8. return s.delete(stub, args) // 删除
  9. }

上链使用 create 方法,函数有两个参数,一个是 key, 另一个是数据。

key 使用 UUID 存储再数据库和链上,同时 UUID 对应通证的

data 是序列化 byte 数据。例如可以使用 json, hession, msgpack 等序列化后的数据。

err = stub.PutState(_key, []byte(_data))

这个链码考虑到前期产品上市,不确定性因素很多,需要更新和删除等等。后期我们可以在数据中设置一个 status 变量,当 status = false 就不在允许数据的删除和更新。

  • 分享 收藏
0 条评论
  • 这篇文章暂无评论,赶紧评论一下吧~