github.com/Unheilbar/quorum@v1.0.0/extension/privacyExtension/state_set_utilities_test.go (about) 1 package privacyExtension 2 3 import ( 4 "bytes" 5 "encoding/base64" 6 "encoding/json" 7 "testing" 8 9 "github.com/ethereum/go-ethereum/common" 10 "github.com/ethereum/go-ethereum/core" 11 "github.com/ethereum/go-ethereum/core/mps" 12 "github.com/ethereum/go-ethereum/core/rawdb" 13 "github.com/ethereum/go-ethereum/core/state" 14 "github.com/ethereum/go-ethereum/core/types" 15 extension "github.com/ethereum/go-ethereum/extension/extensionContracts" 16 "github.com/ethereum/go-ethereum/private/engine" 17 "github.com/ethereum/go-ethereum/private/engine/notinuse" 18 "github.com/stretchr/testify/assert" 19 ) 20 21 var input = `{"0x2222222222222222222222222222222222222222": 22 {"state": 23 {"balance":"22", 24 "nonce":5, 25 "root":"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", 26 "codeHash":"87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3", 27 "code":"03030303030303", 28 "storage":{ 29 "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421": "2a" 30 } 31 }}}` 32 33 func TestLogContainsExtensionTopicWithWrongLengthReturnsFalse(t *testing.T) { 34 testLog := &types.Log{ 35 Topics: []common.Hash{{}, {}}, 36 } 37 38 contained := logContainsExtensionTopic(testLog) 39 40 if contained { 41 t.Errorf("expected value '%t', but got '%t'", false, contained) 42 } 43 } 44 45 func TestLogContainsExtensionTopicWithWrongHashReturnsFalse(t *testing.T) { 46 testLog := &types.Log{ 47 Topics: []common.Hash{common.HexToHash("0xf20540914db019dd7c8d05ed165316a58d1583642772ac46f3d0c29b8644bd36")}, 48 } 49 50 contained := logContainsExtensionTopic(testLog) 51 52 if contained { 53 t.Errorf("expected value '%t', but got '%t'", false, contained) 54 } 55 } 56 57 func TestLogContainsExtensionTopicWithCorrectHashReturnsTrue(t *testing.T) { 58 testLog := &types.Log{ 59 Topics: []common.Hash{common.HexToHash("0x67a92539f3cbd7c5a9b36c23c0e2beceb27d2e1b3cd8eda02c623689267ae71e")}, 60 } 61 62 contained := logContainsExtensionTopic(testLog) 63 64 if !contained { 65 t.Errorf("expected value '%t', but got '%t'", true, contained) 66 } 67 } 68 69 func createStateDb(t *testing.T, metadata *state.PrivacyMetadata) *state.StateDB { 70 statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) 71 72 var accounts map[string]extension.AccountWithMetadata 73 if err := json.Unmarshal([]byte(input), &accounts); err != nil { 74 t.Errorf("error when unmarshalling static data: %s", err.Error()) 75 } 76 77 success := setState(statedb, accounts, metadata, nil) 78 if !success { 79 t.Errorf("unexpected error when setting state") 80 } 81 82 return statedb 83 } 84 85 func TestStateSetWithListedAccounts(t *testing.T) { 86 statedb := createStateDb(t, &state.PrivacyMetadata{}) 87 88 address := common.HexToAddress("0x2222222222222222222222222222222222222222") 89 balance := statedb.GetBalance(address) 90 code := statedb.GetCode(address) 91 nonce := statedb.GetNonce(address) 92 storage, _ := statedb.GetStorageRoot(address) 93 94 // we don't save PrivacyMetadata if it's standardprivate 95 privacyMetaData, err := statedb.GetPrivacyMetadata(address) 96 assert.Error(t, err, common.ErrNoAccountExtraData) 97 assert.Nil(t, privacyMetaData) 98 99 if balance.Uint64() != 22 { 100 t.Errorf("expect Balance value of '%d', but got '%d'", 22, balance.Uint64()) 101 return 102 } 103 104 expectedCode := []byte{3, 3, 3, 3, 3, 3, 3} 105 if !bytes.Equal(code, expectedCode) { 106 t.Errorf("expect Code value of '%d', but got '%d'", expectedCode, code) 107 return 108 } 109 110 if nonce != 5 { 111 t.Errorf("expect Nonce value of '%d', but got '%d'", 5, nonce) 112 return 113 } 114 115 expectedStorageHash := common.FromHex("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") 116 if !bytes.Equal(storage.Bytes(), expectedStorageHash) { 117 t.Errorf("expect Storage value of '%d', but got '%s'", expectedStorageHash, storage) 118 return 119 } 120 121 stateVal := statedb.GetState(address, common.BytesToHash(expectedStorageHash)) 122 assert.Equal(t, common.HexToHash("0x2a"), stateVal) 123 } 124 125 func TestStateSetWithListedAccountsFailsOnInvalidBalance(t *testing.T) { 126 input := `{"0x2222222222222222222222222222222222222222":{"state":{"balance":"invalid","nonce":5,"root":"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","codeHash":"87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3","code":"03030303030303","storage":{}}}}` 127 statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) 128 129 var accounts map[string]extension.AccountWithMetadata 130 if err := json.Unmarshal([]byte(input), &accounts); err != nil { 131 t.Errorf("error when unmarshalling static data: %s", err.Error()) 132 } 133 134 success := setState(statedb, accounts, &state.PrivacyMetadata{}, nil) 135 if success { 136 t.Errorf("error expected when setting state") 137 } 138 } 139 140 func Test_setPrivacyMetadata(t *testing.T) { 141 privacyMetaData := &state.PrivacyMetadata{} 142 143 statedb := createStateDb(t, privacyMetaData) 144 address := common.HexToAddress("0x2222222222222222222222222222222222222222") 145 146 // call setPrivacyMetaData 147 arbitraryBytes1 := []byte{10} 148 hash := common.BytesToEncryptedPayloadHash(arbitraryBytes1) 149 setPrivacyMetadata(statedb, address, base64.StdEncoding.EncodeToString(arbitraryBytes1)) 150 151 // we don't save PrivacyMetadata if it's standardprivate 152 _, err := statedb.GetPrivacyMetadata(address) 153 assert.Error(t, err, common.ErrNoAccountExtraData) 154 155 privacyMetaData = &state.PrivacyMetadata{CreationTxHash: hash, PrivacyFlag: engine.PrivacyFlagPartyProtection} 156 statedb.SetPrivacyMetadata(address, privacyMetaData) 157 158 privacyMetaData, err = statedb.GetPrivacyMetadata(address) 159 if err != nil { 160 t.Errorf("expected error to be nil, got err %s", err) 161 } 162 assert.Equal(t, engine.PrivacyFlagPartyProtection, privacyMetaData.PrivacyFlag) 163 assert.Equal(t, hash, privacyMetaData.CreationTxHash) 164 165 arbitraryBytes2 := []byte{20} 166 newHash := common.BytesToEncryptedPayloadHash(arbitraryBytes2) 167 setPrivacyMetadata(statedb, address, base64.StdEncoding.EncodeToString(arbitraryBytes2)) 168 169 privacyMetaData, err = statedb.GetPrivacyMetadata(address) 170 if err != nil { 171 t.Errorf("expected error to be nil, got err %s", err) 172 } 173 assert.Equal(t, engine.PrivacyFlagPartyProtection, privacyMetaData.PrivacyFlag) 174 assert.Equal(t, newHash, privacyMetaData.CreationTxHash) 175 } 176 177 func Test_setState_WithManagedParties(t *testing.T) { 178 statedb := createStateDb(t, &state.PrivacyMetadata{}) 179 address := common.HexToAddress("0x2222222222222222222222222222222222222222") 180 181 presetManagedParties := []string{"mp1", "mp2"} 182 statedb.SetManagedParties(address, presetManagedParties) 183 184 mp, err := statedb.GetManagedParties(address) 185 assert.Nil(t, err) 186 assert.EqualValues(t, presetManagedParties, mp) 187 188 extraManagedParties := []string{"mp1", "mp2", "mp3"} 189 var accounts map[string]extension.AccountWithMetadata 190 json.Unmarshal([]byte(input), &accounts) 191 success := setState(statedb, accounts, &state.PrivacyMetadata{}, extraManagedParties) 192 assert.True(t, success) 193 194 mp, err = statedb.GetManagedParties(address) 195 assert.Nil(t, err) 196 assert.EqualValues(t, []string{"mp1", "mp2", "mp3"}, mp) 197 } 198 199 func Test_validateAccountsExist_AllPresent(t *testing.T) { 200 expected := []common.Address{ 201 common.HexToAddress("0x2222222222222222222222222222222222222222"), 202 common.HexToAddress("0x3333333333333333333333333333333333333333"), 203 } 204 actual := map[string]extension.AccountWithMetadata{ 205 "0x2222222222222222222222222222222222222222": {}, 206 "0x3333333333333333333333333333333333333333": {}, 207 } 208 209 equal := validateAccountsExist(expected, actual) 210 211 assert.True(t, equal) 212 } 213 214 func Test_validateAccountsExist_NotAllPresent(t *testing.T) { 215 expected := []common.Address{ 216 common.HexToAddress("0x2222222222222222222222222222222222222222"), 217 common.HexToAddress("0x3333333333333333333333333333333333333333"), 218 } 219 actual := map[string]extension.AccountWithMetadata{ 220 "0x2222222222222222222222222222222222222222": {}, 221 "0x4444444444444444444444444444444444444444": {}, 222 } 223 224 equal := validateAccountsExist(expected, actual) 225 226 assert.False(t, equal) 227 } 228 229 func Test_setManagedParties(t *testing.T) { 230 statedb := createStateDb(t, &state.PrivacyMetadata{}) 231 address := common.HexToAddress("0x2222222222222222222222222222222222222222") 232 233 presetManagedParties := []string{"mp1", "mp2"} 234 statedb.SetManagedParties(address, presetManagedParties) 235 236 mp, err := statedb.GetManagedParties(address) 237 assert.Nil(t, err) 238 assert.EqualValues(t, presetManagedParties, mp) 239 240 extraManagedParties := []string{"mp1", "mp3"} 241 mpm := &mockPrivateTransactionManager{ 242 returns: map[string][]interface{}{"Receive": {"", extraManagedParties, nil, nil, nil}}, 243 } 244 245 ptmHash := common.EncryptedPayloadHash{86}.ToBase64() 246 setManagedParties(mpm, statedb, address, ptmHash) 247 248 mp, err = statedb.GetManagedParties(address) 249 assert.Nil(t, err) 250 assert.Len(t, mp, 3) 251 assert.Contains(t, mp, "mp1") 252 assert.Contains(t, mp, "mp2") 253 assert.Contains(t, mp, "mp3") 254 } 255 256 func Test_setManagedPartiesInvalidHash(t *testing.T) { 257 statedb := createStateDb(t, &state.PrivacyMetadata{}) 258 address := common.HexToAddress("0x2222222222222222222222222222222222222222") 259 260 presetManagedParties := []string{"mp1", "mp2"} 261 statedb.SetManagedParties(address, presetManagedParties) 262 263 mp, err := statedb.GetManagedParties(address) 264 assert.Nil(t, err) 265 assert.EqualValues(t, presetManagedParties, mp) 266 267 extraManagedParties := []string{"mp1", "mp3"} 268 mpm := &mockPrivateTransactionManager{ 269 returns: map[string][]interface{}{"Receive": {"", extraManagedParties, nil, nil, nil}}, 270 } 271 272 ptmHash := common.EncryptedPayloadHash{86}.Hex() //should be base64, so hex will fail 273 setManagedParties(mpm, statedb, address, ptmHash) 274 275 mp, err = statedb.GetManagedParties(address) 276 assert.Nil(t, err) 277 assert.EqualValues(t, presetManagedParties, mp) 278 } 279 280 type mockPSMR struct { 281 core.DefaultPrivateStateManager 282 returns map[string][]interface{} 283 } 284 285 type mockPrivateTransactionManager struct { 286 notinuse.PrivateTransactionManager 287 returns map[string][]interface{} 288 } 289 290 func (mpsmr *mockPSMR) ResolveForManagedParty(managedParty string) (*mps.PrivateStateMetadata, error) { 291 values := mpsmr.returns["ResolveForManagedParty"] 292 var ( 293 r1 *mps.PrivateStateMetadata 294 r2 error 295 ) 296 if values[0] != nil { 297 r1 = values[0].(*mps.PrivateStateMetadata) 298 } 299 if values[1] != nil { 300 r2 = values[1].(error) 301 } 302 return r1, r2 303 } 304 305 func (mpm *mockPrivateTransactionManager) Receive(data common.EncryptedPayloadHash) (string, []string, []byte, *engine.ExtraMetadata, error) { 306 values := mpm.returns["Receive"] 307 var ( 308 r1 string 309 r2 []string 310 r3 []byte 311 r4 *engine.ExtraMetadata 312 r5 error 313 ) 314 if values[0] != nil { 315 r1 = values[0].(string) 316 } 317 if values[1] != nil { 318 r2 = values[1].([]string) 319 } 320 if values[2] != nil { 321 r3 = values[2].([]byte) 322 } 323 if values[3] != nil { 324 r4 = values[3].(*engine.ExtraMetadata) 325 } 326 if values[4] != nil { 327 r5 = values[4].(error) 328 } 329 return r1, r2, r3, r4, r5 330 } 331 332 func (mpm *mockPrivateTransactionManager) IsSender(txHash common.EncryptedPayloadHash) (bool, error) { 333 values := mpm.returns["IsSender"] 334 var ( 335 r1 bool 336 r2 error 337 ) 338 if values[0] != nil { 339 r1 = values[0].(bool) 340 } 341 if values[1] != nil { 342 r2 = values[1].(error) 343 } 344 return r1, r2 345 } 346 347 func (mpm *mockPrivateTransactionManager) DecryptPayload(payload common.DecryptRequest) ([]byte, *engine.ExtraMetadata, error) { 348 values := mpm.returns["DecryptPayload"] 349 var ( 350 r3 []byte 351 r4 *engine.ExtraMetadata 352 r5 error 353 ) 354 if values[0] != nil { 355 r3 = values[0].([]byte) 356 } 357 if values[1] != nil { 358 r4 = values[1].(*engine.ExtraMetadata) 359 } 360 if values[2] != nil { 361 r5 = values[2].(error) 362 } 363 return r3, r4, r5 364 } 365 366 func (mpm *mockPrivateTransactionManager) GetCache() state.Database { 367 return nil 368 }