state_transition_test.go 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370
  1. package core
  2. import (
  3. "fmt"
  4. "math/big"
  5. "os"
  6. "strings"
  7. "testing"
  8. "time"
  9. "github.com/ethereum/go-ethereum/accounts/abi"
  10. "github.com/ethereum/go-ethereum/common"
  11. "github.com/ethereum/go-ethereum/common/math"
  12. "github.com/ethereum/go-ethereum/core/rawdb"
  13. "github.com/ethereum/go-ethereum/core/state"
  14. "github.com/ethereum/go-ethereum/core/types"
  15. "github.com/ethereum/go-ethereum/core/vm"
  16. "github.com/ethereum/go-ethereum/crypto"
  17. "github.com/ethereum/go-ethereum/log"
  18. "github.com/ethereum/go-ethereum/params"
  19. "github.com/ethereum/go-ethereum/private"
  20. "github.com/ethereum/go-ethereum/private/engine"
  21. "github.com/ethereum/go-ethereum/private/engine/notinuse"
  22. "github.com/ethereum/go-ethereum/rlp"
  23. "github.com/ethereum/go-ethereum/trie"
  24. testifyassert "github.com/stretchr/testify/assert"
  25. )
  26. var (
  27. c1 = &contract{
  28. name: "c1",
  29. abi: mustParse(c1AbiDefinition),
  30. bytecode: common.Hex2Bytes("608060405234801561001057600080fd5b506040516020806105a88339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610550806100586000396000f3fe608060405260043610610051576000357c01000000000000000000000000000000000000000000000000000000009004806360fe47b1146100565780636d4ce63c146100a5578063d7139463146100d0575b600080fd5b34801561006257600080fd5b5061008f6004803603602081101561007957600080fd5b810190808035906020019092919050505061010b565b6040518082815260200191505060405180910390f35b3480156100b157600080fd5b506100ba61011e565b6040518082815260200191505060405180910390f35b3480156100dc57600080fd5b50610109600480360360208110156100f357600080fd5b8101908080359060200190929190505050610127565b005b6000816000819055506000549050919050565b60008054905090565b600030610132610212565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015610184573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156101f657600080fd5b505af115801561020a573d6000803e3d6000fd5b505050505050565b604051610302806102238339019056fe608060405234801561001057600080fd5b506040516020806103028339810180604052602081101561003057600080fd5b8101908080519060200190929190505050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610271806100916000396000f3fe608060405260043610610046576000357c01000000000000000000000000000000000000000000000000000000009004806360fe47b11461004b5780636d4ce63c14610086575b600080fd5b34801561005757600080fd5b506100846004803603602081101561006e57600080fd5b81019080803590602001909291905050506100b1565b005b34801561009257600080fd5b5061009b610180565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360fe47b1826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561014157600080fd5b505af1158015610155573d6000803e3d6000fd5b505050506040513d602081101561016b57600080fd5b81019080805190602001909291905050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d4ce63c6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561020557600080fd5b505afa158015610219573d6000803e3d6000fd5b505050506040513d602081101561022f57600080fd5b810190808051906020019092919050505090509056fea165627a7a72305820a537f4c360ce5c6f55523298e314e6456e5c3e02c170563751dfda37d3aeddb30029a165627a7a7230582060396bfff29d2dfc5a9f4216bfba5e24d031d54fd4b26ebebde1a26c59df0c1e0029"),
  31. }
  32. c2 = &contract{
  33. name: "c2",
  34. abi: mustParse(c2AbiDefinition),
  35. bytecode: common.Hex2Bytes("608060405234801561001057600080fd5b506040516020806102f58339810180604052602081101561003057600080fd5b8101908080519060200190929190505050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610264806100916000396000f3fe608060405234801561001057600080fd5b5060043610610053576000357c01000000000000000000000000000000000000000000000000000000009004806360fe47b1146100585780636d4ce63c14610086575b600080fd5b6100846004803603602081101561006e57600080fd5b81019080803590602001909291905050506100a4565b005b61008e610173565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360fe47b1826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561013457600080fd5b505af1158015610148573d6000803e3d6000fd5b505050506040513d602081101561015e57600080fd5b81019080805190602001909291905050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d4ce63c6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156101f857600080fd5b505afa15801561020c573d6000803e3d6000fd5b505050506040513d602081101561022257600080fd5b810190808051906020019092919050505090509056fea165627a7a72305820dd8a5dcf693e1969289c444a282d0684a9760bac26f1e4e0139d46821ec1979b0029"),
  36. }
  37. // exec hash helper vars (accounts/tries)
  38. signingAddress = common.StringToAddress("contract")
  39. c1AccAddress = crypto.CreateAddress(signingAddress, 0)
  40. c2AccAddress = crypto.CreateAddress(signingAddress, 1)
  41. // this is used as the field key in account storage (which is the index/sequence of the field in the contract)
  42. // both contracts have only one field (c1 - has the value while c2 has c1's address)
  43. // For more info please see: https://solidity.readthedocs.io/en/v0.6.8/internals/layout_in_storage.html
  44. firstFieldKey = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")
  45. val42 = common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000002A")
  46. val53 = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000035")
  47. valC1Address = append(common.Hex2Bytes("000000000000000000000000"), c1AccAddress.Bytes()...)
  48. // this is the contract storage trie after storing value 42
  49. c1StorageTrieWithValue42 = secureTrieWithStoredValue(firstFieldKey, val42)
  50. c1StorageTrieWithValue53 = secureTrieWithStoredValue(firstFieldKey, val53)
  51. c2StorageTrieWithC1Address = secureTrieWithStoredValue(firstFieldKey, valC1Address)
  52. // The contract bytecode above includes the constructor bytecode (which is removed by the EVM before storing the
  53. // contract bytecode) thus it can't be used to calculate the code hash for the contract.
  54. // Below we deploy both of them as public contracts and extract the resulting codeHashes from the public state.
  55. c1CodeHash, c2CodeHash = contractCodeHashes()
  56. c1AccountWithValue42Stored = &state.Account{Nonce: 1, Balance: big.NewInt(0), Root: c1StorageTrieWithValue42.Hash(), CodeHash: c1CodeHash.Bytes()}
  57. c1AccountWithValue53Stored = &state.Account{Nonce: 1, Balance: big.NewInt(0), Root: c1StorageTrieWithValue53.Hash(), CodeHash: c1CodeHash.Bytes()}
  58. c2AccountWithC1AddressStored = &state.Account{Nonce: 1, Balance: big.NewInt(0), Root: c2StorageTrieWithC1Address.Hash(), CodeHash: c2CodeHash.Bytes()}
  59. )
  60. type contract struct {
  61. abi abi.ABI
  62. bytecode []byte
  63. name string
  64. }
  65. func (c *contract) create(args ...interface{}) []byte {
  66. bytes, err := c.abi.Pack("", args...)
  67. if err != nil {
  68. panic("can't pack: " + err.Error())
  69. }
  70. return append(c.bytecode, bytes...)
  71. }
  72. func (c *contract) set(value int64) []byte {
  73. bytes, err := c.abi.Pack("set", big.NewInt(value))
  74. if err != nil {
  75. panic("can't pack: " + err.Error())
  76. }
  77. return bytes
  78. }
  79. func (c *contract) get() []byte {
  80. bytes, err := c.abi.Pack("get")
  81. if err != nil {
  82. panic("can't pack: " + err.Error())
  83. }
  84. return bytes
  85. }
  86. func init() {
  87. log.PrintOrigins(true)
  88. log.Root().SetHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(true)))
  89. }
  90. func secureTrieWithStoredValue(key []byte, value []byte) *trie.SecureTrie {
  91. res, _ := trie.NewSecure(common.Hash{}, trie.NewDatabase(rawdb.NewMemoryDatabase()))
  92. v, _ := rlp.EncodeToBytes(common.TrimLeftZeroes(value[:]))
  93. res.Update(key, v)
  94. return res
  95. }
  96. func contractCodeHashes() (c1CodeHash common.Hash, c2CodeHash common.Hash) {
  97. assert := testifyassert.New(nil)
  98. cfg := newConfig()
  99. // create public c1
  100. cfg.setData(c1.create(big.NewInt(42)))
  101. c1Address := createPublicContract(cfg, assert, c1)
  102. c1CodeHash = cfg.publicState.GetCodeHash(c1Address)
  103. // create public c2
  104. cfg.setNonce(1)
  105. cfg.setData(c2.create(c1Address))
  106. c2Address := createPublicContract(cfg, assert, c2)
  107. c2CodeHash = cfg.publicState.GetCodeHash(c2Address)
  108. return
  109. }
  110. func TestApplyMessage_Private_whenTypicalCreate_Success(t *testing.T) {
  111. originalP := private.P
  112. defer func() { private.P = originalP }()
  113. mockPM := newMockPrivateTransactionManager()
  114. private.P = mockPM
  115. assert := testifyassert.New(t)
  116. // calling C1.Create standard private
  117. cfg := newConfig().
  118. setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  119. setData([]byte("arbitrary encrypted payload hash"))
  120. gp := new(GasPool).AddGas(math.MaxUint64)
  121. privateMsg := newTypicalPrivateMessage(cfg)
  122. //since standard private create only get back PrivacyFlag
  123. mockPM.When("Receive").Return(c1.create(big.NewInt(42)), &engine.ExtraMetadata{
  124. PrivacyFlag: engine.PrivacyFlagStandardPrivate,
  125. }, nil)
  126. result, err := ApplyMessage(newEVM(cfg), privateMsg, gp)
  127. assert.NoError(err, "EVM execution")
  128. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  129. mockPM.Verify(assert)
  130. }
  131. func TestApplyMessage_Private_whenCreatePartyProtectionC1_Success(t *testing.T) {
  132. originalP := private.P
  133. defer func() { private.P = originalP }()
  134. mockPM := newMockPrivateTransactionManager()
  135. private.P = mockPM
  136. assert := testifyassert.New(t)
  137. // calling C1.Create party protection
  138. cfg := newConfig().
  139. setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  140. setData([]byte("arbitrary encrypted payload hash"))
  141. gp := new(GasPool).AddGas(math.MaxUint64)
  142. privateMsg := newTypicalPrivateMessage(cfg)
  143. //since party protection create only get back privacyFlag
  144. mockPM.When("Receive").Return(c1.create(big.NewInt(42)), &engine.ExtraMetadata{
  145. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  146. }, nil)
  147. result, err := ApplyMessage(newEVM(cfg), privateMsg, gp)
  148. assert.NoError(err, "EVM execution")
  149. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  150. mockPM.Verify(assert)
  151. }
  152. func TestApplyMessage_Private_whenCreatePartyProtectionC1WithPrivacyEnhancementsDisabledReturnsError(t *testing.T) {
  153. originalP := private.P
  154. defer func() { private.P = originalP }()
  155. mockPM := newMockPrivateTransactionManager()
  156. private.P = mockPM
  157. assert := testifyassert.New(t)
  158. // calling C1.Create party protection
  159. cfg := newConfig().
  160. setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  161. setData([]byte("arbitrary encrypted payload hash"))
  162. gp := new(GasPool).AddGas(math.MaxUint64)
  163. privateMsg := newTypicalPrivateMessage(cfg)
  164. //since party protection create only get back privacyFlag
  165. mockPM.When("Receive").Return(c1.create(big.NewInt(42)), &engine.ExtraMetadata{
  166. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  167. }, nil)
  168. evm := newEVM(cfg)
  169. evm.ChainConfig().PrivacyEnhancementsBlock = nil
  170. result, err := ApplyMessage(evm, privateMsg, gp)
  171. assert.Error(err, "EVM execution")
  172. assert.True(result.Failed(), "Transaction receipt status")
  173. // check that there is no privacy metadata for the newly created contract
  174. assert.Len(evm.CreatedContracts(), 0, "no contracts created")
  175. mockPM.Verify(assert)
  176. }
  177. func TestApplyMessage_Private_whenInteractWithPartyProtectionC1_Success(t *testing.T) {
  178. originalP := private.P
  179. defer func() { private.P = originalP }()
  180. mockPM := newMockPrivateTransactionManager()
  181. private.P = mockPM
  182. assert := testifyassert.New(t)
  183. cfg := newConfig()
  184. //create party protection c1
  185. c1EncPayloadHash := []byte("c1")
  186. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  187. setData(c1EncPayloadHash)
  188. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  189. // calling C1.Set() party protection
  190. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  191. setData([]byte("arbitrary enc payload hash")).
  192. setNonce(1).
  193. setTo(c1Address)
  194. privateMsg := newTypicalPrivateMessage(cfg)
  195. //since party protection need ACHashes and PrivacyFlag
  196. mockPM.When("Receive").Return(c1.set(53), &engine.ExtraMetadata{
  197. ACHashes: common.EncryptedPayloadHashes{
  198. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  199. },
  200. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  201. }, nil)
  202. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  203. assert.NoError(err, "EVM execution")
  204. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  205. mockPM.Verify(assert)
  206. }
  207. func TestApplyMessage_Private_whenInteractWithStateValidationC1_Success(t *testing.T) {
  208. originalP := private.P
  209. defer func() { private.P = originalP }()
  210. mockPM := newMockPrivateTransactionManager()
  211. private.P = mockPM
  212. assert := testifyassert.New(t)
  213. cfg := newConfig()
  214. //create state validation c1
  215. c1EncPayloadHash := []byte("c1")
  216. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  217. setData(c1EncPayloadHash)
  218. cfg.acMerkleRoot, _ = calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue42Stored})
  219. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  220. // calling C1.Set() state validation
  221. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  222. setData([]byte("arbitrary enc payload hash")).
  223. setNonce(1).
  224. setTo(c1Address)
  225. privateMsg := newTypicalPrivateMessage(cfg)
  226. mr, _ := calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue53Stored})
  227. //since state validation need ACHashes, MerkleRoot and PrivacyFlag
  228. mockPM.When("Receive").Return(c1.set(53), &engine.ExtraMetadata{
  229. ACHashes: common.EncryptedPayloadHashes{
  230. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  231. },
  232. PrivacyFlag: engine.PrivacyFlagStateValidation,
  233. ACMerkleRoot: mr,
  234. }, nil)
  235. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  236. assert.NoError(err, "EVM execution")
  237. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  238. mockPM.Verify(assert)
  239. }
  240. func TestApplyMessage_Private_whenInteractWithStateValidationC1WithEmptyMRFromTessera_Fail(t *testing.T) {
  241. originalP := private.P
  242. defer func() { private.P = originalP }()
  243. mockPM := newMockPrivateTransactionManager()
  244. private.P = mockPM
  245. assert := testifyassert.New(t)
  246. cfg := newConfig()
  247. // create state validation c1
  248. c1EncPayloadHash := []byte("c1")
  249. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  250. setData(c1EncPayloadHash)
  251. cfg.acMerkleRoot, _ = calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue42Stored})
  252. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  253. // calling C1.Set() state validation
  254. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  255. setData([]byte("arbitrary enc payload hash")).
  256. setNonce(1).
  257. setTo(c1Address)
  258. privateMsg := newTypicalPrivateMessage(cfg)
  259. // since state validation need ACHashes, privacyFlag, MerkleRoot
  260. mockPM.When("Receive").Return(c1.set(53), &engine.ExtraMetadata{
  261. ACHashes: common.EncryptedPayloadHashes{
  262. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  263. },
  264. PrivacyFlag: engine.PrivacyFlagStateValidation,
  265. ACMerkleRoot: common.Hash{},
  266. }, nil)
  267. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  268. assert.NoError(err, "EVM execution")
  269. assert.True(result.Failed(), "Transaction receipt status")
  270. mockPM.Verify(assert)
  271. }
  272. func TestApplyMessage_Private_whenInteractWithStateValidationC1WithWrongMRFromTessera_Fail(t *testing.T) {
  273. originalP := private.P
  274. defer func() { private.P = originalP }()
  275. mockPM := newMockPrivateTransactionManager()
  276. private.P = mockPM
  277. assert := testifyassert.New(t)
  278. cfg := newConfig()
  279. //create state validation c1
  280. c1EncPayloadHash := []byte("c1")
  281. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  282. setData(c1EncPayloadHash)
  283. cfg.acMerkleRoot, _ = calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue42Stored})
  284. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  285. // calling C1.Set() state validation
  286. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  287. setData([]byte("arbitrary enc payload hash")).
  288. setNonce(1).
  289. setTo(c1Address)
  290. privateMsg := newTypicalPrivateMessage(cfg)
  291. //since state validation need ACHashes, PrivacyFlag, MerkleRoot
  292. mockPM.When("Receive").Return(c1.set(53), &engine.ExtraMetadata{
  293. ACHashes: common.EncryptedPayloadHashes{
  294. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  295. },
  296. PrivacyFlag: engine.PrivacyFlagStateValidation,
  297. ACMerkleRoot: common.Hash{123},
  298. }, nil)
  299. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  300. assert.NoError(err, "EVM execution")
  301. assert.True(result.Failed(), "Transaction receipt status")
  302. mockPM.Verify(assert)
  303. }
  304. //Limitation of design --if don't send privacyFlag can't be guaranteed to catch non-party
  305. //review this...
  306. func TestApplyMessage_Private_whenNonPartyTriesInteractingWithPartyProtectionC1_NoFlag_Succeed(t *testing.T) {
  307. originalP := private.P
  308. defer func() { private.P = originalP }()
  309. mockPM := newMockPrivateTransactionManager()
  310. private.P = mockPM
  311. assert := testifyassert.New(t)
  312. cfg := newConfig()
  313. //act like doesnt exist on non-party node
  314. c1EncPayloadHash := []byte("c1")
  315. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  316. setData(c1EncPayloadHash)
  317. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  318. // calling C1.Set()
  319. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  320. setData([]byte("arbitrary enc payload hash")).
  321. setNonce(1).
  322. setTo(c1Address)
  323. privateMsg := newTypicalPrivateMessage(cfg)
  324. //will have no ACHashes because when non-party sends tx, because no flag it doesn't generate privacyMetadata info
  325. //actual execution will find affected contract, but non-party won't have info
  326. mockPM.When("Receive").Return(c1.set(53), &engine.ExtraMetadata{
  327. ACHashes: common.EncryptedPayloadHashes{},
  328. PrivacyFlag: engine.PrivacyFlagStandardPrivate,
  329. }, nil)
  330. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  331. assert.NoError(err, "EVM execution")
  332. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  333. mockPM.Verify(assert)
  334. }
  335. func TestApplyMessage_Private_whenNonPartyTriesInteractingWithPartyProtectionC1_WithFlag_Fail(t *testing.T) {
  336. originalP := private.P
  337. defer func() { private.P = originalP }()
  338. mockPM := newMockPrivateTransactionManager()
  339. private.P = mockPM
  340. assert := testifyassert.New(t)
  341. cfg := newConfig()
  342. //act like doesnt exist on non-party node
  343. c1EncPayloadHash := []byte("c1")
  344. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  345. setData(c1EncPayloadHash)
  346. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  347. // calling C1.Set() party protection
  348. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  349. setData([]byte("arbitrary enc payload hash")).
  350. setNonce(1).
  351. setTo(c1Address)
  352. privateMsg := newTypicalPrivateMessage(cfg)
  353. mockPM.When("Receive").Return(c1.set(53), &engine.ExtraMetadata{
  354. ACHashes: common.EncryptedPayloadHashes{
  355. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  356. },
  357. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  358. }, nil)
  359. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  360. assert.NoError(err, "EVM execution")
  361. assert.True(result.Failed(), "Transaction receipt status")
  362. mockPM.Verify(assert)
  363. }
  364. // C1 is a existing contract before privacy enhancements implementation
  365. func TestApplyMessage_Private_whenPartyProtectionC2InteractsExistingStandardPrivateC1_Fail(t *testing.T) {
  366. originalP := private.P
  367. defer func() { private.P = originalP }()
  368. mockPM := newMockPrivateTransactionManager()
  369. private.P = mockPM
  370. assert := testifyassert.New(t)
  371. cfg := newConfig()
  372. // create c1 like c1 already exist before privacy enhancements
  373. c1EncPayloadHash := []byte("c1")
  374. cfg.setPrivacyFlag(math.MaxUint64).
  375. setData(c1EncPayloadHash)
  376. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  377. // create party protection c2
  378. c2EncPayloadHash := []byte("c2")
  379. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  380. setData(c2EncPayloadHash).
  381. setNonce(1)
  382. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  383. // calling C2.Set() party protection
  384. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  385. setData([]byte("arbitrary enc payload hash")).
  386. setNonce(2).
  387. setTo(c2Address)
  388. privateMsg := newTypicalPrivateMessage(cfg)
  389. // since party protection need ACHashes (only private non standard) and PrivacyFlag
  390. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  391. ACHashes: common.EncryptedPayloadHashes{
  392. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  393. },
  394. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  395. }, nil)
  396. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  397. assert.NoError(err, "EVM execution")
  398. assert.True(result.Failed(), "Transaction receipt status")
  399. mockPM.Verify(assert)
  400. }
  401. func TestApplyMessage_Private_whenPartyProtectionC2InteractsNewStandardPrivateC1_Fail(t *testing.T) {
  402. originalP := private.P
  403. defer func() { private.P = originalP }()
  404. mockPM := newMockPrivateTransactionManager()
  405. private.P = mockPM
  406. assert := testifyassert.New(t)
  407. cfg := newConfig()
  408. // create default standard private c1
  409. c1EncPayloadHash := []byte("c1")
  410. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  411. setData(c1EncPayloadHash)
  412. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  413. // create party protection c2
  414. c2EncPayloadHash := []byte("c2")
  415. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  416. setData(c2EncPayloadHash).
  417. setNonce(1)
  418. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  419. // calling C2.Set() party protection
  420. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  421. setData([]byte("arbitrary enc payload hash")).
  422. setNonce(2).
  423. setTo(c2Address)
  424. privateMsg := newTypicalPrivateMessage(cfg)
  425. // since party protection need ACHashes (only private non standard) and PrivacyFlag
  426. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  427. ACHashes: common.EncryptedPayloadHashes{
  428. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  429. },
  430. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  431. }, nil)
  432. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  433. assert.NoError(err, "EVM execution")
  434. assert.True(result.Failed(), "Transaction receipt status")
  435. mockPM.Verify(assert)
  436. }
  437. func TestApplyMessage_Private_whenPartyProtectionC2InteractsWithPartyProtectionC1_Succeed(t *testing.T) {
  438. originalP := private.P
  439. defer func() { private.P = originalP }()
  440. mockPM := newMockPrivateTransactionManager()
  441. private.P = mockPM
  442. assert := testifyassert.New(t)
  443. cfg := newConfig()
  444. // create party protection c1
  445. c1EncPayloadHash := []byte("c1")
  446. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  447. setData(c1EncPayloadHash)
  448. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  449. // create party protection c2
  450. c2EncPayloadHash := []byte("c2")
  451. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  452. setData(c2EncPayloadHash).
  453. setNonce(1)
  454. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  455. // calling C2.Set() party protection
  456. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  457. setData([]byte("arbitrary enc payload hash")).
  458. setNonce(2).
  459. setTo(c2Address)
  460. privateMsg := newTypicalPrivateMessage(cfg)
  461. // since party protection need ACHashes and PrivacyFlag
  462. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  463. ACHashes: common.EncryptedPayloadHashes{
  464. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  465. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  466. },
  467. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  468. }, nil)
  469. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  470. assert.NoError(err, "EVM execution")
  471. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  472. mockPM.Verify(assert)
  473. }
  474. //scenario where sender Q1 runs simulation which affects c2 and c1 privy for Q3 and Q7
  475. //Q3 receives block but wasn't privy to C1 so doesn't have creation info in tessera
  476. func TestApplyMessage_Private_whenPartyProtectionC2AndC1ButMissingC1CreationInTessera_Fail(t *testing.T) {
  477. originalP := private.P
  478. defer func() { private.P = originalP }()
  479. mockPM := newMockPrivateTransactionManager()
  480. private.P = mockPM
  481. assert := testifyassert.New(t)
  482. cfg := newConfig()
  483. // create c1 as a party protection
  484. c1EncPayloadHash := []byte("c1")
  485. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  486. setData(c1EncPayloadHash)
  487. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  488. // create party protection c2
  489. c2EncPayloadHash := []byte("c2")
  490. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  491. setData(c2EncPayloadHash).
  492. setNonce(1)
  493. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  494. // calling C2.Set() party protection
  495. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  496. setData([]byte("arbitrary enc payload hash")).
  497. setNonce(2).
  498. setTo(c2Address)
  499. privateMsg := newTypicalPrivateMessage(cfg)
  500. // since party protection need ACHashes and PrivacyFlag
  501. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  502. ACHashes: common.EncryptedPayloadHashes{
  503. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  504. },
  505. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  506. }, nil)
  507. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  508. assert.NoError(err, "EVM execution")
  509. assert.True(result.Failed(), "Transaction receipt status")
  510. mockPM.Verify(assert)
  511. }
  512. //scenario where the simulation is run on the Q1 (privatefor Q3 and Q7) and 3 contracts are affected (C2,C1,C0)
  513. //but now Q3 receives block and should be privy to all 3 given tessera response
  514. //but doesn't have C0 privacyMetadata stored in its db
  515. // UPDATE - after relaxing the ACOTH checks this is a valid scenario where C0 acoth is ignored if it isn't detected as an
  516. // affected contract during transaction execution
  517. func TestApplyMessage_Private_whenPartyProtectionC2AndC1AndC0ButMissingC0InStateDB_Fail(t *testing.T) {
  518. originalP := private.P
  519. defer func() { private.P = originalP }()
  520. mockPM := newMockPrivateTransactionManager()
  521. private.P = mockPM
  522. assert := testifyassert.New(t)
  523. cfg := newConfig()
  524. // create party protection c1
  525. c1EncPayloadHash := []byte("c1")
  526. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  527. setData(c1EncPayloadHash)
  528. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  529. // create party protection c2
  530. c2EncPayloadHash := []byte("c2")
  531. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  532. setData(c2EncPayloadHash).
  533. setNonce(1)
  534. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  535. c3EncPayloadHash := []byte("c3")
  536. // calling C2.Set() party protection
  537. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  538. setData([]byte("arbitrary enc payload hash")).
  539. setNonce(2).
  540. setTo(c2Address)
  541. privateMsg := newTypicalPrivateMessage(cfg)
  542. // since party protection need ACHashes and PrivacyFlag
  543. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  544. ACHashes: common.EncryptedPayloadHashes{
  545. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  546. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  547. common.BytesToEncryptedPayloadHash(c3EncPayloadHash): struct{}{},
  548. },
  549. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  550. }, nil)
  551. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  552. assert.NoError(err, "EVM execution")
  553. // after ACOTH check updates this is a successful scenario
  554. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  555. mockPM.Verify(assert)
  556. }
  557. func TestApplyMessage_Private_whenStateValidationC2InteractsWithStateValidationC1_Succeed(t *testing.T) {
  558. originalP := private.P
  559. defer func() { private.P = originalP }()
  560. mockPM := newMockPrivateTransactionManager()
  561. private.P = mockPM
  562. assert := testifyassert.New(t)
  563. cfg := newConfig()
  564. // create party protection c1
  565. c1EncPayloadHash := []byte("c1")
  566. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  567. setData(c1EncPayloadHash)
  568. cfg.acMerkleRoot, _ = calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue42Stored})
  569. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  570. // create state validation c2
  571. c2EncPayloadHash := []byte("c2")
  572. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  573. setData(c2EncPayloadHash).
  574. setNonce(1)
  575. cfg.acMerkleRoot, _ = calcAccMR(accEntry{address: c2AccAddress, account: c2AccountWithC1AddressStored})
  576. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  577. // calling C2.Set() state validation
  578. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  579. setData([]byte("arbitrary enc payload hash")).
  580. setNonce(2).
  581. setTo(c2Address)
  582. stuff := crypto.Keccak256Hash(c2.bytecode)
  583. log.Trace("stuff", "c2code", stuff[:])
  584. privateMsg := newTypicalPrivateMessage(cfg)
  585. mr, _ := calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue53Stored}, accEntry{address: c2AccAddress, account: c2AccountWithC1AddressStored})
  586. //since state validation need ACHashes, PrivacyFlag & MerkleRoot
  587. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  588. ACHashes: common.EncryptedPayloadHashes{
  589. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  590. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  591. },
  592. PrivacyFlag: engine.PrivacyFlagStateValidation,
  593. ACMerkleRoot: mr,
  594. }, nil)
  595. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  596. assert.NoError(err, "EVM execution")
  597. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  598. mockPM.Verify(assert)
  599. }
  600. func TestApplyMessage_Private_whenStateValidationC2InteractsWithPartyProtectionC1_Fail(t *testing.T) {
  601. originalP := private.P
  602. defer func() { private.P = originalP }()
  603. mockPM := newMockPrivateTransactionManager()
  604. private.P = mockPM
  605. assert := testifyassert.New(t)
  606. cfg := newConfig()
  607. // create party protection c1
  608. c1EncPayloadHash := []byte("c1")
  609. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  610. setData(c1EncPayloadHash)
  611. c1Address := createContract(cfg, mockPM, assert, c1, big.NewInt(42))
  612. // create state validation c2
  613. c2EncPayloadHash := []byte("c2")
  614. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  615. setData(c2EncPayloadHash).
  616. setNonce(1)
  617. cfg.acMerkleRoot, _ = calcAccMR(accEntry{address: c2AccAddress, account: c2AccountWithC1AddressStored})
  618. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  619. // calling C2.Set() state validation
  620. cfg.setPrivacyFlag(engine.PrivacyFlagStateValidation).
  621. setData([]byte("arbitrary enc payload hash")).
  622. setNonce(2).
  623. setTo(c2Address)
  624. privateMsg := newTypicalPrivateMessage(cfg)
  625. // use the correctly calculated MR so that it can't be a source of false positives
  626. mr, _ := calcAccMR(accEntry{address: c1AccAddress, account: c1AccountWithValue53Stored}, accEntry{address: c2AccAddress, account: c2AccountWithC1AddressStored})
  627. //since state validation need ACHashes, PrivacyFlag & MerkleRoot
  628. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  629. ACHashes: common.EncryptedPayloadHashes{
  630. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  631. common.BytesToEncryptedPayloadHash(c1EncPayloadHash): struct{}{},
  632. },
  633. PrivacyFlag: engine.PrivacyFlagStateValidation,
  634. ACMerkleRoot: mr,
  635. }, nil)
  636. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  637. assert.NoError(err, "EVM execution")
  638. assert.True(result.Failed(), "Transaction receipt status")
  639. mockPM.Verify(assert)
  640. }
  641. func TestApplyMessage_Private_whenStandardPrivateC2InteractsWithPublicC1_Fail(t *testing.T) {
  642. originalP := private.P
  643. defer func() { private.P = originalP }()
  644. mockPM := newMockPrivateTransactionManager()
  645. private.P = mockPM
  646. assert := testifyassert.New(t)
  647. cfg := newConfig()
  648. // create public c1
  649. cfg.setData(c1.create(big.NewInt(42)))
  650. c1Address := createPublicContract(cfg, assert, c1)
  651. // create standard private c2
  652. c2EncPayloadHash := []byte("c2")
  653. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  654. setData(c2EncPayloadHash).
  655. setNonce(1)
  656. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  657. // calling C2.Set() standard private
  658. cfg.setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  659. setData([]byte("arbitrary enc payload hash")).
  660. setNonce(2).
  661. setTo(c2Address)
  662. privateMsg := newTypicalPrivateMessage(cfg)
  663. //since standard private call no ACHashes, no MerkleRoot
  664. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  665. ACHashes: common.EncryptedPayloadHashes{},
  666. PrivacyFlag: engine.PrivacyFlagStandardPrivate,
  667. }, nil)
  668. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  669. assert.NoError(err, "EVM execution")
  670. assert.True(result.Failed(), "Transaction receipt status")
  671. mockPM.Verify(assert)
  672. }
  673. func TestApplyMessage_Private_whenPartyProtectionC2InteractsWithPublicC1_Fail(t *testing.T) {
  674. originalP := private.P
  675. defer func() { private.P = originalP }()
  676. mockPM := newMockPrivateTransactionManager()
  677. private.P = mockPM
  678. assert := testifyassert.New(t)
  679. cfg := newConfig()
  680. // create public c1
  681. cfg.setData(c1.create(big.NewInt(42)))
  682. c1Address := createPublicContract(cfg, assert, c1)
  683. // create party protection c2
  684. c2EncPayloadHash := []byte("c2")
  685. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  686. setData(c2EncPayloadHash).
  687. setNonce(1)
  688. c2Address := createContract(cfg, mockPM, assert, c2, c1Address)
  689. // calling C2.Set() party protection
  690. cfg.setPrivacyFlag(engine.PrivacyFlagPartyProtection).
  691. setData([]byte("arbitrary enc payload hash")).
  692. setNonce(2).
  693. setTo(c2Address)
  694. privateMsg := newTypicalPrivateMessage(cfg)
  695. mockPM.When("Receive").Return(c2.set(53), &engine.ExtraMetadata{
  696. ACHashes: common.EncryptedPayloadHashes{
  697. common.BytesToEncryptedPayloadHash(c2EncPayloadHash): struct{}{},
  698. },
  699. PrivacyFlag: engine.PrivacyFlagPartyProtection,
  700. }, nil)
  701. result, err := ApplyMessage(newEVM(cfg), privateMsg, new(GasPool).AddGas(math.MaxUint64))
  702. assert.NoError(err, "EVM execution")
  703. assert.True(result.Failed(), "Transaction receipt status")
  704. mockPM.Verify(assert)
  705. }
  706. func TestApplyMessage_Private_whenTxManagerReturnsError_Success(t *testing.T) {
  707. originalP := private.P
  708. defer func() { private.P = originalP }()
  709. mockPM := newMockPrivateTransactionManager()
  710. private.P = mockPM
  711. assert := testifyassert.New(t)
  712. // calling C1.Create standard private
  713. cfg := newConfig().
  714. setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  715. setData([]byte("arbitrary encrypted payload hash"))
  716. gp := new(GasPool).AddGas(math.MaxUint64)
  717. privateMsg := newTypicalPrivateMessage(cfg)
  718. //since standard private create only get back PrivacyFlag
  719. mockPM.When("Receive").Return(nil, nil, fmt.Errorf("Error during receive"))
  720. result, err := ApplyMessage(newEVM(cfg), privateMsg, gp)
  721. assert.NoError(err, "EVM execution")
  722. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  723. mockPM.Verify(assert)
  724. }
  725. func TestApplyMessage_Private_whenTxManagerReturnsEmptyResult_Success(t *testing.T) {
  726. originalP := private.P
  727. defer func() { private.P = originalP }()
  728. mockPM := newMockPrivateTransactionManager()
  729. private.P = mockPM
  730. assert := testifyassert.New(t)
  731. // calling C1.Create standard private
  732. cfg := newConfig().
  733. setPrivacyFlag(engine.PrivacyFlagStandardPrivate).
  734. setData([]byte("arbitrary encrypted payload hash"))
  735. gp := new(GasPool).AddGas(math.MaxUint64)
  736. privateMsg := newTypicalPrivateMessage(cfg)
  737. //since standard private create only get back PrivacyFlag
  738. mockPM.When("Receive").Return(nil, nil, nil)
  739. result, err := ApplyMessage(newEVM(cfg), privateMsg, gp)
  740. assert.NoError(err, "EVM execution")
  741. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  742. mockPM.Verify(assert)
  743. }
  744. func createContract(cfg *config, mockPM *mockPrivateTransactionManager, assert *testifyassert.Assertions, c *contract, args ...interface{}) common.Address {
  745. defer mockPM.reset()
  746. privateMsg := newTypicalPrivateMessage(cfg)
  747. metadata := &engine.ExtraMetadata{}
  748. if cfg.privacyFlag < math.MaxUint64 {
  749. metadata.PrivacyFlag = cfg.privacyFlag
  750. if metadata.PrivacyFlag == engine.PrivacyFlagStateValidation {
  751. metadata.ACMerkleRoot = cfg.acMerkleRoot
  752. }
  753. }
  754. mockPM.When("Receive").Return(c.create(args...), metadata, nil)
  755. evm := newEVM(cfg)
  756. result, err := ApplyMessage(evm, privateMsg, new(GasPool).AddGas(math.MaxUint64))
  757. assert.NoError(err, "%s: EVM execution", c.name)
  758. assert.False(result.Failed(), fmt.Sprintf("%s: Transaction receipt status is 'failed', error == [%v]", c.name, result.Err))
  759. mockPM.Verify(assert)
  760. createdContracts := evm.CreatedContracts()
  761. log.Trace("priv statedb", "evmstatedb", evm.StateDB)
  762. assert.Len(createdContracts, 1, "%s: Number of created contracts", c.name)
  763. address := createdContracts[0]
  764. log.Debug("Created "+c.name, "address", address)
  765. return address
  766. }
  767. func createPublicContract(cfg *config, assert *testifyassert.Assertions, c *contract) common.Address {
  768. pubcfg := cfg.setPublicToPrivateState()
  769. msg := newTypicalPublicMessage(pubcfg)
  770. evm := newEVM(pubcfg)
  771. result, err := ApplyMessage(evm, msg, new(GasPool).AddGas(math.MaxUint64))
  772. assert.NoError(err, "%s: EVM execution", c.name)
  773. assert.False(result.Failed(), fmt.Sprintf("%s: Transaction receipt status is 'failed', error == [%v]", c.name, result.Err))
  774. createdContracts := evm.CreatedContracts()
  775. log.Trace("pub statedb", "evmstatedb", evm.StateDB)
  776. assert.Len(createdContracts, 1, "%s: Number of created contracts", c.name)
  777. address := createdContracts[0]
  778. log.Debug("Created "+c.name, "address", address)
  779. return address
  780. }
  781. func newTypicalPrivateMessage(cfg *config) PrivateMessage {
  782. var tx *types.Transaction
  783. if cfg.to == nil {
  784. tx = types.NewContractCreation(cfg.nonce, big.NewInt(0), math.MaxUint64, big.NewInt(0), cfg.data)
  785. } else {
  786. tx = types.NewTransaction(cfg.nonce, *cfg.to, big.NewInt(0), math.MaxUint64, big.NewInt(0), cfg.data)
  787. }
  788. tx.SetPrivate()
  789. if cfg.privacyFlag < math.MaxUint64 {
  790. tx.SetTxPrivacyMetadata(&types.PrivacyMetadata{
  791. PrivacyFlag: cfg.privacyFlag,
  792. })
  793. } else {
  794. tx.SetTxPrivacyMetadata(nil) // simulate standard private transaction
  795. }
  796. msg, err := tx.AsMessage(&stubSigner{})
  797. if err != nil {
  798. panic(fmt.Sprintf("can't create a new private message: %s", err))
  799. }
  800. cfg.currentTx = tx
  801. return PrivateMessage(msg)
  802. }
  803. func newTypicalPublicMessage(cfg *config) Message {
  804. var tx *types.Transaction
  805. if cfg.to == nil {
  806. tx = types.NewContractCreation(cfg.nonce, big.NewInt(0), math.MaxUint64, big.NewInt(0), cfg.data)
  807. } else {
  808. tx = types.NewTransaction(cfg.nonce, *cfg.to, big.NewInt(0), math.MaxUint64, big.NewInt(0), cfg.data)
  809. }
  810. tx.SetTxPrivacyMetadata(nil)
  811. msg, err := tx.AsMessage(&stubSigner{})
  812. if err != nil {
  813. panic(fmt.Sprintf("can't create a new private message: %s", err))
  814. }
  815. cfg.currentTx = tx
  816. return msg
  817. }
  818. type accEntry struct {
  819. address common.Address
  820. account *state.Account
  821. }
  822. func calcAccMR(entries ...accEntry) (common.Hash, error) {
  823. combined := new(trie.Trie)
  824. for _, entry := range entries {
  825. data, err := rlp.EncodeToBytes(entry.account)
  826. if err != nil {
  827. return common.Hash{}, err
  828. }
  829. if err = combined.TryUpdate(entry.address.Bytes(), data); err != nil {
  830. return common.Hash{}, err
  831. }
  832. }
  833. return combined.Hash(), nil
  834. }
  835. type config struct {
  836. from common.Address
  837. to *common.Address
  838. data []byte
  839. nonce uint64
  840. privacyFlag engine.PrivacyFlagType
  841. acMerkleRoot common.Hash
  842. currentTx *types.Transaction
  843. publicState, privateState *state.StateDB
  844. }
  845. func newConfig() *config {
  846. pubDatabase := rawdb.NewMemoryDatabase()
  847. privDatabase := rawdb.NewMemoryDatabase()
  848. publicState, _ := state.New(common.Hash{}, state.NewDatabase(pubDatabase), nil)
  849. privateState, _ := state.New(common.Hash{}, state.NewDatabase(privDatabase), nil)
  850. return &config{
  851. privateState: privateState,
  852. publicState: publicState,
  853. }
  854. }
  855. func (cfg config) setPublicToPrivateState() *config {
  856. cfg.privateState = cfg.publicState
  857. return &cfg
  858. }
  859. func (cfg *config) setPrivacyFlag(f engine.PrivacyFlagType) *config {
  860. cfg.privacyFlag = f
  861. return cfg
  862. }
  863. func (cfg *config) setData(bytes []byte) *config {
  864. cfg.data = bytes
  865. return cfg
  866. }
  867. func (cfg *config) setNonce(n uint64) *config {
  868. cfg.nonce = n
  869. return cfg
  870. }
  871. func (cfg *config) setTo(address common.Address) *config {
  872. cfg.to = &address
  873. return cfg
  874. }
  875. func newEVM(cfg *config) *vm.EVM {
  876. context := vm.BlockContext{
  877. CanTransfer: CanTransfer,
  878. Transfer: Transfer,
  879. GetHash: func(uint64) common.Hash { return common.Hash{} },
  880. Coinbase: common.Address{},
  881. BlockNumber: new(big.Int),
  882. Time: big.NewInt(time.Now().Unix()),
  883. Difficulty: new(big.Int),
  884. GasLimit: uint64(3450366),
  885. }
  886. txContext := vm.TxContext{
  887. Origin: common.Address{},
  888. GasPrice: big.NewInt(0),
  889. }
  890. evm := vm.NewEVM(context, txContext, cfg.publicState, cfg.privateState, &params.ChainConfig{
  891. ChainID: big.NewInt(1),
  892. ByzantiumBlock: new(big.Int),
  893. HomesteadBlock: new(big.Int),
  894. DAOForkBlock: new(big.Int),
  895. DAOForkSupport: false,
  896. EIP150Block: new(big.Int),
  897. EIP155Block: new(big.Int),
  898. EIP158Block: new(big.Int),
  899. IsQuorum: true,
  900. PrivacyEnhancementsBlock: new(big.Int),
  901. }, vm.Config{})
  902. evm.SetCurrentTX(cfg.currentTx)
  903. return evm
  904. }
  905. func mustParse(def string) abi.ABI {
  906. ret, err := abi.JSON(strings.NewReader(def))
  907. if err != nil {
  908. panic(fmt.Sprintf("Can't parse ABI def %s", err))
  909. }
  910. return ret
  911. }
  912. type stubSigner struct {
  913. }
  914. func (ss *stubSigner) Sender(tx *types.Transaction) (common.Address, error) {
  915. return signingAddress, nil
  916. }
  917. func (ss *stubSigner) SignatureValues(tx *types.Transaction, sig []byte) (r, s, v *big.Int, err error) {
  918. panic("implement me")
  919. }
  920. func (ss *stubSigner) Hash(tx *types.Transaction) common.Hash {
  921. panic("implement me")
  922. }
  923. func (ss *stubSigner) Equal(types.Signer) bool {
  924. panic("implement me")
  925. }
  926. func (ss *stubSigner) ChainID() *big.Int {
  927. panic("implement me")
  928. }
  929. type mockPrivateTransactionManager struct {
  930. notinuse.PrivateTransactionManager
  931. returns map[string][]interface{}
  932. currentMethod string
  933. count map[string]int
  934. }
  935. func (mpm *mockPrivateTransactionManager) HasFeature(f engine.PrivateTransactionManagerFeature) bool {
  936. return true
  937. }
  938. func (mpm *mockPrivateTransactionManager) Receive(data common.EncryptedPayloadHash) (string, []string, []byte, *engine.ExtraMetadata, error) {
  939. mpm.count["Receive"]++
  940. values := mpm.returns["Receive"]
  941. var (
  942. r1 []byte
  943. r2 *engine.ExtraMetadata
  944. r3 error
  945. )
  946. if values[0] != nil {
  947. r1 = values[0].([]byte)
  948. }
  949. if values[1] != nil {
  950. r2 = values[1].(*engine.ExtraMetadata)
  951. }
  952. if values[2] != nil {
  953. r3 = values[2].(error)
  954. }
  955. return "", nil, r1, r2, r3
  956. }
  957. func (mpm *mockPrivateTransactionManager) When(name string) *mockPrivateTransactionManager {
  958. mpm.currentMethod = name
  959. mpm.count[name] = -1
  960. return mpm
  961. }
  962. func (mpm *mockPrivateTransactionManager) Return(values ...interface{}) {
  963. mpm.returns[mpm.currentMethod] = values
  964. }
  965. func (mpm *mockPrivateTransactionManager) Verify(assert *testifyassert.Assertions) {
  966. for m, c := range mpm.count {
  967. assert.True(c > -1, "%s has not been called", m)
  968. }
  969. }
  970. func (mpm *mockPrivateTransactionManager) reset() {
  971. mpm.count = make(map[string]int)
  972. mpm.currentMethod = ""
  973. mpm.returns = make(map[string][]interface{})
  974. }
  975. func newMockPrivateTransactionManager() *mockPrivateTransactionManager {
  976. return &mockPrivateTransactionManager{
  977. returns: make(map[string][]interface{}),
  978. count: make(map[string]int),
  979. }
  980. }
  981. const (
  982. c1AbiDefinition = `
  983. [
  984. {
  985. "constant": false,
  986. "inputs": [
  987. {
  988. "name": "newValue",
  989. "type": "uint256"
  990. }
  991. ],
  992. "name": "set",
  993. "outputs": [
  994. {
  995. "name": "",
  996. "type": "uint256"
  997. }
  998. ],
  999. "payable": false,
  1000. "stateMutability": "nonpayable",
  1001. "type": "function"
  1002. },
  1003. {
  1004. "constant": true,
  1005. "inputs": [],
  1006. "name": "get",
  1007. "outputs": [
  1008. {
  1009. "name": "",
  1010. "type": "uint256"
  1011. }
  1012. ],
  1013. "payable": false,
  1014. "stateMutability": "view",
  1015. "type": "function"
  1016. },
  1017. {
  1018. "constant": false,
  1019. "inputs": [
  1020. {
  1021. "name": "newValue",
  1022. "type": "uint256"
  1023. }
  1024. ],
  1025. "name": "newContractC2",
  1026. "outputs": [],
  1027. "payable": false,
  1028. "stateMutability": "nonpayable",
  1029. "type": "function"
  1030. },
  1031. {
  1032. "inputs": [
  1033. {
  1034. "name": "initVal",
  1035. "type": "uint256"
  1036. }
  1037. ],
  1038. "payable": false,
  1039. "stateMutability": "nonpayable",
  1040. "type": "constructor"
  1041. }
  1042. ]
  1043. `
  1044. c2AbiDefinition = `
  1045. [
  1046. {
  1047. "constant": false,
  1048. "inputs": [
  1049. {
  1050. "name": "_val",
  1051. "type": "uint256"
  1052. }
  1053. ],
  1054. "name": "set",
  1055. "outputs": [],
  1056. "payable": false,
  1057. "stateMutability": "nonpayable",
  1058. "type": "function"
  1059. },
  1060. {
  1061. "constant": true,
  1062. "inputs": [],
  1063. "name": "get",
  1064. "outputs": [
  1065. {
  1066. "name": "result",
  1067. "type": "uint256"
  1068. }
  1069. ],
  1070. "payable": false,
  1071. "stateMutability": "view",
  1072. "type": "function"
  1073. },
  1074. {
  1075. "inputs": [
  1076. {
  1077. "name": "_t",
  1078. "type": "address"
  1079. }
  1080. ],
  1081. "payable": false,
  1082. "stateMutability": "nonpayable",
  1083. "type": "constructor"
  1084. }
  1085. ]
  1086. `
  1087. )
  1088. func verifyGasPoolCalculation(t *testing.T, pm private.PrivateTransactionManager) {
  1089. assert := testifyassert.New(t)
  1090. saved := private.P
  1091. defer func() {
  1092. private.P = saved
  1093. }()
  1094. private.P = pm
  1095. txGasLimit := uint64(100000)
  1096. gasPool := new(GasPool).AddGas(200000)
  1097. // this payload would give us 25288 intrinsic gas
  1098. arbitraryEncryptedPayload := "4ab80888354582b92ab442a317828386e4bf21ea4a38d1a9183fbb715f199475269d7686939017f4a6b28310d5003ebd8e012eade530b79e157657ce8dd9692a"
  1099. expectedGasPool := new(GasPool).AddGas(177988) // only intrinsic gas is deducted
  1100. db := rawdb.NewMemoryDatabase()
  1101. privateState, _ := state.New(common.Hash{}, state.NewDatabase(db), nil)
  1102. publicState, _ := state.New(common.Hash{}, state.NewDatabase(db), nil)
  1103. msg := privateCallMsg{
  1104. callmsg: callmsg{
  1105. addr: common.Address{2},
  1106. to: &common.Address{},
  1107. value: new(big.Int),
  1108. gas: txGasLimit,
  1109. gasPrice: big.NewInt(0),
  1110. data: common.Hex2Bytes(arbitraryEncryptedPayload),
  1111. },
  1112. }
  1113. ctx := NewEVMBlockContext(&dualStateTestHeader, nil, &common.Address{})
  1114. txCtx := NewEVMTxContext(msg)
  1115. evm := vm.NewEVM(ctx, txCtx, publicState, privateState, params.QuorumTestChainConfig, vm.Config{})
  1116. tx := types.NewTransaction(
  1117. 0,
  1118. common.Address{},
  1119. big.NewInt(0),
  1120. txGasLimit,
  1121. big.NewInt(0),
  1122. common.Hex2Bytes(arbitraryEncryptedPayload))
  1123. evm.SetCurrentTX(tx)
  1124. arbitraryBalance := big.NewInt(100000000)
  1125. publicState.SetBalance(evm.Context.Coinbase, arbitraryBalance)
  1126. publicState.SetBalance(msg.From(), arbitraryBalance)
  1127. testObject := NewStateTransition(evm, msg, gasPool)
  1128. result, err := testObject.TransitionDb()
  1129. assert.NoError(err)
  1130. assert.False(result.Failed(), fmt.Sprintf("Transaction receipt status is 'failed', error == [%v]", result.Err))
  1131. assert.Equal(new(big.Int).SetUint64(expectedGasPool.Gas()), new(big.Int).SetUint64(gasPool.Gas()), "gas pool must be calculated correctly")
  1132. assert.Equal(arbitraryBalance, publicState.GetBalance(evm.Context.Coinbase), "balance must not be changed")
  1133. assert.Equal(arbitraryBalance, publicState.GetBalance(msg.From()), "balance must not be changed")
  1134. }
  1135. func TestStateTransition_TransitionDb_GasPoolCalculation_whenNonPartyNodeProcessingPrivateTransactions(t *testing.T) {
  1136. stubPTM := &StubPrivateTransactionManager{
  1137. responses: map[string][]interface{}{
  1138. "Receive": {
  1139. []byte{},
  1140. nil,
  1141. },
  1142. },
  1143. }
  1144. verifyGasPoolCalculation(t, stubPTM)
  1145. }
  1146. func TestStateTransition_TransitionDb_GasPoolCalculation_whenPartyNodeProcessingPrivateTransactions(t *testing.T) {
  1147. stubPTM := &StubPrivateTransactionManager{
  1148. responses: map[string][]interface{}{
  1149. "Receive": {
  1150. common.Hex2Bytes("600a6000526001601ff300"),
  1151. nil,
  1152. },
  1153. },
  1154. }
  1155. verifyGasPoolCalculation(t, stubPTM)
  1156. }
  1157. type privateCallMsg struct {
  1158. callmsg
  1159. }
  1160. func (pm privateCallMsg) IsPrivate() bool { return true }
  1161. type StubPrivateTransactionManager struct {
  1162. notinuse.PrivateTransactionManager
  1163. responses map[string][]interface{}
  1164. }
  1165. func (spm *StubPrivateTransactionManager) Receive(data common.EncryptedPayloadHash) (string, []string, []byte, *engine.ExtraMetadata, error) {
  1166. res := spm.responses["Receive"]
  1167. if err, ok := res[1].(error); ok {
  1168. return "", nil, nil, nil, err
  1169. }
  1170. if ret, ok := res[0].([]byte); ok {
  1171. return "", nil, ret, &engine.ExtraMetadata{
  1172. PrivacyFlag: engine.PrivacyFlagStandardPrivate,
  1173. }, nil
  1174. }
  1175. return "", nil, nil, nil, nil
  1176. }
  1177. func (spm *StubPrivateTransactionManager) ReceiveRaw(hash common.EncryptedPayloadHash) ([]byte, string, *engine.ExtraMetadata, error) {
  1178. _, sender, data, metadata, err := spm.Receive(hash)
  1179. return data, sender[0], metadata, err
  1180. }
  1181. func (spm *StubPrivateTransactionManager) HasFeature(f engine.PrivateTransactionManagerFeature) bool {
  1182. return true
  1183. }