privateTransactionManagerClient.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package ethclient
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "fmt"
  7. "net/http"
  8. "net/url"
  9. "github.com/ethereum/go-ethereum/common"
  10. )
  11. type privateTransactionManagerClient interface {
  12. StoreRaw(data []byte, privateFrom string) (common.EncryptedPayloadHash, error)
  13. }
  14. type privateTransactionManagerDefaultClient struct {
  15. rawurl string
  16. httpClient *http.Client
  17. }
  18. // Create a new client to interact with private transaction manager via a HTTP endpoint
  19. func newPrivateTransactionManagerClient(endpoint string) (privateTransactionManagerClient, error) {
  20. _, err := url.Parse(endpoint)
  21. if err != nil {
  22. return nil, err
  23. }
  24. return &privateTransactionManagerDefaultClient{
  25. rawurl: endpoint,
  26. httpClient: &http.Client{},
  27. }, nil
  28. }
  29. type storeRawReq struct {
  30. Payload string `json:"payload"`
  31. From string `json:"from,omitempty"`
  32. }
  33. type storeRawResp struct {
  34. Key string `json:"key"`
  35. }
  36. func (pc *privateTransactionManagerDefaultClient) StoreRaw(data []byte, privateFrom string) (common.EncryptedPayloadHash, error) {
  37. storeRawReq := &storeRawReq{
  38. Payload: base64.StdEncoding.EncodeToString(data),
  39. From: privateFrom,
  40. }
  41. reqBodyBuf := new(bytes.Buffer)
  42. if err := json.NewEncoder(reqBodyBuf).Encode(storeRawReq); err != nil {
  43. return common.EncryptedPayloadHash{}, err
  44. }
  45. resp, err := pc.httpClient.Post(pc.rawurl+"/storeraw", "application/json", reqBodyBuf)
  46. if err != nil {
  47. return common.EncryptedPayloadHash{}, fmt.Errorf("unable to invoke /storeraw due to %s", err)
  48. }
  49. defer func() {
  50. _ = resp.Body.Close()
  51. }()
  52. if resp.StatusCode != http.StatusOK {
  53. return common.EncryptedPayloadHash{}, fmt.Errorf("server returns %s", resp.Status)
  54. }
  55. // parse response
  56. var storeRawResp storeRawResp
  57. if err := json.NewDecoder(resp.Body).Decode(&storeRawResp); err != nil {
  58. return common.EncryptedPayloadHash{}, err
  59. }
  60. encryptedPayloadHash, err := common.Base64ToEncryptedPayloadHash(storeRawResp.Key)
  61. if err != nil {
  62. return common.EncryptedPayloadHash{}, err
  63. }
  64. return encryptedPayloadHash, nil
  65. }