bind_quorum_test.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package bind
  2. import (
  3. "context"
  4. "math/big"
  5. "testing"
  6. "github.com/ethereum/go-ethereum"
  7. "github.com/ethereum/go-ethereum/accounts/abi"
  8. "github.com/ethereum/go-ethereum/common"
  9. "github.com/ethereum/go-ethereum/core/types"
  10. "github.com/ethereum/go-ethereum/crypto"
  11. "github.com/stretchr/testify/require"
  12. )
  13. var (
  14. tmPrivatePayloadHash common.EncryptedPayloadHash
  15. tmPrivateTxHash common.EncryptedPayloadHash
  16. )
  17. func init() {
  18. payloadHash := crypto.Keccak512([]byte("encrypted-private-payload"))
  19. privateTxHash := crypto.Keccak512([]byte("encrypted-private-tx"))
  20. for i := 0; i < 64; i++ {
  21. tmPrivatePayloadHash[i] = payloadHash[i]
  22. tmPrivateTxHash[i] = privateTxHash[i]
  23. }
  24. }
  25. func TestBoundContract_Transact_ContractCreation_PrivateTransaction(t *testing.T) {
  26. transactor := &mockTransactor{}
  27. c := NewBoundContract(common.Address{}, abi.ABI{}, nil, transactor, nil)
  28. senderNonce := 1
  29. opts := &TransactOpts{
  30. Nonce: big.NewInt(int64(senderNonce)),
  31. PrivateFor: []string{"tm1"},
  32. // arbitrary values to skip the logic we're not testing
  33. GasPrice: big.NewInt(0),
  34. GasLimit: uint64(1),
  35. Signer: passthroughSigner,
  36. }
  37. tx, err := c.transact(opts, nil, nil)
  38. wantNonce := uint64(senderNonce)
  39. wantTo := (*common.Address)(nil)
  40. wantData := tmPrivatePayloadHash.Bytes()
  41. require.NoError(t, err)
  42. require.NotNil(t, tx)
  43. require.Equal(t, wantNonce, tx.Nonce())
  44. require.Equal(t, wantTo, tx.To())
  45. require.Equal(t, wantData, tx.Data())
  46. require.True(t, tx.IsPrivate())
  47. }
  48. func TestBoundContract_Transact_ContractCreation_PrivacyPrecompile(t *testing.T) {
  49. transactor := &mockTransactor{}
  50. c := NewBoundContract(common.Address{}, abi.ABI{}, nil, transactor, nil)
  51. senderNonce := 1
  52. opts := &TransactOpts{
  53. Nonce: big.NewInt(int64(senderNonce)),
  54. PrivateFor: []string{"tm1"},
  55. IsUsingPrivacyPrecompile: true,
  56. // arbitrary values to skip the logic we're not testing
  57. GasPrice: big.NewInt(0),
  58. GasLimit: uint64(1),
  59. Signer: passthroughSigner,
  60. }
  61. pmt, err := c.transact(opts, nil, nil)
  62. require.NoError(t, err)
  63. require.NotNil(t, pmt)
  64. // verify the privacy marker transaction
  65. wantPMTNonce := uint64(senderNonce)
  66. wantPMTTo := common.QuorumPrivacyPrecompileContractAddress()
  67. wantPMTData := tmPrivateTxHash.Bytes()
  68. require.Equal(t, wantPMTNonce, pmt.Nonce())
  69. require.Equal(t, &wantPMTTo, pmt.To())
  70. require.Equal(t, wantPMTData, pmt.Data())
  71. require.False(t, pmt.IsPrivate())
  72. // verify the captured internal private transaction
  73. pvtTx := transactor.capturedInternalPrivateTransaction
  74. pvtTxArgs := transactor.capturedInternalPrivateTransactionArgs
  75. wantPvtTxNonce := uint64(senderNonce)
  76. wantPvtTxTo := (*common.Address)(nil)
  77. wantPvtTxData := tmPrivatePayloadHash.Bytes()
  78. require.NotNil(t, pvtTx)
  79. require.Equal(t, wantPvtTxNonce, pvtTx.Nonce())
  80. require.Equal(t, wantPvtTxTo, pvtTx.To())
  81. require.Equal(t, wantPvtTxData, pvtTx.Data())
  82. require.True(t, pvtTx.IsPrivate())
  83. require.Equal(t, []string{"tm1"}, pvtTxArgs.PrivateFor)
  84. }
  85. func TestBoundContract_Transact_Transaction_PrivateTransaction(t *testing.T) {
  86. transactor := &mockTransactor{}
  87. contractAddr := common.HexToAddress("0x1932c48b2bf8102ba33b4a6b545c32236e342f34")
  88. c := NewBoundContract(contractAddr, abi.ABI{}, nil, transactor, nil)
  89. senderNonce := 1
  90. opts := &TransactOpts{
  91. Nonce: big.NewInt(int64(senderNonce)),
  92. PrivateFor: []string{"tm1"},
  93. // arbitrary values to skip the logic we're not testing
  94. GasPrice: big.NewInt(0),
  95. GasLimit: uint64(1),
  96. Signer: passthroughSigner,
  97. }
  98. tx, err := c.transact(opts, &contractAddr, nil)
  99. wantNonce := uint64(senderNonce)
  100. wantTo := &contractAddr
  101. wantData := tmPrivatePayloadHash.Bytes()
  102. require.NoError(t, err)
  103. require.NotNil(t, tx)
  104. require.Equal(t, wantNonce, tx.Nonce())
  105. require.Equal(t, wantTo, tx.To())
  106. require.Equal(t, wantData, tx.Data())
  107. require.True(t, tx.IsPrivate())
  108. }
  109. func TestBoundContract_Transact_Transaction_PrivacyPrecompile(t *testing.T) {
  110. transactor := &mockTransactor{}
  111. contractAddr := common.HexToAddress("0x1932c48b2bf8102ba33b4a6b545c32236e342f34")
  112. c := NewBoundContract(contractAddr, abi.ABI{}, nil, transactor, nil)
  113. senderNonce := 1
  114. opts := &TransactOpts{
  115. Nonce: big.NewInt(int64(senderNonce)),
  116. PrivateFor: []string{"tm1"},
  117. IsUsingPrivacyPrecompile: true,
  118. // arbitrary values to skip the logic we're not testing
  119. GasPrice: big.NewInt(0),
  120. GasLimit: uint64(1),
  121. Signer: passthroughSigner,
  122. }
  123. pmt, err := c.transact(opts, &contractAddr, nil)
  124. require.NoError(t, err)
  125. require.NotNil(t, pmt)
  126. // verify the privacy marker transaction
  127. wantPMTNonce := uint64(senderNonce)
  128. wantPMTTo := common.QuorumPrivacyPrecompileContractAddress()
  129. wantPMTData := tmPrivateTxHash.Bytes()
  130. require.Equal(t, wantPMTNonce, pmt.Nonce())
  131. require.Equal(t, &wantPMTTo, pmt.To())
  132. require.Equal(t, wantPMTData, pmt.Data())
  133. require.False(t, pmt.IsPrivate())
  134. // verify the captured internal private transaction
  135. pvtTx := transactor.capturedInternalPrivateTransaction
  136. pvtTxArgs := transactor.capturedInternalPrivateTransactionArgs
  137. wantPvtTxNonce := uint64(senderNonce)
  138. wantPvtTxTo := &contractAddr
  139. wantPvtTxData := tmPrivatePayloadHash.Bytes()
  140. require.NotNil(t, pvtTx)
  141. require.Equal(t, wantPvtTxNonce, pvtTx.Nonce())
  142. require.Equal(t, wantPvtTxTo, pvtTx.To())
  143. require.Equal(t, wantPvtTxData, pvtTx.Data())
  144. require.True(t, pvtTx.IsPrivate())
  145. require.Equal(t, []string{"tm1"}, pvtTxArgs.PrivateFor)
  146. }
  147. func passthroughSigner(_ common.Address, tx *types.Transaction) (*types.Transaction, error) {
  148. return tx, nil
  149. }
  150. type mockTransactor struct {
  151. capturedInternalPrivateTransaction *types.Transaction
  152. capturedInternalPrivateTransactionArgs PrivateTxArgs
  153. }
  154. func (s *mockTransactor) PreparePrivateTransaction(_ []byte, _ string) (common.EncryptedPayloadHash, error) {
  155. return tmPrivatePayloadHash, nil
  156. }
  157. func (s *mockTransactor) DistributeTransaction(_ context.Context, tx *types.Transaction, args PrivateTxArgs) (string, error) {
  158. s.capturedInternalPrivateTransaction = tx
  159. s.capturedInternalPrivateTransactionArgs = args
  160. return tmPrivateTxHash.Hex(), nil
  161. }
  162. func (s *mockTransactor) SendTransaction(_ context.Context, _ *types.Transaction, _ PrivateTxArgs) error {
  163. return nil
  164. }
  165. func (s *mockTransactor) PendingCodeAt(_ context.Context, _ common.Address) ([]byte, error) {
  166. panic("implement me")
  167. }
  168. func (s *mockTransactor) PendingNonceAt(_ context.Context, _ common.Address) (uint64, error) {
  169. panic("implement me")
  170. }
  171. func (s *mockTransactor) SuggestGasPrice(_ context.Context) (*big.Int, error) {
  172. panic("implement me")
  173. }
  174. func (s *mockTransactor) EstimateGas(_ context.Context, _ ethereum.CallMsg) (gas uint64, err error) {
  175. panic("implement me")
  176. }