github.com/jpmorganchase/quorum@v21.1.0+incompatible/internal/ethapi/api_test.go (about) 1 package ethapi 2 3 import ( 4 "context" 5 "math/big" 6 "os" 7 "testing" 8 "time" 9 10 "github.com/ethereum/go-ethereum/accounts" 11 "github.com/ethereum/go-ethereum/common" 12 "github.com/ethereum/go-ethereum/common/hexutil" 13 "github.com/ethereum/go-ethereum/core" 14 "github.com/ethereum/go-ethereum/core/bloombits" 15 "github.com/ethereum/go-ethereum/core/rawdb" 16 "github.com/ethereum/go-ethereum/core/state" 17 "github.com/ethereum/go-ethereum/core/types" 18 "github.com/ethereum/go-ethereum/core/vm" 19 "github.com/ethereum/go-ethereum/crypto" 20 "github.com/ethereum/go-ethereum/eth/downloader" 21 "github.com/ethereum/go-ethereum/ethdb" 22 "github.com/ethereum/go-ethereum/event" 23 "github.com/ethereum/go-ethereum/log" 24 "github.com/ethereum/go-ethereum/multitenancy" 25 "github.com/ethereum/go-ethereum/params" 26 "github.com/ethereum/go-ethereum/private" 27 "github.com/ethereum/go-ethereum/private/engine" 28 "github.com/ethereum/go-ethereum/private/engine/notinuse" 29 "github.com/ethereum/go-ethereum/rpc" 30 "github.com/jpmorganchase/quorum-security-plugin-sdk-go/proto" 31 "github.com/stretchr/testify/assert" 32 ) 33 34 var ( 35 arbitraryCtx = context.Background() 36 arbitraryPrivateFrom = "arbitrary private from" 37 privateTxArgs = &PrivateTxArgs{ 38 PrivateFrom: arbitraryPrivateFrom, 39 PrivateFor: []string{"arbitrary party 1", "arbitrary party 2"}, 40 } 41 arbitraryFrom = common.BytesToAddress([]byte("arbitrary address")) 42 43 arbitrarySimpleStorageContractEncryptedPayloadHash = common.BytesToEncryptedPayloadHash([]byte("arbitrary payload hash")) 44 45 simpleStorageContractCreationTx = types.NewContractCreation( 46 0, 47 big.NewInt(0), 48 hexutil.MustDecodeUint64("0x47b760"), 49 big.NewInt(0), 50 hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029")) 51 52 rawSimpleStorageContractCreationTx = types.NewContractCreation( 53 0, 54 big.NewInt(0), 55 hexutil.MustDecodeUint64("0x47b760"), 56 big.NewInt(0), 57 arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes()) 58 59 arbitrarySimpleStorageContractAddress common.Address 60 arbitraryStandardPrivateSimpleStorageContractAddress common.Address 61 62 simpleStorageContractMessageCallTx *types.Transaction 63 standardPrivateSimpleStorageContractMessageCallTx *types.Transaction 64 rawStandardPrivateSimpleStorageContractMessageCallTx *types.Transaction 65 66 arbitraryCurrentBlockNumber = big.NewInt(1) 67 68 publicStateDB *state.StateDB 69 privateStateDB *state.StateDB 70 ) 71 72 func TestMain(m *testing.M) { 73 setup() 74 retCode := m.Run() 75 teardown() 76 os.Exit(retCode) 77 } 78 79 func setup() { 80 log.Root().SetHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(true))) 81 var err error 82 83 memdb := rawdb.NewMemoryDatabase() 84 db := state.NewDatabase(memdb) 85 86 publicStateDB, err = state.New(common.Hash{}, db) 87 if err != nil { 88 panic(err) 89 } 90 privateStateDB, err = state.New(common.Hash{}, db) 91 if err != nil { 92 panic(err) 93 } 94 95 private.P = &StubPrivateTransactionManager{} 96 97 key, _ := crypto.GenerateKey() 98 from := crypto.PubkeyToAddress(key.PublicKey) 99 100 arbitrarySimpleStorageContractAddress = crypto.CreateAddress(from, 0) 101 102 simpleStorageContractMessageCallTx = types.NewTransaction( 103 0, 104 arbitrarySimpleStorageContractAddress, 105 big.NewInt(0), 106 hexutil.MustDecodeUint64("0x47b760"), 107 big.NewInt(0), 108 hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000d")) 109 110 arbitraryStandardPrivateSimpleStorageContractAddress = crypto.CreateAddress(from, 1) 111 112 standardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction( 113 0, 114 arbitraryStandardPrivateSimpleStorageContractAddress, 115 big.NewInt(0), 116 hexutil.MustDecodeUint64("0x47b760"), 117 big.NewInt(0), 118 hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e")) 119 120 rawStandardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction( 121 0, 122 arbitraryStandardPrivateSimpleStorageContractAddress, 123 big.NewInt(0), 124 hexutil.MustDecodeUint64("0x47b760"), 125 big.NewInt(0), 126 arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes()) 127 128 } 129 130 func teardown() { 131 log.Root().SetHandler(log.DiscardHandler()) 132 } 133 134 func TestSimulateExecution_whenStandardPrivateCreation(t *testing.T) { 135 assert := assert.New(t) 136 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 137 138 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs) 139 140 assert.NoError(err, "simulate execution") 141 assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes") 142 assert.Equal(common.Hash{}, merkleRoot, "no private state validation") 143 } 144 145 func TestSimulateExecution_whenPartyProtectionCreation(t *testing.T) { 146 assert := assert.New(t) 147 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 148 149 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs) 150 151 assert.NoError(err, "simulation execution") 152 assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes") 153 assert.Equal(common.Hash{}, merkleRoot, "no private state validation") 154 } 155 156 func TestSimulateExecution_whenCreationWithStateValidation(t *testing.T) { 157 assert := assert.New(t) 158 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation 159 160 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs) 161 162 assert.NoError(err, "simulate execution") 163 assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes") 164 assert.NotEqual(common.Hash{}, merkleRoot, "private state validation") 165 } 166 167 func TestSimulateExecution_whenStandardPrivateMessageCall(t *testing.T) { 168 assert := assert.New(t) 169 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 170 171 privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002")) 172 privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 173 privateStateDB.Commit(true) 174 175 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs) 176 177 log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0})) 178 179 assert.NoError(err, "simulate execution") 180 assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes") 181 assert.Equal(common.Hash{}, merkleRoot, "no private state validation") 182 } 183 184 func TestSimulateExecution_StandardPrivateMessageCallSucceedsWheContractNotAvailableLocally(t *testing.T) { 185 assert := assert.New(t) 186 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 187 188 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs) 189 190 log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0})) 191 192 assert.NoError(err, "simulate execution") 193 assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes") 194 assert.Equal(common.Hash{}, merkleRoot, "no private state validation") 195 } 196 197 func TestSimulateExecution_whenPartyProtectionMessageCall(t *testing.T) { 198 assert := assert.New(t) 199 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 200 201 privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001")) 202 privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{ 203 PrivacyFlag: privateTxArgs.PrivacyFlag, 204 CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash, 205 }) 206 207 privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 208 privateStateDB.Commit(true) 209 210 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 211 212 expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash} 213 214 log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0})) 215 216 assert.NoError(err, "simulate execution") 217 assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes") 218 assert.Equal(common.Hash{}, merkleRoot, "no private state validation") 219 assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes)) 220 } 221 222 func TestSimulateExecution_whenPartyProtectionMessageCallAndPrivacyEnhancementsDisabled(t *testing.T) { 223 assert := assert.New(t) 224 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 225 226 params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil 227 defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }() 228 229 stbBackend := &StubBackend{} 230 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, stbBackend, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 231 232 // the simulation returns early without executing the transaction 233 assert.False(stbBackend.getEVMCalled, "simulation is ended early - before getEVM is called") 234 assert.NoError(err, "simulate execution") 235 assert.Empty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes") 236 assert.Equal(common.Hash{}, merkleRoot, "no private state validation") 237 } 238 239 func TestSimulateExecution_whenStateValidationMessageCall(t *testing.T) { 240 assert := assert.New(t) 241 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation 242 243 privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001")) 244 privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{ 245 PrivacyFlag: privateTxArgs.PrivacyFlag, 246 CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash, 247 }) 248 249 privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 250 privateStateDB.Commit(true) 251 252 affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 253 254 expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash} 255 256 log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0})) 257 258 assert.NoError(err, "simulate execution") 259 assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes") 260 assert.NotEqual(common.Hash{}, merkleRoot, "private state validation") 261 assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes)) 262 } 263 264 //mix and match flags 265 func TestSimulateExecution_PrivacyFlagPartyProtectionCallingStandardPrivateContract_Error(t *testing.T) { 266 assert := assert.New(t) 267 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 268 269 privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002")) 270 privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 271 privateStateDB.Commit(true) 272 273 _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs) 274 275 log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0})) 276 277 assert.Error(err, "simulate execution") 278 } 279 280 func TestSimulateExecution_StandardPrivateFlagCallingPartyProtectionContract_Error(t *testing.T) { 281 assert := assert.New(t) 282 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 283 284 privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001")) 285 privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{ 286 PrivacyFlag: engine.PrivacyFlagPartyProtection, 287 CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash, 288 }) 289 290 privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 291 privateStateDB.Commit(true) 292 293 _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 294 295 assert.Error(err, "simulate execution") 296 } 297 298 func TestSimulateExecution_StandardPrivateFlagCallingStateValidationContract_Error(t *testing.T) { 299 assert := assert.New(t) 300 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 301 302 privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001")) 303 privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{ 304 PrivacyFlag: engine.PrivacyFlagStateValidation, 305 CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash, 306 }) 307 308 privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 309 privateStateDB.Commit(true) 310 311 _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 312 313 log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0})) 314 315 assert.Error(err, "simulate execution") 316 } 317 318 func TestSimulateExecution_PartyProtectionFlagCallingStateValidationContract_Error(t *testing.T) { 319 assert := assert.New(t) 320 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 321 322 privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001")) 323 privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{ 324 PrivacyFlag: engine.PrivacyFlagStateValidation, 325 CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash, 326 }) 327 328 privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 329 privateStateDB.Commit(true) 330 331 _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 332 333 log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0})) 334 335 assert.Error(err, "simulate execution") 336 } 337 338 func TestSimulateExecution_StateValidationFlagCallingPartyProtectionContract_Error(t *testing.T) { 339 assert := assert.New(t) 340 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation 341 342 privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001")) 343 privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{ 344 PrivacyFlag: engine.PrivacyFlagPartyProtection, 345 CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash, 346 }) 347 348 privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100}) 349 privateStateDB.Commit(true) 350 351 _, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs) 352 353 //expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash} 354 355 log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0})) 356 357 assert.Error(err, "simulate execution") 358 } 359 360 func TestHandlePrivateTransaction_whenInvalidFlag(t *testing.T) { 361 assert := assert.New(t) 362 privateTxArgs.PrivacyFlag = 4 363 364 _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction) 365 366 assert.Error(err, "invalid privacyFlag") 367 } 368 369 func TestHandlePrivateTransaction_withPartyProtectionTxAndPrivacyEnhancementsIsDisabled(t *testing.T) { 370 assert := assert.New(t) 371 privateTxArgs.PrivacyFlag = 1 372 params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil 373 defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }() 374 375 _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction) 376 377 assert.Error(err, "PrivacyEnhancements are disabled. Can only accept transactions with PrivacyFlag=0(StandardPrivate).") 378 } 379 380 func TestHandlePrivateTransaction_whenStandardPrivateCreation(t *testing.T) { 381 assert := assert.New(t) 382 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 383 384 isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction) 385 386 if err != nil { 387 t.Fatalf("%s", err) 388 } 389 390 assert.True(isPrivate, "must be a private transaction") 391 } 392 393 func TestHandlePrivateTransaction_whenStandardPrivateCallingContractThatIsNotAvailableLocally(t *testing.T) { 394 assert := assert.New(t) 395 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 396 397 isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction) 398 399 assert.NoError(err, "no error expected") 400 401 assert.True(isPrivate, "must be a private transaction") 402 } 403 404 func TestHandlePrivateTransaction_whenPartyProtectionCallingContractThatIsNotAvailableLocally(t *testing.T) { 405 assert := assert.New(t) 406 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 407 408 isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction) 409 410 assert.Error(err, "handle invalid message call") 411 412 assert.True(isPrivate, "must be a private transaction") 413 } 414 415 func TestHandlePrivateTransaction_whenPartyProtectionCallingStandardPrivate(t *testing.T) { 416 assert := assert.New(t) 417 privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection 418 419 isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction) 420 421 assert.Error(err, "handle invalid message call") 422 423 assert.True(isPrivate, "must be a private transaction") 424 } 425 426 func TestHandlePrivateTransaction_whenRawStandardPrivateCreation(t *testing.T) { 427 assert := assert.New(t) 428 private.P = &StubPrivateTransactionManager{creation: true} 429 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 430 431 isPrivate, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawSimpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, RawTransaction) 432 433 assert.NoError(err, "raw standard private creation succeeded") 434 assert.True(isPrivate, "must be a private transaction") 435 } 436 437 func TestHandlePrivateTransaction_whenRawStandardPrivateMessageCall(t *testing.T) { 438 assert := assert.New(t) 439 private.P = &StubPrivateTransactionManager{creation: false} 440 privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate 441 442 _, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawStandardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, RawTransaction) 443 444 assert.NoError(err, "raw standard private msg call succeeded") 445 446 } 447 448 // Copy and set private 449 func copyTransaction(tx *types.Transaction) *types.Transaction { 450 var privateTx *types.Transaction 451 if tx.To() == nil { 452 privateTx = types.NewContractCreation(tx.Nonce(), 453 tx.Value(), 454 tx.Gas(), 455 tx.GasPrice(), 456 tx.Data()) 457 } else { 458 privateTx = types.NewTransaction(tx.Nonce(), 459 *tx.To(), 460 tx.Value(), 461 tx.Gas(), 462 tx.GasPrice(), 463 tx.Data()) 464 } 465 privateTx.SetPrivate() 466 return privateTx 467 } 468 469 type StubBackend struct { 470 getEVMCalled bool 471 mockAccountExtraDataStateGetter *vm.MockAccountExtraDataStateGetter 472 } 473 474 func (sb *StubBackend) SupportsMultitenancy(rpcCtx context.Context) (*proto.PreAuthenticatedAuthenticationToken, bool) { 475 panic("implement me") 476 } 477 478 func (sb *StubBackend) AccountExtraDataStateGetterByNumber(context.Context, rpc.BlockNumber) (vm.AccountExtraDataStateGetter, error) { 479 return sb.mockAccountExtraDataStateGetter, nil 480 } 481 482 func (sb *StubBackend) IsAuthorized(ctx context.Context, authToken *proto.PreAuthenticatedAuthenticationToken, attributes ...*multitenancy.ContractSecurityAttribute) (bool, error) { 483 panic("implement me") 484 } 485 486 func (sb *StubBackend) GetEVM(ctx context.Context, msg core.Message, state vm.MinimalApiState, header *types.Header) (*vm.EVM, func() error, error) { 487 sb.getEVMCalled = true 488 vmCtx := core.NewEVMContext(msg, &types.Header{ 489 Coinbase: arbitraryFrom, 490 Number: arbitraryCurrentBlockNumber, 491 Time: 0, 492 Difficulty: big.NewInt(0), 493 GasLimit: 0, 494 }, nil, &arbitraryFrom) 495 return vm.NewEVM(vmCtx, publicStateDB, privateStateDB, params.QuorumTestChainConfig, vm.Config{}), nil, nil 496 } 497 498 func (sb *StubBackend) CurrentBlock() *types.Block { 499 return types.NewBlock(&types.Header{ 500 Number: arbitraryCurrentBlockNumber, 501 }, nil, nil, nil) 502 } 503 504 func (sb *StubBackend) Downloader() *downloader.Downloader { 505 panic("implement me") 506 } 507 508 func (sb *StubBackend) ProtocolVersion() int { 509 panic("implement me") 510 } 511 512 func (sb *StubBackend) SuggestPrice(ctx context.Context) (*big.Int, error) { 513 panic("implement me") 514 } 515 516 func (sb *StubBackend) ChainDb() ethdb.Database { 517 panic("implement me") 518 } 519 520 func (sb *StubBackend) EventMux() *event.TypeMux { 521 panic("implement me") 522 } 523 524 func (sb *StubBackend) AccountManager() *accounts.Manager { 525 panic("implement me") 526 } 527 528 func (sb *StubBackend) ExtRPCEnabled() bool { 529 panic("implement me") 530 } 531 532 func (sb *StubBackend) CallTimeOut() time.Duration { 533 panic("implement me") 534 } 535 536 func (sb *StubBackend) RPCGasCap() *big.Int { 537 panic("implement me") 538 } 539 540 func (sb *StubBackend) SetHead(number uint64) { 541 panic("implement me") 542 } 543 544 func (sb *StubBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) { 545 panic("implement me") 546 } 547 548 func (sb *StubBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { 549 panic("implement me") 550 } 551 552 func (sb *StubBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) { 553 panic("implement me") 554 } 555 556 func (sb *StubBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) { 557 panic("implement me") 558 } 559 560 func (sb *StubBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { 561 panic("implement me") 562 } 563 564 func (sb *StubBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) { 565 panic("implement me") 566 } 567 568 func (sb *StubBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (vm.MinimalApiState, *types.Header, error) { 569 return &StubMinimalApiState{}, nil, nil 570 } 571 572 func (sb *StubBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (vm.MinimalApiState, *types.Header, error) { 573 return &StubMinimalApiState{}, nil, nil 574 } 575 576 func (sb *StubBackend) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) { 577 panic("implement me") 578 } 579 580 func (sb *StubBackend) GetTd(blockHash common.Hash) *big.Int { 581 panic("implement me") 582 } 583 584 func (sb *StubBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { 585 panic("implement me") 586 } 587 588 func (sb *StubBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { 589 panic("implement me") 590 } 591 592 func (sb *StubBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { 593 panic("implement me") 594 } 595 596 func (sb *StubBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error { 597 panic("implement me") 598 } 599 600 func (sb *StubBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { 601 panic("implement me") 602 } 603 604 func (sb *StubBackend) GetPoolTransactions() (types.Transactions, error) { 605 panic("implement me") 606 } 607 608 func (sb *StubBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction { 609 panic("implement me") 610 } 611 612 func (sb *StubBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) { 613 panic("implement me") 614 } 615 616 func (sb *StubBackend) Stats() (pending int, queued int) { 617 panic("implement me") 618 } 619 620 func (sb *StubBackend) TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { 621 panic("implement me") 622 } 623 624 func (sb *StubBackend) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription { 625 panic("implement me") 626 } 627 628 func (sb *StubBackend) BloomStatus() (uint64, uint64) { 629 panic("implement me") 630 } 631 632 func (sb *StubBackend) GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) { 633 panic("implement me") 634 } 635 636 func (sb *StubBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) { 637 panic("implement me") 638 } 639 640 func (sb *StubBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { 641 panic("implement me") 642 } 643 644 func (sb *StubBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { 645 panic("implement me") 646 } 647 648 func (sb *StubBackend) ChainConfig() *params.ChainConfig { 649 return params.QuorumTestChainConfig 650 } 651 652 type StubMinimalApiState struct { 653 } 654 655 func (StubMinimalApiState) GetBalance(addr common.Address) *big.Int { 656 panic("implement me") 657 } 658 659 func (StubMinimalApiState) SetBalance(addr common.Address, balance *big.Int) { 660 panic("implement me") 661 } 662 663 func (StubMinimalApiState) GetCode(addr common.Address) []byte { 664 return nil 665 } 666 667 func (StubMinimalApiState) GetState(a common.Address, b common.Hash) common.Hash { 668 panic("implement me") 669 } 670 671 func (StubMinimalApiState) GetNonce(addr common.Address) uint64 { 672 panic("implement me") 673 } 674 675 func (StubMinimalApiState) SetNonce(addr common.Address, nonce uint64) { 676 panic("implement me") 677 } 678 679 func (StubMinimalApiState) SetCode(common.Address, []byte) { 680 panic("implement me") 681 } 682 683 func (StubMinimalApiState) GetPrivacyMetadata(addr common.Address) (*state.PrivacyMetadata, error) { 684 panic("implement me") 685 } 686 687 func (StubMinimalApiState) GetManagedParties(addr common.Address) ([]string, error) { 688 panic("implement me") 689 } 690 691 func (StubMinimalApiState) GetRLPEncodedStateObject(addr common.Address) ([]byte, error) { 692 panic("implement me") 693 } 694 695 func (StubMinimalApiState) GetProof(common.Address) ([][]byte, error) { 696 panic("implement me") 697 } 698 699 func (StubMinimalApiState) GetStorageProof(common.Address, common.Hash) ([][]byte, error) { 700 panic("implement me") 701 } 702 703 func (StubMinimalApiState) StorageTrie(addr common.Address) state.Trie { 704 panic("implement me") 705 } 706 707 func (StubMinimalApiState) Error() error { 708 panic("implement me") 709 } 710 711 func (StubMinimalApiState) GetCodeHash(common.Address) common.Hash { 712 panic("implement me") 713 } 714 715 func (StubMinimalApiState) SetState(common.Address, common.Hash, common.Hash) { 716 panic("implement me") 717 } 718 719 func (StubMinimalApiState) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { 720 panic("implement me") 721 } 722 723 type StubPrivateTransactionManager struct { 724 notinuse.PrivateTransactionManager 725 creation bool 726 } 727 728 func (sptm *StubPrivateTransactionManager) Send(data []byte, from string, to []string, extra *engine.ExtraMetadata) (string, []string, common.EncryptedPayloadHash, error) { 729 return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash, nil 730 } 731 732 func (sptm *StubPrivateTransactionManager) EncryptPayload(data []byte, from string, to []string, extra *engine.ExtraMetadata) ([]byte, error) { 733 return nil, engine.ErrPrivateTxManagerNotSupported 734 } 735 736 func (sptm *StubPrivateTransactionManager) DecryptPayload(payload common.DecryptRequest) ([]byte, *engine.ExtraMetadata, error) { 737 return nil, nil, engine.ErrPrivateTxManagerNotSupported 738 } 739 740 func (sptm *StubPrivateTransactionManager) StoreRaw(data []byte, from string) (common.EncryptedPayloadHash, error) { 741 return arbitrarySimpleStorageContractEncryptedPayloadHash, nil 742 } 743 744 func (sptm *StubPrivateTransactionManager) SendSignedTx(data common.EncryptedPayloadHash, to []string, extra *engine.ExtraMetadata) (string, []string, []byte, error) { 745 return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes(), nil 746 } 747 748 func (sptm *StubPrivateTransactionManager) ReceiveRaw(data common.EncryptedPayloadHash) ([]byte, string, *engine.ExtraMetadata, error) { 749 if sptm.creation { 750 return hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"), "", nil, nil 751 } else { 752 return hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"), "", nil, nil 753 } 754 } 755 756 func (sptm *StubPrivateTransactionManager) HasFeature(f engine.PrivateTransactionManagerFeature) bool { 757 return true 758 }