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