You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

268 lines
7.1 KiB

  1. package main
  2. import (
  3. "encoding/json"
  4. "math/big"
  5. "syscall/js"
  6. "github.com/arnaucube/go-snark"
  7. "github.com/arnaucube/go-snark/circuitcompiler"
  8. "github.com/arnaucube/go-snark/groth16"
  9. "github.com/arnaucube/go-snark/wasm/utils"
  10. )
  11. func main() {
  12. c := make(chan struct{}, 0)
  13. println("WASM Go Initialized")
  14. registerCallbacks()
  15. <-c
  16. }
  17. func registerCallbacks() {
  18. js.Global().Set("generateProofs", js.FuncOf(generateProofs))
  19. js.Global().Set("verifyProofs", js.FuncOf(verifyProofs))
  20. js.Global().Set("grothGenerateProofs", js.FuncOf(grothGenerateProofs))
  21. js.Global().Set("grothVerifyProofs", js.FuncOf(grothVerifyProofs))
  22. }
  23. func generateProofs(this js.Value, i []js.Value) interface{} {
  24. var circuitStr utils.CircuitString
  25. err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
  26. if err != nil {
  27. println(i[0].String())
  28. println("error parsing circuit from stringified json")
  29. }
  30. circuit, err := utils.CircuitFromString(circuitStr)
  31. if err != nil {
  32. println("error " + err.Error())
  33. }
  34. sj, err := json.Marshal(circuit)
  35. if err != nil {
  36. println("error " + err.Error())
  37. }
  38. println("circuit", string(sj))
  39. var setupStr utils.SetupString
  40. println(i[1].String())
  41. err = json.Unmarshal([]byte(i[1].String()), &setupStr)
  42. if err != nil {
  43. println("error parsing setup from stringified json")
  44. }
  45. setup, err := utils.SetupFromString(setupStr)
  46. if err != nil {
  47. println("error " + err.Error())
  48. }
  49. sj, err = json.Marshal(setup)
  50. if err != nil {
  51. println("error " + err.Error())
  52. }
  53. println("set", string(sj))
  54. var pxStr []string
  55. err = json.Unmarshal([]byte(i[2].String()), &pxStr)
  56. if err != nil {
  57. println("error parsing pxStr from stringified json")
  58. }
  59. px, err := utils.ArrayStringToBigInt(pxStr)
  60. if err != nil {
  61. println(err.Error())
  62. }
  63. sj, err = json.Marshal(px)
  64. if err != nil {
  65. println("error " + err.Error())
  66. }
  67. println("px", string(sj))
  68. var inputs circuitcompiler.Inputs
  69. err = json.Unmarshal([]byte(i[3].String()), &inputs)
  70. if err != nil {
  71. println("error parsing inputs from stringified json")
  72. }
  73. w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
  74. proof, err := snark.GenerateProofs(circuit, setup, w, px)
  75. if err != nil {
  76. println("error generating proof", err)
  77. }
  78. proofString := utils.ProofToString(proof)
  79. proofJson, err := json.Marshal(proofString)
  80. if err != nil {
  81. println("error marshal proof to json", err)
  82. }
  83. println("proofJson", string(proofJson))
  84. return js.ValueOf(string(proofJson))
  85. }
  86. func verifyProofs(this js.Value, i []js.Value) interface{} {
  87. var circuitStr utils.CircuitString
  88. err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
  89. if err != nil {
  90. println(i[0].String())
  91. println("error parsing circuit from stringified json")
  92. }
  93. circuit, err := utils.CircuitFromString(circuitStr)
  94. if err != nil {
  95. println("error " + err.Error())
  96. }
  97. var setupStr utils.SetupString
  98. println(i[1].String())
  99. err = json.Unmarshal([]byte(i[1].String()), &setupStr)
  100. if err != nil {
  101. println("error parsing setup from stringified json")
  102. }
  103. setup, err := utils.SetupFromString(setupStr)
  104. if err != nil {
  105. println("error " + err.Error())
  106. }
  107. var proofStr utils.ProofString
  108. err = json.Unmarshal([]byte(i[2].String()), &proofStr)
  109. if err != nil {
  110. println(i[0].String())
  111. println("error parsing proof from stringified json")
  112. }
  113. proof, err := utils.ProofFromString(proofStr)
  114. if err != nil {
  115. println("error " + err.Error())
  116. }
  117. var publicInputs []*big.Int
  118. err = json.Unmarshal([]byte(i[3].String()), &publicInputs)
  119. if err != nil {
  120. println(i[0].String())
  121. println("error parsing publicInputs from stringified json")
  122. }
  123. verified := snark.VerifyProof(circuit, setup, proof, publicInputs, false)
  124. if err != nil {
  125. println("error verifiyng proof", err)
  126. }
  127. verifiedJson, err := json.Marshal(verified)
  128. if err != nil {
  129. println("error marshal verified to json", err)
  130. }
  131. println("verifiedJson", string(verifiedJson))
  132. return js.ValueOf(string(verifiedJson))
  133. }
  134. func grothGenerateProofs(this js.Value, i []js.Value) interface{} {
  135. var circuitStr utils.CircuitString
  136. err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
  137. if err != nil {
  138. println(i[0].String())
  139. println("error parsing circuit from stringified json")
  140. }
  141. circuit, err := utils.CircuitFromString(circuitStr)
  142. if err != nil {
  143. println("error " + err.Error())
  144. }
  145. sj, err := json.Marshal(circuit)
  146. if err != nil {
  147. println("error " + err.Error())
  148. }
  149. println("circuit", string(sj))
  150. var setupStr utils.GrothSetupString
  151. println(i[1].String())
  152. err = json.Unmarshal([]byte(i[1].String()), &setupStr)
  153. if err != nil {
  154. println("error parsing setup from stringified json")
  155. }
  156. setup, err := utils.GrothSetupFromString(setupStr)
  157. if err != nil {
  158. println("error " + err.Error())
  159. }
  160. sj, err = json.Marshal(setup)
  161. if err != nil {
  162. println("error " + err.Error())
  163. }
  164. println("set", string(sj))
  165. var pxStr []string
  166. err = json.Unmarshal([]byte(i[2].String()), &pxStr)
  167. if err != nil {
  168. println("error parsing pxStr from stringified json")
  169. }
  170. px, err := utils.ArrayStringToBigInt(pxStr)
  171. if err != nil {
  172. println(err.Error())
  173. }
  174. sj, err = json.Marshal(px)
  175. if err != nil {
  176. println("error " + err.Error())
  177. }
  178. println("px", string(sj))
  179. var inputs circuitcompiler.Inputs
  180. err = json.Unmarshal([]byte(i[3].String()), &inputs)
  181. if err != nil {
  182. println("error parsing inputs from stringified json")
  183. }
  184. w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
  185. proof, err := groth16.GenerateProofs(circuit, setup, w, px)
  186. if err != nil {
  187. println("error generating proof", err)
  188. }
  189. proofString := utils.GrothProofToString(proof)
  190. proofJson, err := json.Marshal(proofString)
  191. if err != nil {
  192. println("error marshal proof to json", err)
  193. }
  194. println("proofJson", string(proofJson))
  195. return js.ValueOf(string(proofJson))
  196. }
  197. func grothVerifyProofs(this js.Value, i []js.Value) interface{} {
  198. var circuitStr utils.CircuitString
  199. err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
  200. if err != nil {
  201. println(i[0].String())
  202. println("error parsing circuit from stringified json")
  203. }
  204. circuit, err := utils.CircuitFromString(circuitStr)
  205. if err != nil {
  206. println("error " + err.Error())
  207. }
  208. var setupStr utils.GrothSetupString
  209. println(i[1].String())
  210. err = json.Unmarshal([]byte(i[1].String()), &setupStr)
  211. if err != nil {
  212. println("error parsing setup from stringified json")
  213. }
  214. setup, err := utils.GrothSetupFromString(setupStr)
  215. if err != nil {
  216. println("error " + err.Error())
  217. }
  218. var proofStr utils.GrothProofString
  219. err = json.Unmarshal([]byte(i[2].String()), &proofStr)
  220. if err != nil {
  221. println(i[0].String())
  222. println("error parsing proof from stringified json")
  223. }
  224. proof, err := utils.GrothProofFromString(proofStr)
  225. if err != nil {
  226. println("error " + err.Error())
  227. }
  228. var publicInputs []*big.Int
  229. err = json.Unmarshal([]byte(i[3].String()), &publicInputs)
  230. if err != nil {
  231. println(i[0].String())
  232. println("error parsing publicInputs from stringified json")
  233. }
  234. verified := groth16.VerifyProof(circuit, setup, proof, publicInputs, false)
  235. if err != nil {
  236. println("error verifiyng proof", err)
  237. }
  238. verifiedJson, err := json.Marshal(verified)
  239. if err != nil {
  240. println("error marshal verified to json", err)
  241. }
  242. println("verifiedJson", string(verifiedJson))
  243. return js.ValueOf(string(verifiedJson))
  244. }