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  }