Guest User

Untitled

a guest
Nov 18th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. /*
  2. * Smart Contract de ejemplo para HF Tutorial
  3. *
  4. * Autor: Antonio Paya Gonzalez
  5. */
  6.  
  7. package main
  8.  
  9. import (
  10. "bytes"
  11. "encoding/json"
  12. "fmt"
  13. "strconv"
  14.  
  15. "github.com/hyperledger/fabric/core/chaincode/shim"
  16. sc "github.com/hyperledger/fabric/protos/peer"
  17. )
  18.  
  19. // Define la estructura del SmartContract
  20. type SmartContract struct {
  21. }
  22.  
  23. // Define la estructura de Laptop
  24. type Laptop struct {
  25. Marca string `json:"marca"`
  26. Modelo string `json:"modelo"`
  27. Color string `json:"color"`
  28. Propietario string `json:"propietario"`
  29. }
  30.  
  31. /*
  32. * El metodo Init se llama cuando el Smart Contract se instancia por la red blockchain
  33. */
  34. func (s *SmartContract) Init(APIstub shim.ChaincodeStubInterface) sc.Response {
  35. return shim.Success(nil)
  36. }
  37.  
  38. /*
  39. * El metodo Invoke se llama como resultado de ejecutar el Smart Contract
  40. */
  41. func (s *SmartContract) Invoke(APIstub shim.ChaincodeStubInterface) sc.Response {
  42. function, args := APIstub.GetFunctionAndParameters()
  43.  
  44. if function == "queryLaptop" {
  45. return s.queryLaptop(APIstub, args)
  46. } else if function == "initLedger" {
  47. return s.initLedger(APIstub)
  48. } else if function == "createLaptop" {
  49. return s.createLaptop(APIstub, args)
  50. } else if function == "deleteLaptop" {
  51. return s.deleteLaptop(APIstub, args)
  52. } else if function == "queryAllLaptops" {
  53. return s.queryAllLaptops(APIstub)
  54. } else if function == "cambiarPropietarioLaptop" {
  55. return s.cambiarPropietarioLaptop(APIstub, args)
  56. }
  57.  
  58. return shim.Error("Nombre de funcion del SmartContract invalido o inexistente.")
  59. }
  60.  
  61. func (s *SmartContract) initLedger(APIstub shim.ChaincodeStubInterface) sc.Response {
  62. laptops := []Laptop{
  63. Laptop{Marca: "HP", Modelo: "Omen", Color: "black", Propietario: "Microsoft"},
  64. Laptop{Marca: "Acer", Modelo: "Aspire", Color: "black", Propietario: "Microsoft"},
  65. Laptop{Marca: "Asus", Modelo: "N551J", Color: "silver", Propietario: "Apple"},
  66. Laptop{Marca: "Lenovo", Modelo: "80XL", Color: "white", Propietario: "Apple"},
  67. }
  68.  
  69. i := 0
  70. for i < len(laptops) {
  71. fmt.Println("i is ", i)
  72. laptopAsBytes, _ := json.Marshal(laptops[i])
  73. APIstub.PutState("LAP"+strconv.Itoa(i), laptopAsBytes)
  74. fmt.Println("Added", laptops[i])
  75. i = i + 1
  76. }
  77.  
  78. return shim.Success(nil)
  79. }
  80.  
  81. func (s *SmartContract) queryLaptop(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
  82.  
  83. if len(args) != 1 {
  84. return shim.Error("Numero incorrecto de argumentos, se esperaba 1")
  85. }
  86.  
  87. laptopAsBytes, _ := APIstub.GetState(args[0])
  88. return shim.Success(laptopAsBytes)
  89. }
  90.  
  91. func (s *SmartContract) createLaptop(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
  92.  
  93. if len(args) != 5 {
  94. return shim.Error("Numero incorrecto de argumentos, se esperaban 5")
  95. }
  96.  
  97. var laptop = Laptop{Marca: args[1], Modelo: args[2], Color: args[3], Propietario: args[4]}
  98.  
  99. laptopAsBytes, _ := json.Marshal(laptop)
  100. APIstub.PutState(args[0], laptopAsBytes)
  101.  
  102. return shim.Success(nil)
  103. }
  104.  
  105. func (s *SmartContract) deleteLaptop(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
  106.  
  107. if len(args) != 1 {
  108. return shim.Error("Numero incorrecto de argumentos, se esperaba 1")
  109. }
  110.  
  111. APIstub.DelState(args[0])
  112. return shim.Success(nil)
  113. }
  114.  
  115. func (s *SmartContract) queryAllLaptops(APIstub shim.ChaincodeStubInterface) sc.Response {
  116.  
  117. startKey := "LAP0"
  118. endKey := "LAP999"
  119.  
  120. resultsIterator, err := APIstub.GetStateByRange(startKey, endKey)
  121. if err != nil {
  122. return shim.Error(err.Error())
  123. }
  124. defer resultsIterator.Close()
  125.  
  126. // buffer es un array JSON con los resultados de la consulta
  127. var buffer bytes.Buffer
  128. buffer.WriteString("[")
  129.  
  130. bArrayMemberAlreadyWritten := false
  131. for resultsIterator.HasNext() {
  132. queryResponse, err := resultsIterator.Next()
  133. if err != nil {
  134. return shim.Error(err.Error())
  135. }
  136. if bArrayMemberAlreadyWritten == true {
  137. buffer.WriteString(",")
  138. }
  139. buffer.WriteString("{\"Key\":")
  140. buffer.WriteString("\"")
  141. buffer.WriteString(queryResponse.Key)
  142. buffer.WriteString("\"")
  143.  
  144. buffer.WriteString(", \"Record\":")
  145. // Guardarlo como un objeto JSON
  146. buffer.WriteString(string(queryResponse.Value))
  147. buffer.WriteString("}")
  148. bArrayMemberAlreadyWritten = true
  149. }
  150. buffer.WriteString("]")
  151.  
  152. fmt.Printf("- queryAllLaptops:\n%s\n", buffer.String())
  153.  
  154. return shim.Success(buffer.Bytes())
  155. }
  156.  
  157. func (s *SmartContract) cambiarPropietarioLaptop(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
  158.  
  159. if len(args) != 2 {
  160. return shim.Error("Numero incorrecto de argumentos, se esperaban 2")
  161. }
  162.  
  163. laptopAsBytes, _ := APIstub.GetState(args[0])
  164. laptop := Laptop{}
  165.  
  166. json.Unmarshal(laptopAsBytes, &laptop)
  167. laptop.Propietario = args[1]
  168.  
  169. laptopAsBytes, _ = json.Marshal(laptop)
  170. APIstub.PutState(args[0], laptopAsBytes)
  171.  
  172. return shim.Success(nil)
  173. }
  174.  
  175. // Esta funcion solo es relevante para pruebas unitarias.
  176. func main() {
  177.  
  178. // Create a new Smart Contract
  179. err := shim.Start(new(SmartContract))
  180. if err != nil {
  181. fmt.Printf("Error al crear el Smart Contract: %s", err)
  182. }
  183. }
Add Comment
Please, Sign In to add comment