state_set_utilities_test.go 11 KB

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