api_test.go 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. package ethapi
  2. import (
  3. "context"
  4. "io/ioutil"
  5. "math/big"
  6. "os"
  7. "path/filepath"
  8. "testing"
  9. "time"
  10. "github.com/ethereum/go-ethereum/accounts"
  11. "github.com/ethereum/go-ethereum/accounts/keystore"
  12. "github.com/ethereum/go-ethereum/common"
  13. "github.com/ethereum/go-ethereum/common/hexutil"
  14. "github.com/ethereum/go-ethereum/common/math"
  15. "github.com/ethereum/go-ethereum/consensus"
  16. "github.com/ethereum/go-ethereum/core"
  17. "github.com/ethereum/go-ethereum/core/bloombits"
  18. "github.com/ethereum/go-ethereum/core/mps"
  19. "github.com/ethereum/go-ethereum/core/rawdb"
  20. "github.com/ethereum/go-ethereum/core/state"
  21. "github.com/ethereum/go-ethereum/core/types"
  22. "github.com/ethereum/go-ethereum/core/vm"
  23. "github.com/ethereum/go-ethereum/crypto"
  24. "github.com/ethereum/go-ethereum/eth/downloader"
  25. "github.com/ethereum/go-ethereum/ethdb"
  26. "github.com/ethereum/go-ethereum/event"
  27. "github.com/ethereum/go-ethereum/log"
  28. "github.com/ethereum/go-ethereum/multitenancy"
  29. "github.com/ethereum/go-ethereum/params"
  30. "github.com/ethereum/go-ethereum/private"
  31. "github.com/ethereum/go-ethereum/private/engine"
  32. "github.com/ethereum/go-ethereum/private/engine/notinuse"
  33. "github.com/ethereum/go-ethereum/rpc"
  34. "github.com/ethereum/go-ethereum/trie"
  35. "github.com/golang/mock/gomock"
  36. "github.com/jpmorganchase/quorum-security-plugin-sdk-go/proto"
  37. "github.com/stretchr/testify/assert"
  38. "github.com/stretchr/testify/require"
  39. )
  40. var (
  41. arbitraryCtx = context.Background()
  42. arbitraryPrivateFrom = "arbitrary private from"
  43. arbitraryPrivateFor = []string{"arbitrary party 1", "arbitrary party 2"}
  44. arbitraryMandatoryFor = []string{"arbitrary party 2"}
  45. privateTxArgs = &PrivateTxArgs{
  46. PrivateFrom: arbitraryPrivateFrom,
  47. PrivateFor: arbitraryPrivateFor,
  48. }
  49. arbitraryFrom = common.BytesToAddress([]byte("arbitrary address"))
  50. arbitraryTo = common.BytesToAddress([]byte("arbitrary address to"))
  51. arbitraryGas = uint64(200000)
  52. arbitraryZeroGasPrice = big.NewInt(0)
  53. arbitraryZeroValue = big.NewInt(0)
  54. arbitraryEmptyData = new([]byte)
  55. arbitraryAccessList = types.AccessList{}
  56. callTxArgs = CallArgs{
  57. From: &arbitraryFrom,
  58. To: &arbitraryTo,
  59. Gas: (*hexutil.Uint64)(&arbitraryGas),
  60. GasPrice: (*hexutil.Big)(arbitraryZeroGasPrice),
  61. Value: (*hexutil.Big)(arbitraryZeroValue),
  62. Data: (*hexutil.Bytes)(arbitraryEmptyData),
  63. AccessList: &arbitraryAccessList,
  64. }
  65. arbitrarySimpleStorageContractEncryptedPayloadHash = common.BytesToEncryptedPayloadHash([]byte("arbitrary payload hash"))
  66. arbitraryMandatoryRecipientsContractEncryptedPayloadHash = common.BytesToEncryptedPayloadHash([]byte("arbitrary payload hash of tx with mr"))
  67. simpleStorageContractCreationTx = types.NewContractCreation(
  68. 0,
  69. big.NewInt(0),
  70. hexutil.MustDecodeUint64("0x47b760"),
  71. big.NewInt(0),
  72. hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"))
  73. rawSimpleStorageContractCreationTx = types.NewContractCreation(
  74. 0,
  75. big.NewInt(0),
  76. hexutil.MustDecodeUint64("0x47b760"),
  77. big.NewInt(0),
  78. arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes())
  79. arbitrarySimpleStorageContractAddress common.Address
  80. arbitraryStandardPrivateSimpleStorageContractAddress common.Address
  81. arbitraryMandatoryRecipientsSimpleStorageContractAddress common.Address
  82. simpleStorageContractMessageCallTx *types.Transaction
  83. standardPrivateSimpleStorageContractMessageCallTx *types.Transaction
  84. rawStandardPrivateSimpleStorageContractMessageCallTx *types.Transaction
  85. arbitraryCurrentBlockNumber = big.NewInt(1)
  86. publicStateDB *state.StateDB
  87. privateStateDB *state.StateDB
  88. workdir string
  89. )
  90. func TestMain(m *testing.M) {
  91. setup()
  92. retCode := m.Run()
  93. teardown()
  94. os.Exit(retCode)
  95. }
  96. func setup() {
  97. log.Root().SetHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(true)))
  98. var err error
  99. memdb := rawdb.NewMemoryDatabase()
  100. db := state.NewDatabase(memdb)
  101. publicStateDB, err = state.New(common.Hash{}, db, nil)
  102. if err != nil {
  103. panic(err)
  104. }
  105. privateStateDB, err = state.New(common.Hash{}, db, nil)
  106. if err != nil {
  107. panic(err)
  108. }
  109. private.P = &StubPrivateTransactionManager{}
  110. key, _ := crypto.GenerateKey()
  111. from := crypto.PubkeyToAddress(key.PublicKey)
  112. arbitrarySimpleStorageContractAddress = crypto.CreateAddress(from, 0)
  113. simpleStorageContractMessageCallTx = types.NewTransaction(
  114. 0,
  115. arbitrarySimpleStorageContractAddress,
  116. big.NewInt(0),
  117. hexutil.MustDecodeUint64("0x47b760"),
  118. big.NewInt(0),
  119. hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000d"))
  120. arbitraryStandardPrivateSimpleStorageContractAddress = crypto.CreateAddress(from, 1)
  121. standardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction(
  122. 0,
  123. arbitraryStandardPrivateSimpleStorageContractAddress,
  124. big.NewInt(0),
  125. hexutil.MustDecodeUint64("0x47b760"),
  126. big.NewInt(0),
  127. hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"))
  128. rawStandardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction(
  129. 0,
  130. arbitraryStandardPrivateSimpleStorageContractAddress,
  131. big.NewInt(0),
  132. hexutil.MustDecodeUint64("0x47b760"),
  133. big.NewInt(0),
  134. arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes())
  135. workdir, err = ioutil.TempDir("", "")
  136. if err != nil {
  137. panic(err)
  138. }
  139. }
  140. func teardown() {
  141. log.Root().SetHandler(log.DiscardHandler())
  142. os.RemoveAll(workdir)
  143. }
  144. func TestDoEstimateGas_whenNoValueTx_Pre_Istanbul(t *testing.T) {
  145. assert := assert.New(t)
  146. estimation, err := DoEstimateGas(arbitraryCtx, &StubBackend{CurrentHeadNumber: big.NewInt(10)}, callTxArgs, rpc.BlockNumberOrHashWithNumber(10), math.MaxInt64)
  147. assert.NoError(err, "gas estimation")
  148. assert.Equal(hexutil.Uint64(25352), estimation, "estimation for a public or private tx")
  149. }
  150. func TestDoEstimateGas_whenNoValueTx_Istanbul(t *testing.T) {
  151. assert := assert.New(t)
  152. estimation, err := DoEstimateGas(arbitraryCtx, &StubBackend{IstanbulBlock: big.NewInt(0), CurrentHeadNumber: big.NewInt(10)}, callTxArgs, rpc.BlockNumberOrHashWithNumber(10), math.MaxInt64)
  153. assert.NoError(err, "gas estimation")
  154. assert.Equal(hexutil.Uint64(22024), estimation, "estimation for a public or private tx")
  155. }
  156. func TestSimulateExecution_whenStandardPrivateCreation(t *testing.T) {
  157. assert := assert.New(t)
  158. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  159. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
  160. assert.NoError(err, "simulate execution")
  161. assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
  162. assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
  163. }
  164. func TestSimulateExecution_whenPartyProtectionCreation(t *testing.T) {
  165. assert := assert.New(t)
  166. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  167. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
  168. assert.NoError(err, "simulation execution")
  169. assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
  170. assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
  171. }
  172. func TestSimulateExecution_whenCreationWithStateValidation(t *testing.T) {
  173. assert := assert.New(t)
  174. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
  175. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
  176. assert.NoError(err, "simulate execution")
  177. assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
  178. assert.NotEqual(common.Hash{}, merkleRoot, "private state validation")
  179. }
  180. func TestSimulateExecution_whenStandardPrivateMessageCall(t *testing.T) {
  181. assert := assert.New(t)
  182. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  183. privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002"))
  184. privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  185. privateStateDB.Commit(true)
  186. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
  187. log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
  188. assert.NoError(err, "simulate execution")
  189. assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes")
  190. assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
  191. }
  192. func TestSimulateExecution_StandardPrivateMessageCallSucceedsWheContractNotAvailableLocally(t *testing.T) {
  193. assert := assert.New(t)
  194. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  195. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
  196. log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
  197. assert.NoError(err, "simulate execution")
  198. assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes")
  199. assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
  200. }
  201. func TestSimulateExecution_whenPartyProtectionMessageCall(t *testing.T) {
  202. assert := assert.New(t)
  203. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  204. privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
  205. privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
  206. PrivacyFlag: privateTxArgs.PrivacyFlag,
  207. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  208. })
  209. privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  210. privateStateDB.Commit(true)
  211. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  212. expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
  213. log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
  214. assert.NoError(err, "simulate execution")
  215. assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
  216. assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
  217. assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes))
  218. }
  219. func TestSimulateExecution_whenPartyProtectionMessageCallAndPrivacyEnhancementsDisabled(t *testing.T) {
  220. assert := assert.New(t)
  221. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  222. params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil
  223. defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }()
  224. stbBackend := &StubBackend{}
  225. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, stbBackend, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  226. // the simulation returns early without executing the transaction
  227. assert.False(stbBackend.getEVMCalled, "simulation is ended early - before getEVM is called")
  228. assert.NoError(err, "simulate execution")
  229. assert.Empty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
  230. assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
  231. }
  232. func TestSimulateExecution_whenStateValidationMessageCall(t *testing.T) {
  233. assert := assert.New(t)
  234. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
  235. privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
  236. privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
  237. PrivacyFlag: privateTxArgs.PrivacyFlag,
  238. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  239. })
  240. privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  241. privateStateDB.Commit(true)
  242. affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  243. expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
  244. log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
  245. assert.NoError(err, "simulate execution")
  246. assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
  247. assert.NotEqual(common.Hash{}, merkleRoot, "private state validation")
  248. assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes))
  249. }
  250. //mix and match flags
  251. func TestSimulateExecution_PrivacyFlagPartyProtectionCallingStandardPrivateContract_Error(t *testing.T) {
  252. assert := assert.New(t)
  253. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  254. privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002"))
  255. privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  256. privateStateDB.Commit(true)
  257. _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
  258. log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
  259. assert.Error(err, "simulate execution")
  260. }
  261. func TestSimulateExecution_StandardPrivateFlagCallingPartyProtectionContract_Error(t *testing.T) {
  262. assert := assert.New(t)
  263. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  264. privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
  265. privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
  266. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  267. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  268. })
  269. privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  270. privateStateDB.Commit(true)
  271. _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  272. assert.Error(err, "simulate execution")
  273. }
  274. func TestSimulateExecution_StandardPrivateFlagCallingStateValidationContract_Error(t *testing.T) {
  275. assert := assert.New(t)
  276. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  277. privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
  278. privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
  279. PrivacyFlag: engine.PrivacyFlagStateValidation,
  280. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  281. })
  282. privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  283. privateStateDB.Commit(true)
  284. _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  285. log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
  286. assert.Error(err, "simulate execution")
  287. }
  288. func TestSimulateExecution_PartyProtectionFlagCallingStateValidationContract_Error(t *testing.T) {
  289. assert := assert.New(t)
  290. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  291. privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
  292. privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
  293. PrivacyFlag: engine.PrivacyFlagStateValidation,
  294. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  295. })
  296. privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  297. privateStateDB.Commit(true)
  298. _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  299. log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
  300. assert.Error(err, "simulate execution")
  301. }
  302. func TestSimulateExecution_StateValidationFlagCallingPartyProtectionContract_Error(t *testing.T) {
  303. assert := assert.New(t)
  304. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
  305. privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
  306. privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
  307. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  308. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  309. })
  310. privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
  311. privateStateDB.Commit(true)
  312. _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
  313. //expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
  314. log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
  315. assert.Error(err, "simulate execution")
  316. }
  317. func TestHandlePrivateTransaction_whenInvalidFlag(t *testing.T) {
  318. assert := assert.New(t)
  319. privateTxArgs.PrivacyFlag = 4
  320. _, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  321. assert.Error(err, "invalid privacyFlag")
  322. }
  323. func TestHandlePrivateTransaction_whenPrivateFromDoesNotMatchPrivateState(t *testing.T) {
  324. assert := assert.New(t)
  325. mockCtrl := gomock.NewController(t)
  326. defer mockCtrl.Finish()
  327. mockpsm := mps.NewMockPrivateStateManager(mockCtrl)
  328. mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(mps.NewPrivateStateMetadata("PS1", "PS1", "", mps.Resident, []string{"some address"}), nil).AnyTimes()
  329. _, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &MPSStubBackend{psmr: mockpsm}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  330. assert.Error(err, "The PrivateFrom (arbitrary private from) address does not match the specified private state (PS1) ")
  331. }
  332. func TestHandlePrivateTransaction_whenPrivateFromMatchesPrivateState(t *testing.T) {
  333. assert := assert.New(t)
  334. mockCtrl := gomock.NewController(t)
  335. defer mockCtrl.Finish()
  336. mockpsm := mps.NewMockPrivateStateManager(mockCtrl)
  337. mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(mps.NewPrivateStateMetadata("PS1", "PS1", "", mps.Resident, []string{"some address"}), nil).AnyTimes()
  338. // empty data field means that checkAndHandlePrivateTransaction exits without doing handlePrivateTransaction
  339. emptyTx := types.NewContractCreation(
  340. 0,
  341. big.NewInt(0),
  342. hexutil.MustDecodeUint64("0x47b760"),
  343. big.NewInt(0),
  344. nil)
  345. mpsTxArgs := &PrivateTxArgs{
  346. PrivateFrom: "some address",
  347. PrivateFor: []string{"arbitrary party 1", "arbitrary party 2"},
  348. }
  349. _, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &MPSStubBackend{psmr: mockpsm}, emptyTx, mpsTxArgs, arbitraryFrom, NormalTransaction)
  350. assert.Nil(err)
  351. }
  352. func TestHandlePrivateTransaction_withPartyProtectionTxAndPrivacyEnhancementsIsDisabled(t *testing.T) {
  353. assert := assert.New(t)
  354. privateTxArgs.PrivacyFlag = 1
  355. params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil
  356. defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }()
  357. _, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  358. assert.Error(err, "PrivacyEnhancements are disabled. Can only accept transactions with PrivacyFlag=0(StandardPrivate).")
  359. }
  360. func TestHandlePrivateTransaction_whenStandardPrivateCreation(t *testing.T) {
  361. assert := assert.New(t)
  362. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  363. isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  364. if err != nil {
  365. t.Fatalf("%s", err)
  366. }
  367. assert.True(isPrivate, "must be a private transaction")
  368. }
  369. func TestHandlePrivateTransaction_whenStandardPrivateCallingContractThatIsNotAvailableLocally(t *testing.T) {
  370. assert := assert.New(t)
  371. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  372. isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  373. assert.NoError(err, "no error expected")
  374. assert.True(isPrivate, "must be a private transaction")
  375. }
  376. func TestHandlePrivateTransaction_whenPartyProtectionCallingContractThatIsNotAvailableLocally(t *testing.T) {
  377. assert := assert.New(t)
  378. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  379. isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  380. assert.Error(err, "handle invalid message call")
  381. assert.True(isPrivate, "must be a private transaction")
  382. }
  383. func TestHandlePrivateTransaction_whenPartyProtectionCallingStandardPrivate(t *testing.T) {
  384. assert := assert.New(t)
  385. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  386. isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  387. assert.Error(err, "handle invalid message call")
  388. assert.True(isPrivate, "must be a private transaction")
  389. }
  390. func TestHandlePrivateTransaction_whenRawStandardPrivateCreation(t *testing.T) {
  391. assert := assert.New(t)
  392. private.P = &StubPrivateTransactionManager{creation: true}
  393. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  394. isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawSimpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, RawTransaction)
  395. assert.NoError(err, "raw standard private creation succeeded")
  396. assert.True(isPrivate, "must be a private transaction")
  397. }
  398. func TestHandlePrivateTransaction_whenRawStandardPrivateMessageCall(t *testing.T) {
  399. assert := assert.New(t)
  400. private.P = &StubPrivateTransactionManager{creation: false}
  401. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  402. _, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawStandardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, RawTransaction)
  403. assert.NoError(err, "raw standard private msg call succeeded")
  404. }
  405. func TestHandlePrivateTransaction_whenMandatoryRecipients(t *testing.T) {
  406. assert := assert.New(t)
  407. mockCtrl := gomock.NewController(t)
  408. defer mockCtrl.Finish()
  409. mockTM := private.NewMockPrivateTransactionManager(mockCtrl)
  410. saved := private.P
  411. defer func() {
  412. private.P = saved
  413. privateTxArgs.MandatoryRecipients = nil
  414. }()
  415. private.P = mockTM
  416. privateTxArgs.MandatoryRecipients = arbitraryMandatoryFor
  417. privateTxArgs.PrivacyFlag = engine.PrivacyFlagMandatoryRecipients
  418. var capturedMetadata engine.ExtraMetadata
  419. mockTM.EXPECT().Send(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
  420. Do(func(arg1 interface{}, arg2 string, arg3 interface{}, arg4 *engine.ExtraMetadata) {
  421. capturedMetadata = *arg4
  422. }).Times(1)
  423. _, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  424. assert.NoError(err)
  425. assert.Equal(engine.PrivacyFlagMandatoryRecipients, capturedMetadata.PrivacyFlag)
  426. assert.Equal(arbitraryMandatoryFor, capturedMetadata.MandatoryRecipients)
  427. }
  428. func TestHandlePrivateTransaction_whenRawPrivateWithMandatoryRecipients(t *testing.T) {
  429. assert := assert.New(t)
  430. mockCtrl := gomock.NewController(t)
  431. defer mockCtrl.Finish()
  432. mockTM := private.NewMockPrivateTransactionManager(mockCtrl)
  433. saved := private.P
  434. defer func() {
  435. private.P = saved
  436. privateTxArgs.MandatoryRecipients = nil
  437. }()
  438. private.P = mockTM
  439. privateTxArgs.MandatoryRecipients = arbitraryMandatoryFor
  440. privateTxArgs.PrivacyFlag = engine.PrivacyFlagMandatoryRecipients
  441. var capturedMetadata engine.ExtraMetadata
  442. mockTM.EXPECT().ReceiveRaw(gomock.Any()).Times(1)
  443. mockTM.EXPECT().SendSignedTx(gomock.Any(), gomock.Any(), gomock.Any()).
  444. Do(func(arg1 interface{}, arg2 []string, arg3 *engine.ExtraMetadata) {
  445. capturedMetadata = *arg3
  446. }).Times(1)
  447. _, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, RawTransaction)
  448. assert.NoError(err)
  449. assert.Equal(engine.PrivacyFlagMandatoryRecipients, capturedMetadata.PrivacyFlag)
  450. assert.Equal(arbitraryMandatoryFor, capturedMetadata.MandatoryRecipients)
  451. }
  452. func TestHandlePrivateTransaction_whenMandatoryRecipientsDataInvalid(t *testing.T) {
  453. assert := assert.New(t)
  454. privateTxArgs.PrivacyFlag = engine.PrivacyFlagMandatoryRecipients
  455. _, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  456. assert.Error(err, "missing mandatory recipients data. if no mandatory recipients required consider using PrivacyFlag=1(PartyProtection)")
  457. }
  458. func TestHandlePrivateTransaction_whenNoMandatoryRecipientsData(t *testing.T) {
  459. assert := assert.New(t)
  460. privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
  461. defer func() {
  462. privateTxArgs.MandatoryRecipients = nil
  463. }()
  464. privateTxArgs.MandatoryRecipients = arbitraryMandatoryFor
  465. _, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
  466. assert.Error(err, "privacy metadata invalid. mandatory recipients are only applicable for PrivacyFlag=2(MandatoryRecipients)")
  467. }
  468. func TestGetContractPrivacyMetadata(t *testing.T) {
  469. assert := assert.New(t)
  470. keystore, _, _ := createKeystore(t)
  471. stbBackend := &StubBackend{}
  472. stbBackend.multitenancySupported = false
  473. stbBackend.isPrivacyMarkerTransactionCreationEnabled = false
  474. stbBackend.ks = keystore
  475. stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
  476. stbBackend.poolNonce = 999
  477. public := NewPublicTransactionPoolAPI(stbBackend, nil)
  478. privacyMetadata, _ := public.GetContractPrivacyMetadata(arbitraryCtx, arbitrarySimpleStorageContractAddress)
  479. assert.Equal(engine.PrivacyFlagPartyProtection, privacyMetadata.PrivacyFlag)
  480. assert.Equal(arbitrarySimpleStorageContractEncryptedPayloadHash, privacyMetadata.CreationTxHash)
  481. assert.Equal(0, len(privacyMetadata.MandatoryRecipients))
  482. }
  483. func TestGetContractPrivacyMetadataWhenMandatoryRecipients(t *testing.T) {
  484. assert := assert.New(t)
  485. keystore, _, _ := createKeystore(t)
  486. stbBackend := &StubBackend{}
  487. stbBackend.multitenancySupported = false
  488. stbBackend.isPrivacyMarkerTransactionCreationEnabled = false
  489. stbBackend.ks = keystore
  490. stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
  491. stbBackend.poolNonce = 999
  492. public := NewPublicTransactionPoolAPI(stbBackend, nil)
  493. mockCtrl := gomock.NewController(t)
  494. defer mockCtrl.Finish()
  495. mockTM := private.NewMockPrivateTransactionManager(mockCtrl)
  496. saved := private.P
  497. defer func() {
  498. private.P = saved
  499. }()
  500. private.P = mockTM
  501. var capturedTxHash common.EncryptedPayloadHash
  502. mockTM.EXPECT().GetMandatory(gomock.Any()).
  503. DoAndReturn(func(arg1 common.EncryptedPayloadHash) ([]string, error) {
  504. capturedTxHash = arg1
  505. return arbitraryMandatoryFor, nil
  506. }).Times(1)
  507. privacyMetadata, _ := public.GetContractPrivacyMetadata(arbitraryCtx, arbitraryMandatoryRecipientsSimpleStorageContractAddress)
  508. assert.Equal(arbitraryMandatoryRecipientsContractEncryptedPayloadHash, capturedTxHash)
  509. assert.Equal(engine.PrivacyFlagMandatoryRecipients, privacyMetadata.PrivacyFlag)
  510. assert.Equal(arbitraryMandatoryRecipientsContractEncryptedPayloadHash, privacyMetadata.CreationTxHash)
  511. assert.Equal(arbitraryMandatoryFor, privacyMetadata.MandatoryRecipients)
  512. }
  513. func TestSubmitPrivateTransaction(t *testing.T) {
  514. assert := assert.New(t)
  515. keystore, fromAcct, toAcct := createKeystore(t)
  516. stbBackend := &StubBackend{}
  517. stbBackend.multitenancySupported = false
  518. stbBackend.isPrivacyMarkerTransactionCreationEnabled = false
  519. stbBackend.ks = keystore
  520. stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
  521. stbBackend.poolNonce = 999
  522. privateAccountAPI := NewPrivateAccountAPI(stbBackend, nil)
  523. gas := hexutil.Uint64(999999)
  524. nonce := hexutil.Uint64(123)
  525. payload := hexutil.Bytes(([]byte("0x43d3e767000000000000000000000000000000000000000000000000000000000000000a"))[:])
  526. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  527. txArgs := SendTxArgs{PrivateTxArgs: *privateTxArgs, From: fromAcct.Address, To: &toAcct.Address, Gas: &gas, Nonce: &nonce, Data: &payload}
  528. _, err := privateAccountAPI.SendTransaction(arbitraryCtx, txArgs, "")
  529. assert.NoError(err)
  530. assert.True(stbBackend.sendTxCalled, "transaction was not sent")
  531. assert.True(stbBackend.txThatWasSent.IsPrivate(), "must be a private transaction")
  532. assert.Equal(fromAcct.Address, stbBackend.txThatWasSent.From(), "incorrect 'From' address on transaction")
  533. assert.Equal(toAcct.Address, *stbBackend.txThatWasSent.To(), "incorrect 'To' address on transaction")
  534. assert.Equal(uint64(123), stbBackend.txThatWasSent.Nonce(), "incorrect nonce on transaction")
  535. }
  536. func TestSubmitPrivateTransactionWithPrivacyMarkerEnabled(t *testing.T) {
  537. assert := assert.New(t)
  538. keystore, fromAcct, toAcct := createKeystore(t)
  539. params.QuorumTestChainConfig.PrivacyPrecompileBlock = big.NewInt(0)
  540. defer func() { params.QuorumTestChainConfig.PrivacyPrecompileBlock = nil }()
  541. stbBackend := &StubBackend{}
  542. stbBackend.multitenancySupported = false
  543. stbBackend.isPrivacyMarkerTransactionCreationEnabled = true
  544. stbBackend.ks = keystore
  545. stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
  546. privateAccountAPI := NewPrivateAccountAPI(stbBackend, nil)
  547. gas := hexutil.Uint64(999999)
  548. nonce := hexutil.Uint64(123)
  549. payload := hexutil.Bytes(([]byte("0x43d3e767000000000000000000000000000000000000000000000000000000000000000a"))[:])
  550. privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
  551. txArgs := SendTxArgs{PrivateTxArgs: *privateTxArgs, From: fromAcct.Address, To: &toAcct.Address, Gas: &gas, Nonce: &nonce, Data: &payload}
  552. _, err := privateAccountAPI.SendTransaction(arbitraryCtx, txArgs, "")
  553. assert.NoError(err)
  554. assert.True(stbBackend.sendTxCalled, "transaction was not sent")
  555. assert.False(stbBackend.txThatWasSent.IsPrivate(), "transaction was private, instead of privacy marker transaction (public)")
  556. assert.Equal(fromAcct.Address, stbBackend.txThatWasSent.From(), "expected privacy marker transaction to have same 'from' address as internal private tx")
  557. assert.Equal(common.QuorumPrivacyPrecompileContractAddress(), *stbBackend.txThatWasSent.To(), "transaction 'To' address should be privacy marker precompile")
  558. assert.Equal(uint64(nonce), stbBackend.txThatWasSent.Nonce(), "incorrect nonce on transaction")
  559. assert.NotEqual(hexutil.Uint64(stbBackend.txThatWasSent.Gas()), gas, "privacy marker transaction should not have same gas value as internal private tx")
  560. }
  561. func TestSetRawTransactionPrivateFrom(t *testing.T) {
  562. somePTMAddr := "some-ptm-addr"
  563. psiID := types.PrivateStateIdentifier("myPSI")
  564. mpsPTMAddrs := []string{somePTMAddr}
  565. tests := []struct {
  566. name string
  567. receiveRawPrivateFrom string
  568. argsPrivateFrom string
  569. wantPrivateFrom string
  570. }{
  571. {
  572. name: "receiveRawPrivateFromIfNoArgPrivateFrom",
  573. receiveRawPrivateFrom: somePTMAddr,
  574. argsPrivateFrom: "",
  575. wantPrivateFrom: somePTMAddr,
  576. },
  577. {
  578. name: "argPrivateFromOnly",
  579. receiveRawPrivateFrom: "",
  580. argsPrivateFrom: somePTMAddr,
  581. wantPrivateFrom: somePTMAddr,
  582. },
  583. {
  584. name: "equalArgAndReceiveRawPrivateFrom",
  585. receiveRawPrivateFrom: somePTMAddr,
  586. argsPrivateFrom: somePTMAddr,
  587. wantPrivateFrom: somePTMAddr,
  588. },
  589. }
  590. for _, tt := range tests {
  591. t.Run(tt.name, func(t *testing.T) {
  592. ctrl := gomock.NewController(t)
  593. defer ctrl.Finish()
  594. savedPTM := private.P
  595. defer func() { private.P = savedPTM }()
  596. mockPTM := private.NewMockPrivateTransactionManager(ctrl)
  597. mockPTM.EXPECT().ReceiveRaw(gomock.Any()).Return(nil, somePTMAddr, nil, nil).Times(1)
  598. private.P = mockPTM
  599. psm := mps.NewPrivateStateMetadata(psiID, "", "", 0, mpsPTMAddrs)
  600. mockPSMR := mps.NewMockPrivateStateMetadataResolver(ctrl)
  601. mockPSMR.EXPECT().ResolveForUserContext(gomock.Any()).Return(psm, nil).Times(1)
  602. b := &MPSStubBackend{
  603. psmr: mockPSMR,
  604. }
  605. tx := types.NewTransaction(0, common.Address{}, nil, 0, nil, []byte("ptm-hash"))
  606. args := &PrivateTxArgs{
  607. PrivateFor: []string{"some-ptm-recipient"},
  608. PrivateFrom: tt.argsPrivateFrom,
  609. }
  610. err := args.SetRawTransactionPrivateFrom(context.Background(), b, tx)
  611. require.NoError(t, err)
  612. require.Equal(t, tt.wantPrivateFrom, args.PrivateFrom)
  613. })
  614. }
  615. }
  616. func TestSetRawTransactionPrivateFrom_DifferentArgPrivateFromAndReceiveRawPrivateFrom(t *testing.T) {
  617. ctrl := gomock.NewController(t)
  618. defer ctrl.Finish()
  619. savedPTM := private.P
  620. defer func() { private.P = savedPTM }()
  621. receiveRawPrivateFrom := "some-ptm-addr"
  622. argsPrivateFrom := "other-ptm-addr"
  623. mockPTM := private.NewMockPrivateTransactionManager(ctrl)
  624. mockPTM.EXPECT().ReceiveRaw(gomock.Any()).Return(nil, receiveRawPrivateFrom, nil, nil).Times(1)
  625. private.P = mockPTM
  626. b := &MPSStubBackend{}
  627. tx := types.NewTransaction(0, common.Address{}, nil, 0, nil, []byte("ptm-hash"))
  628. args := &PrivateTxArgs{
  629. PrivateFor: []string{"some-ptm-recipient"},
  630. PrivateFrom: argsPrivateFrom,
  631. }
  632. err := args.SetRawTransactionPrivateFrom(context.Background(), b, tx)
  633. require.EqualError(t, err, "The PrivateFrom address retrieved from the privacy manager does not match private PrivateFrom (other-ptm-addr) specified in transaction arguments.")
  634. }
  635. func TestSetRawTransactionPrivateFrom_ResolvePrivateFromIsNotMPSTenantAddr(t *testing.T) {
  636. ctrl := gomock.NewController(t)
  637. defer ctrl.Finish()
  638. savedPTM := private.P
  639. defer func() { private.P = savedPTM }()
  640. receiveRawPrivateFrom := "some-ptm-addr"
  641. psiID := types.PrivateStateIdentifier("myPSI")
  642. mpsPTMAddrs := []string{"other-ptm-addr"}
  643. mockPTM := private.NewMockPrivateTransactionManager(ctrl)
  644. mockPTM.EXPECT().ReceiveRaw(gomock.Any()).Return(nil, receiveRawPrivateFrom, nil, nil).Times(1)
  645. private.P = mockPTM
  646. psm := mps.NewPrivateStateMetadata(psiID, "", "", 0, mpsPTMAddrs)
  647. mockPSMR := mps.NewMockPrivateStateMetadataResolver(ctrl)
  648. mockPSMR.EXPECT().ResolveForUserContext(gomock.Any()).Return(psm, nil).Times(1)
  649. b := &MPSStubBackend{
  650. psmr: mockPSMR,
  651. }
  652. tx := types.NewTransaction(0, common.Address{}, nil, 0, nil, []byte("ptm-hash"))
  653. args := &PrivateTxArgs{
  654. PrivateFor: []string{"some-ptm-recipient"},
  655. }
  656. err := args.SetRawTransactionPrivateFrom(context.Background(), b, tx)
  657. require.EqualError(t, err, "The PrivateFrom address does not match the specified private state (myPSI)")
  658. }
  659. func createKeystore(t *testing.T) (*keystore.KeyStore, accounts.Account, accounts.Account) {
  660. assert := assert.New(t)
  661. keystore := keystore.NewKeyStore(filepath.Join(workdir, "keystore"), keystore.StandardScryptN, keystore.StandardScryptP)
  662. fromAcct, err := keystore.NewAccount("")
  663. assert.NoError(err)
  664. toAcct, err := keystore.NewAccount("")
  665. assert.NoError(err)
  666. return keystore, fromAcct, toAcct
  667. }
  668. type StubBackend struct {
  669. getEVMCalled bool
  670. sendTxCalled bool
  671. txThatWasSent *types.Transaction
  672. mockAccountExtraDataStateGetter *vm.MockAccountExtraDataStateGetter
  673. multitenancySupported bool
  674. isPrivacyMarkerTransactionCreationEnabled bool
  675. accountManager *accounts.Manager
  676. ks *keystore.KeyStore
  677. poolNonce uint64
  678. allowUnprotectedTxs bool
  679. IstanbulBlock *big.Int
  680. CurrentHeadNumber *big.Int
  681. }
  682. var _ Backend = &StubBackend{}
  683. func (sb *StubBackend) UnprotectedAllowed() bool {
  684. return sb.allowUnprotectedTxs
  685. }
  686. func (sb *StubBackend) CurrentHeader() *types.Header {
  687. return &types.Header{Number: sb.CurrentHeadNumber}
  688. }
  689. func (sb *StubBackend) Engine() consensus.Engine {
  690. panic("implement me")
  691. }
  692. func (sb *StubBackend) SupportsMultitenancy(rpcCtx context.Context) (*proto.PreAuthenticatedAuthenticationToken, bool) {
  693. return nil, false
  694. }
  695. func (sb *StubBackend) AccountExtraDataStateGetterByNumber(context.Context, rpc.BlockNumber) (vm.AccountExtraDataStateGetter, error) {
  696. return sb.mockAccountExtraDataStateGetter, nil
  697. }
  698. func (sb *StubBackend) IsAuthorized(authToken *proto.PreAuthenticatedAuthenticationToken, attributes ...*multitenancy.PrivateStateSecurityAttribute) (bool, error) {
  699. panic("implement me")
  700. }
  701. func (sb *StubBackend) GetEVM(ctx context.Context, msg core.Message, state vm.MinimalApiState, header *types.Header, vmconfig *vm.Config) (*vm.EVM, func() error, error) {
  702. sb.getEVMCalled = true
  703. vmCtx := core.NewEVMBlockContext(&types.Header{
  704. Coinbase: arbitraryFrom,
  705. Number: arbitraryCurrentBlockNumber,
  706. Time: 0,
  707. Difficulty: big.NewInt(0),
  708. GasLimit: 0,
  709. }, nil, &arbitraryFrom)
  710. txCtx := core.NewEVMTxContext(msg)
  711. vmError := func() error {
  712. return nil
  713. }
  714. config := params.QuorumTestChainConfig
  715. config.IstanbulBlock = sb.IstanbulBlock
  716. return vm.NewEVM(vmCtx, txCtx, publicStateDB, privateStateDB, config, vm.Config{}), vmError, nil
  717. }
  718. func (sb *StubBackend) CurrentBlock() *types.Block {
  719. return types.NewBlock(&types.Header{
  720. Number: arbitraryCurrentBlockNumber,
  721. }, nil, nil, nil, new(trie.Trie))
  722. }
  723. func (sb *StubBackend) Downloader() *downloader.Downloader {
  724. panic("implement me")
  725. }
  726. func (sb *StubBackend) ProtocolVersion() int {
  727. panic("implement me")
  728. }
  729. func (sb *StubBackend) SuggestPrice(ctx context.Context) (*big.Int, error) {
  730. return big.NewInt(0), nil
  731. }
  732. func (sb *StubBackend) ChainDb() ethdb.Database {
  733. panic("implement me")
  734. }
  735. func (sb *StubBackend) EventMux() *event.TypeMux {
  736. panic("implement me")
  737. }
  738. func (sb *StubBackend) Wallets() []accounts.Wallet {
  739. return sb.ks.Wallets()
  740. }
  741. func (sb *StubBackend) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription {
  742. return nil
  743. }
  744. func (sb *StubBackend) AccountManager() *accounts.Manager {
  745. return sb.accountManager
  746. }
  747. func (sb *StubBackend) ExtRPCEnabled() bool {
  748. panic("implement me")
  749. }
  750. func (sb *StubBackend) CallTimeOut() time.Duration {
  751. panic("implement me")
  752. }
  753. func (sb *StubBackend) RPCTxFeeCap() float64 {
  754. return 25000000
  755. }
  756. func (sb *StubBackend) RPCGasCap() uint64 {
  757. return 25000000
  758. }
  759. func (sb *StubBackend) SetHead(number uint64) {
  760. panic("implement me")
  761. }
  762. func (sb *StubBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) {
  763. panic("implement me")
  764. }
  765. func (sb *StubBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
  766. panic("implement me")
  767. }
  768. func (sb *StubBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) {
  769. panic("implement me")
  770. }
  771. func (sb *StubBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {
  772. panic("implement me")
  773. }
  774. func (sb *StubBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
  775. panic("implement me")
  776. }
  777. func (sb *StubBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) {
  778. return sb.CurrentBlock(), nil
  779. }
  780. func (sb *StubBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (vm.MinimalApiState, *types.Header, error) {
  781. return &StubMinimalApiState{}, nil, nil
  782. }
  783. func (sb *StubBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (vm.MinimalApiState, *types.Header, error) {
  784. return &StubMinimalApiState{}, nil, nil
  785. }
  786. func (sb *StubBackend) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) {
  787. panic("implement me")
  788. }
  789. func (sb *StubBackend) GetTd(ctx context.Context, hash common.Hash) *big.Int {
  790. panic("implement me")
  791. }
  792. func (sb *StubBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {
  793. panic("implement me")
  794. }
  795. func (sb *StubBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription {
  796. panic("implement me")
  797. }
  798. func (sb *StubBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription {
  799. panic("implement me")
  800. }
  801. func (sb *StubBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error {
  802. sb.sendTxCalled = true
  803. sb.txThatWasSent = signedTx
  804. return nil
  805. }
  806. func (sb *StubBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) {
  807. panic("implement me")
  808. }
  809. func (sb *StubBackend) GetPoolTransactions() (types.Transactions, error) {
  810. panic("implement me")
  811. }
  812. func (sb *StubBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction {
  813. panic("implement me")
  814. }
  815. func (sb *StubBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) {
  816. return sb.poolNonce, nil
  817. }
  818. func (sb *StubBackend) Stats() (pending int, queued int) {
  819. panic("implement me")
  820. }
  821. func (sb *StubBackend) TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) {
  822. panic("implement me")
  823. }
  824. func (sb *StubBackend) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription {
  825. panic("implement me")
  826. }
  827. func (sb *StubBackend) BloomStatus() (uint64, uint64) {
  828. panic("implement me")
  829. }
  830. func (sb *StubBackend) GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) {
  831. panic("implement me")
  832. }
  833. func (sb *StubBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) {
  834. panic("implement me")
  835. }
  836. func (sb *StubBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {
  837. panic("implement me")
  838. }
  839. func (sb *StubBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
  840. panic("implement me")
  841. }
  842. func (sb *StubBackend) ChainConfig() *params.ChainConfig {
  843. return params.QuorumTestChainConfig
  844. }
  845. func (sb *StubBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription {
  846. panic("implement me")
  847. }
  848. func (sb *StubBackend) PSMR() mps.PrivateStateMetadataResolver {
  849. panic("implement me")
  850. }
  851. type MPSStubBackend struct {
  852. StubBackend
  853. psmr mps.PrivateStateMetadataResolver
  854. }
  855. func (msb *MPSStubBackend) ChainConfig() *params.ChainConfig {
  856. return params.QuorumMPSTestChainConfig
  857. }
  858. func (sb *MPSStubBackend) PSMR() mps.PrivateStateMetadataResolver {
  859. return sb.psmr
  860. }
  861. func (sb *StubBackend) IsPrivacyMarkerTransactionCreationEnabled() bool {
  862. return sb.isPrivacyMarkerTransactionCreationEnabled
  863. }
  864. type StubMinimalApiState struct {
  865. }
  866. func (StubMinimalApiState) GetBalance(addr common.Address) *big.Int {
  867. panic("implement me")
  868. }
  869. func (StubMinimalApiState) SetBalance(addr common.Address, balance *big.Int) {
  870. panic("implement me")
  871. }
  872. func (StubMinimalApiState) GetCode(addr common.Address) []byte {
  873. return nil
  874. }
  875. func (StubMinimalApiState) GetState(a common.Address, b common.Hash) common.Hash {
  876. panic("implement me")
  877. }
  878. func (StubMinimalApiState) GetNonce(addr common.Address) uint64 {
  879. panic("implement me")
  880. }
  881. func (StubMinimalApiState) SetNonce(addr common.Address, nonce uint64) {
  882. panic("implement me")
  883. }
  884. func (StubMinimalApiState) SetCode(common.Address, []byte) {
  885. panic("implement me")
  886. }
  887. func (StubMinimalApiState) GetPrivacyMetadata(addr common.Address) (*state.PrivacyMetadata, error) {
  888. if addr == arbitraryMandatoryRecipientsSimpleStorageContractAddress {
  889. return &state.PrivacyMetadata{
  890. CreationTxHash: arbitraryMandatoryRecipientsContractEncryptedPayloadHash,
  891. PrivacyFlag: 2,
  892. }, nil
  893. }
  894. return &state.PrivacyMetadata{
  895. CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  896. PrivacyFlag: 1,
  897. }, nil
  898. }
  899. func (StubMinimalApiState) GetManagedParties(addr common.Address) ([]string, error) {
  900. panic("implement me")
  901. }
  902. func (StubMinimalApiState) GetRLPEncodedStateObject(addr common.Address) ([]byte, error) {
  903. panic("implement me")
  904. }
  905. func (StubMinimalApiState) GetProof(common.Address) ([][]byte, error) {
  906. panic("implement me")
  907. }
  908. func (StubMinimalApiState) GetStorageProof(common.Address, common.Hash) ([][]byte, error) {
  909. panic("implement me")
  910. }
  911. func (StubMinimalApiState) StorageTrie(addr common.Address) state.Trie {
  912. panic("implement me")
  913. }
  914. func (StubMinimalApiState) Error() error {
  915. panic("implement me")
  916. }
  917. func (StubMinimalApiState) GetCodeHash(common.Address) common.Hash {
  918. panic("implement me")
  919. }
  920. func (StubMinimalApiState) SetState(common.Address, common.Hash, common.Hash) {
  921. panic("implement me")
  922. }
  923. func (StubMinimalApiState) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) {
  924. panic("implement me")
  925. }
  926. type StubPrivateTransactionManager struct {
  927. notinuse.PrivateTransactionManager
  928. creation bool
  929. }
  930. func (sptm *StubPrivateTransactionManager) Send(data []byte, from string, to []string, extra *engine.ExtraMetadata) (string, []string, common.EncryptedPayloadHash, error) {
  931. return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash, nil
  932. }
  933. func (sptm *StubPrivateTransactionManager) EncryptPayload(data []byte, from string, to []string, extra *engine.ExtraMetadata) ([]byte, error) {
  934. return nil, engine.ErrPrivateTxManagerNotSupported
  935. }
  936. func (sptm *StubPrivateTransactionManager) DecryptPayload(payload common.DecryptRequest) ([]byte, *engine.ExtraMetadata, error) {
  937. return nil, nil, engine.ErrPrivateTxManagerNotSupported
  938. }
  939. func (sptm *StubPrivateTransactionManager) StoreRaw(data []byte, from string) (common.EncryptedPayloadHash, error) {
  940. return arbitrarySimpleStorageContractEncryptedPayloadHash, nil
  941. }
  942. func (sptm *StubPrivateTransactionManager) SendSignedTx(data common.EncryptedPayloadHash, to []string, extra *engine.ExtraMetadata) (string, []string, []byte, error) {
  943. return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes(), nil
  944. }
  945. func (sptm *StubPrivateTransactionManager) ReceiveRaw(data common.EncryptedPayloadHash) ([]byte, string, *engine.ExtraMetadata, error) {
  946. if sptm.creation {
  947. return hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"), "", nil, nil
  948. } else {
  949. return hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"), "", nil, nil
  950. }
  951. }
  952. func (sptm *StubPrivateTransactionManager) HasFeature(f engine.PrivateTransactionManagerFeature) bool {
  953. return true
  954. }