diff --git a/cmd/hack/hack.go b/cmd/hack/hack.go index e9d8a273f21b4d4a6726d14dd98447b51a8e5eeb..5cb0e7ddfdfe507096bd6d7e7dcd38ca39d54515 100644 --- a/cmd/hack/hack.go +++ b/cmd/hack/hack.go @@ -26,7 +26,6 @@ import ( "github.com/ledgerwatch/turbo-geth/common" "github.com/ledgerwatch/turbo-geth/common/changeset" "github.com/ledgerwatch/turbo-geth/common/dbutils" - "github.com/ledgerwatch/turbo-geth/common/debug" "github.com/ledgerwatch/turbo-geth/consensus/ethash" "github.com/ledgerwatch/turbo-geth/core" "github.com/ledgerwatch/turbo-geth/core/rawdb" @@ -789,7 +788,6 @@ func testStartup() { } func testResolveCached() { - debug.IntermediateTrieHashAssertDbIntegrity = true execToBlock(node.DefaultDataDir()+"/geth/chaindata", 100_000_000, false) return //startTime := time.Now() @@ -1936,57 +1934,62 @@ func validateTxLookups2(db *ethdb.BoltDatabase, startBlock uint64, interruptCh c } func indexSize(chaindata string) { + //db, err := bolt.Open(chaindata, 0600, &bolt.Options{ReadOnly: true}) db, err := ethdb.NewBoltDatabase(chaindata) check(err) + defer db.Close() fStorage, err := os.Create("index_sizes_storage.csv") check(err) + defer fStorage.Close() fAcc, err := os.Create("index_sizes_acc.csv") check(err) + defer fAcc.Close() csvAcc := csv.NewWriter(fAcc) + defer csvAcc.Flush() err = csvAcc.Write([]string{"key", "ln"}) check(err) csvStorage := csv.NewWriter(fStorage) + defer csvStorage.Flush() err = csvStorage.Write([]string{"key", "ln"}) + i := 0 - j := 0 maxLenAcc := 0 - maxLenSt := 0 - db.Walk(dbutils.AccountsHistoryBucket, []byte{}, 0, func(k, v []byte) (b bool, e error) { - if i > 10000 { - fmt.Println(j) - i = 0 - } + if err := db.Walk(dbutils.AccountsHistoryBucket, []byte{}, 0, func(k, v []byte) (b bool, e error) { i++ - j++ + if i%10_000_000 == 0 { + fmt.Println(i/10_000_000, maxLenAcc) + } if len(v) > maxLenAcc { maxLenAcc = len(v) } - err = csvAcc.Write([]string{common.Bytes2Hex(k), strconv.Itoa(len(v))}) - if err != nil { + if err := csvAcc.Write([]string{common.Bytes2Hex(k), strconv.Itoa(len(v))}); err != nil { panic(err) } return true, nil - }) + }); err != nil { + check(err) + } + i = 0 - j = 0 - db.Walk(dbutils.StorageHistoryBucket, []byte{}, 0, func(k, v []byte) (b bool, e error) { - if i > 10000 { - fmt.Println(j) - i = 0 - } + maxLenSt := 0 + if err := db.Walk(dbutils.StorageHistoryBucket, []byte{}, 0, func(k, v []byte) (b bool, e error) { i++ - j++ + if i%10_000_000 == 0 { + fmt.Println(i/10_000_000, maxLenSt) + } + if len(v) > maxLenSt { maxLenSt = len(v) } - err = csvStorage.Write([]string{common.Bytes2Hex(k), strconv.Itoa(len(v))}) - if err != nil { + if err := csvStorage.Write([]string{common.Bytes2Hex(k), strconv.Itoa(len(v))}); err != nil { panic(err) } return true, nil - }) + }); err != nil { + check(err) + } fmt.Println("Results:") fmt.Println("maxLenAcc:", maxLenAcc) diff --git a/cmd/restapi/apis/intermediate_hash_api.go b/cmd/restapi/apis/intermediate_hash_api.go new file mode 100644 index 0000000000000000000000000000000000000000..54df893109f76382166b568f32173005df011fcd --- /dev/null +++ b/cmd/restapi/apis/intermediate_hash_api.go @@ -0,0 +1,71 @@ +package apis + +import ( + "context" + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/ledgerwatch/turbo-geth/common" + "github.com/ledgerwatch/turbo-geth/common/dbutils" + "github.com/ledgerwatch/turbo-geth/ethdb" +) + +func RegisterIntermediateHashAPI(router *gin.RouterGroup, e *Env) error { + router.GET("/", e.FindIntermediateHash) + return nil +} + +func (e *Env) FindIntermediateHash(c *gin.Context) { + results, err := findIntermediateHashByPrefix(c.Query("prefix"), c.Query("tombstones") == "on", e.DB) + if err != nil { + c.Error(err) //nolint:errcheck + return + } + c.JSON(http.StatusOK, results) +} + +type IntermediateHashResponse struct { + Prefix string `json:"prefix"` + Value string `json:"value"` +} + +func findIntermediateHashByPrefix(prefixS string, tombstones bool, remoteDB ethdb.KV) ([]*IntermediateHashResponse, error) { + var results []*IntermediateHashResponse + prefix := common.FromHex(prefixS) + if err := remoteDB.View(context.TODO(), func(tx ethdb.Tx) error { + interBucket := tx.Bucket(dbutils.IntermediateTrieHashBucket) + c := interBucket.Cursor().Prefix(prefix) + + for k, v, err := c.First(); k != nil || err != nil; k, v, err = c.Next() { + if err != nil { + return err + } + + if tombstones && len(v) > 0 { + continue + } + if !tombstones && len(v) == 0 { + continue + } + + results = append(results, &IntermediateHashResponse{ + Prefix: fmt.Sprintf("%x\n", k), + Value: fmt.Sprintf("%x\n", v), + }) + + if len(results) > 50 { + results = append(results, &IntermediateHashResponse{ + Prefix: "too much results", + }) + return nil + } + } + + return nil + }); err != nil { + return nil, err + } + + return results, nil +} diff --git a/cmd/restapi/rest/serve_rest.go b/cmd/restapi/rest/serve_rest.go index 553bcf17e921a78cc053c2cf9c9052b4165c0fae..9c2e70a0349a66a280d9cb7cfaad284b238803fe 100644 --- a/cmd/restapi/rest/serve_rest.go +++ b/cmd/restapi/rest/serve_rest.go @@ -49,6 +49,9 @@ func ServeREST(ctx context.Context, localAddress, remoteDBAddress string) error if err = apis.RegisterStorageAPI(root.Group("storage"), e); err != nil { return err } + if err = apis.RegisterIntermediateHashAPI(root.Group("intermediate-hash"), e); err != nil { + return err + } log.Printf("serving on %v... press ctrl+C to abort\n", localAddress) diff --git a/common/debug/experiments.go b/common/debug/experiments.go index 17de94a1f8c39cce2481d36213c0fb468e691481..70f2f8270d2e36303b1d08dccb50c04c4f4c5fc2 100644 --- a/common/debug/experiments.go +++ b/common/debug/experiments.go @@ -53,6 +53,3 @@ func OverrideGetNodeData(val bool) { atomic.StoreUint32(&getNodeData, gndInitializedFlag) } } - -// --------------- Flags which are enabling additional runtime checks and asserts ---------------- -var IntermediateTrieHashAssertDbIntegrity = false diff --git a/core/state/database.go b/core/state/database.go index 238f701afec8bc7111bc6749ed5592c9baea269e..3c641c2f96cdc64c5502d3e298a643a8e6ac822f 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -706,6 +706,7 @@ func (tds *TrieDbState) updateTrieRoots(forward bool) ([]common.Hash, error) { if len(v) > 0 { //fmt.Printf("Update storage trie addrHash %x, keyHash %x: %x\n", addrHash, keyHash, v) if forward { + _ = ClearTombstonesForNewStorage(tds.db, cKey) tds.t.Update(cKey, v) } else { // If rewinding, it might not be possible to execute storage item update. @@ -802,6 +803,7 @@ func (tds *TrieDbState) updateTrieRoots(forward bool) ([]common.Hash, error) { } tds.t.DeleteSubtree(addrHash[:]) + _ = PutTombstoneForDeletedAccount(tds.db, addrHash[:]) } roots[i] = tds.t.Hash() } diff --git a/core/state/intermediate_hashes.go b/core/state/intermediate_hashes.go index ca60be45df3011b159d061a374bccdf9f8b05a51..6240a1343ebfd0881ca7790fdf3803c8be1b0e76 100644 --- a/core/state/intermediate_hashes.go +++ b/core/state/intermediate_hashes.go @@ -1,6 +1,10 @@ package state import ( + "bytes" + "fmt" + + "github.com/ledgerwatch/bolt" "github.com/ledgerwatch/turbo-geth/common" "github.com/ledgerwatch/turbo-geth/common/dbutils" "github.com/ledgerwatch/turbo-geth/common/pool" @@ -28,6 +32,7 @@ func (ih *IntermediateHashes) WillUnloadBranchNode(prefixAsNibbles []byte, nodeH } key := pool.GetBuffer(keyBufferSize) + defer pool.PutBuffer(key) trie.CompressNibbles(prefixAsNibbles, &key.B) if err := ih.putter.Put(dbutils.IntermediateTrieHashBucket, common.CopyBytes(key.B), common.CopyBytes(nodeHash[:])); err != nil { @@ -42,10 +47,92 @@ func (ih *IntermediateHashes) BranchNodeLoaded(prefixAsNibbles []byte) { } key := pool.GetBuffer(keyBufferSize) + defer pool.PutBuffer(key) trie.CompressNibbles(prefixAsNibbles, &key.B) - if err := ih.deleter.Delete(dbutils.IntermediateTrieHashBucket, key.B); err != nil { + if err := ih.deleter.Delete(dbutils.IntermediateTrieHashBucket, common.CopyBytes(key.B)); err != nil { log.Warn("could not delete intermediate trie hash", "err", err) return } } + +// PutTombstoneForDeletedAccount - placing tombstone only if given account has storage in database +func PutTombstoneForDeletedAccount(db ethdb.Database, addrHash []byte) error { + if len(addrHash) != common.HashLength { + return nil + } + + hasIH := false + if err := db.Walk(dbutils.IntermediateTrieHashBucket, addrHash, 32*8, func(_ []byte, _ []byte) (bool, error) { + hasIH = true + return false, nil + }); err != nil { + return err + } + + if !hasIH { + return nil + } + + return db.Put(dbutils.IntermediateTrieHashBucket, common.CopyBytes(addrHash), []byte{}) +} + +func ClearTombstonesForNewStorage(db ethdb.MinDatabase, storageKeyNoInc []byte) error { + var boltDb *bolt.DB + if hasKV, ok := db.(ethdb.HasKV); ok { + boltDb = hasKV.KV() + } else { + return fmt.Errorf("only Bolt supported yet, given: %T", db) + } + + var toPut [][]byte + toDelete := map[string]struct{}{} + + if err := boltDb.View(func(tx *bolt.Tx) error { + c := tx.Bucket(dbutils.IntermediateTrieHashBucket).Cursor() + + i := common.HashLength + var k, v []byte + for ; i < len(storageKeyNoInc); i++ { + k, v = c.Seek(storageKeyNoInc[:i]) + if k == nil { + return nil + } + + isTombstone := v != nil && len(v) == 0 + if isTombstone && bytes.HasPrefix(storageKeyNoInc, k) { + break + } + } + + for ; bytes.HasPrefix(k, storageKeyNoInc[:i]); k, v = c.Next() { + isTombstone := v != nil && len(v) == 0 + if isTombstone && bytes.HasPrefix(storageKeyNoInc, k) { + toDelete[string(k)] = struct{}{} + } else { + for j := i; j < len(k); j++ { + if storageKeyNoInc[j] != k[j] { + toPut = append(toPut, common.CopyBytes(k[:j+1])) + break + } + } + } + } + return nil + }); err != nil { + return err + } + for _, k := range toPut { + if err := db.Put(dbutils.IntermediateTrieHashBucket, k, []byte{}); err != nil { + return err + } + } + + for k := range toDelete { + if err := db.Delete(dbutils.IntermediateTrieHashBucket, []byte(k)); err != nil { + return err + } + } + + return nil +} diff --git a/core/state/intermediate_hashes_test.go b/core/state/intermediate_hashes_test.go new file mode 100644 index 0000000000000000000000000000000000000000..4d9a8067155c509b0004da6a7bf0b74f495e4d6a --- /dev/null +++ b/core/state/intermediate_hashes_test.go @@ -0,0 +1,161 @@ +package state_test + +import ( + "errors" + "fmt" + "testing" + + "github.com/ledgerwatch/turbo-geth/common" + "github.com/ledgerwatch/turbo-geth/common/dbutils" + "github.com/ledgerwatch/turbo-geth/core/state" + "github.com/ledgerwatch/turbo-geth/core/types/accounts" + "github.com/ledgerwatch/turbo-geth/ethdb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestClearTombstonesForReCreatedAccount(t *testing.T) { + require, assert, db := require.New(t), assert.New(t), ethdb.NewMemDatabase() + + accKey := fmt.Sprintf("11%062x", 0) + k1 := "11" + k2 := "2211" + k3 := "2233" + k4 := "44" + + putTombStone := func(k string, v []byte) { + err := db.Put(dbutils.IntermediateTrieHashBucket, common.FromHex(k), v) + require.NoError(err) + } + + //printBucket := func() { + // fmt.Printf("IH bucket print\n") + // _ = db.KV().View(func(tx *bolt.Tx) error { + // tx.Bucket(dbutils.IntermediateTrieHashBucket).ForEach(func(k, v []byte) error { + // if len(v) == 0 { + // fmt.Printf("IH: %x\n", k) + // } + // return nil + // }) + // return nil + // }) + // fmt.Printf("IH bucket print END\n") + //} + + acc := accounts.NewAccount() + acc.Incarnation = 1 + encodedAcc := make([]byte, acc.EncodingLengthForStorage()) + acc.EncodeForStorage(encodedAcc) + err := db.Put(dbutils.AccountsBucket, common.FromHex(accKey), encodedAcc) + require.NoError(err) + + putTombStone(accKey+k1, []byte{}) + putTombStone(accKey+k2, []byte{1}) + putTombStone(accKey+k3, []byte{1}) + putTombStone(accKey+k4, []byte{1}) + + // step 1: delete account + batch := db.NewBatch() + err = state.PutTombstoneForDeletedAccount(batch, common.FromHex(accKey)) + require.NoError(err) + _, err = batch.Commit() + require.NoError(err) + //printBucket() + + untouchedAcc := fmt.Sprintf("99%062x", 0) + checks := map[string]bool{ + accKey: true, + untouchedAcc: false, + } + + for k, expect := range checks { + ok, err1 := HasTombstone(db, common.FromHex(k)) + require.NoError(err1, k) + assert.Equal(expect, ok, k) + } + + // step 2: re-create storage + batch = db.NewBatch() + err = state.ClearTombstonesForNewStorage(batch, common.FromHex(accKey+k2+fmt.Sprintf("%062x", 0))) + require.NoError(err) + _, err = batch.Commit() + require.NoError(err) + //printBucket() + + checks = map[string]bool{ + accKey: false, + accKey + "11": true, + accKey + k2: false, + accKey + "22": false, + accKey + "2200": false, + accKey + "2211": false, + accKey + "2233": true, + accKey + "223300": false, + accKey + "22ab": false, + accKey + "44": true, + } + + for k, expect := range checks { + ok, err1 := HasTombstone(db, common.FromHex(k)) + require.NoError(err1, k) + assert.Equal(expect, ok, k) + } + + // step 3: create one new storage + batch = db.NewBatch() + err = state.ClearTombstonesForNewStorage(batch, common.FromHex(accKey+k4+fmt.Sprintf("%062x", 0))) + require.NoError(err) + _, err = batch.Commit() + require.NoError(err) + //printBucket() + + checks = map[string]bool{ + accKey + k2: false, // results of step2 preserved + accKey + "22": false, // results of step2 preserved + accKey + "2211": false, // results of step2 preserved + accKey + "22110000": false, // results of step2 preserved + accKey + "2233": true, // results of step2 preserved + accKey + "44": false, // results of step2 preserved + } + + for k, expect := range checks { + ok, err1 := HasTombstone(db, common.FromHex(k)) + require.NoError(err1, k) + assert.Equal(expect, ok, k) + } + + // step 4: delete account again - it must remove all tombstones and keep only 1 which will cover account itself + batch = db.NewBatch() + err = state.PutTombstoneForDeletedAccount(batch, common.FromHex(accKey)) + require.NoError(err) + _, err = batch.Commit() + require.NoError(err) + //printBucket() + + checks = map[string]bool{ + accKey: true, + untouchedAcc: false, + + // accKey + "2233" was true on previous step, don't delete this tombstone even one with shorter prefix exists. + // Because account creation must do predictable amount of operations. + accKey + "2233": true, + } + + for k, expect := range checks { + ok, err1 := HasTombstone(db, common.FromHex(k)) + require.NoError(err1, k) + assert.Equal(expect, ok, k) + } + +} + +func HasTombstone(db ethdb.MinDatabase, prefix []byte) (bool, error) { + v, err := db.Get(dbutils.IntermediateTrieHashBucket, prefix) + if err != nil { + if errors.Is(err, ethdb.ErrKeyNotFound) { + return false, nil + } + return false, err + } + return v != nil && len(v) == 0, nil +} diff --git a/debug-web-ui/package.json b/debug-web-ui/package.json index 2919ada507685c8dc4c186fc4bfe7fa1666038d5..5da3d7d69bcda0faabab325f48217f991576c678 100644 --- a/debug-web-ui/package.json +++ b/debug-web-ui/package.json @@ -12,10 +12,10 @@ "react-scripts": "3.4.1" }, "devDependencies": { - "@testing-library/jest-dom": "^5.1.1", - "@testing-library/react": "^10.0.1", - "@testing-library/user-event": "^10.0.0", - "prettier": "^2.0.2" + "@testing-library/jest-dom": "^5.3.0", + "@testing-library/react": "^10.0.2", + "@testing-library/user-event": "^10.0.1", + "prettier": "^2.0.4" }, "scripts": { "start": "react-scripts start", diff --git a/debug-web-ui/src/App.js b/debug-web-ui/src/App.js index 651bc68e2449e11eb8ca9380f8441692a0e959fb..87d5a77862933e38d4699d45cd6370d18d19bdf3 100644 --- a/debug-web-ui/src/App.js +++ b/debug-web-ui/src/App.js @@ -1,12 +1,13 @@ import React, { useState } from 'react'; +import './App.css'; import { Col, Container, Nav, Row } from 'react-bootstrap'; import API from './utils/API.js'; import ErrorCatcher from './components/ErrorCatcher.js'; import { BrowserRouter as Router, Link, NavLink, Redirect, Route, Switch } from 'react-router-dom'; import AccountsPage from './page/Accounts'; +import IntermediateHashPage from './page/IntermediateHashPage'; import { ReactComponent as Logo } from './logo.svg'; -import './App.css'; import StoragePage from './page/Storage'; import RemoteSidebar from './components/RemoteSidebar'; @@ -19,6 +20,10 @@ const sidebar = [ url: '/storage', label: 'Storage', }, + { + url: '/intermediate-hash', + label: 'Inter Hash', + }, ]; function App() { @@ -63,6 +68,9 @@ function App() { <Route path="/storage"> <StoragePage api={api} /> </Route> + <Route path="/intermediate-hash"> + <IntermediateHashPage api={api} /> + </Route> </Switch> </Col> </Row> diff --git a/debug-web-ui/src/components/LookupAccountForm.js b/debug-web-ui/src/components/LookupAccountForm.js index f6782664f45488ed9c15a815da137d7a643b22a7..9297ff459e886b52f4bfc7283ca1e5213d34ec2f 100644 --- a/debug-web-ui/src/components/LookupAccountForm.js +++ b/debug-web-ui/src/components/LookupAccountForm.js @@ -29,7 +29,8 @@ const LookupAccountForm = ({ api }) => { <div> <SearchField placeholder="lookup by id or hash" - onClick={(id) => loadAccount(id, api).then(lookupSuccess).catch(lookupFail)} + disabled={state.loading} + onSubmit={(data) => loadAccount(data.search, api).then(lookupSuccess).catch(lookupFail)} /> <hr /> {state.account && <DetailsForm account={state.account} />} diff --git a/debug-web-ui/src/components/LookupIntermediateHashForm.js b/debug-web-ui/src/components/LookupIntermediateHashForm.js new file mode 100644 index 0000000000000000000000000000000000000000..beb5230db1d1cbeecaa14bae506840ba791a24b6 --- /dev/null +++ b/debug-web-ui/src/components/LookupIntermediateHashForm.js @@ -0,0 +1,77 @@ +import React, { useState } from 'react'; + +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; +import { Form, Spinner, Table } from 'react-bootstrap'; + +import SearchField from './SearchField.js'; + +const search = (prefix, tombstones, api, setState) => { + setState({ hashes: undefined, loading: true }); + + const lookupSuccess = (response) => setState({ hashes: response.data, loading: false }); + const lookupFail = (error) => { + setState({ hashes: undefined, loading: false }); + + setState(() => { + throw error; + }); + }; + + return api.lookupStorageTombstones(prefix, tombstones).then(lookupSuccess).catch(lookupFail); +}; + +const LookupIntermediateHashForm = ({ api }) => { + const [state, setState] = useState({ hashes: undefined, loading: false }); + + return ( + <div> + <SearchField + placeholder="lookup by prefix" + disabled={state.loading} + onSubmit={(data) => search(data.search, data.tombstones, api, setState)} + > + <Form.Check name="tombstones" type="checkbox" label="Show tombstones" /> + </SearchField> + {state.loading && <Spinner animation="border" />} + {state.hashes && <Details hashes={state.hashes} />} + </div> + ); +}; + +const Details = ({ hashes }) => ( + <Row> + <Col> + <Table size="sm" borderless> + <thead> + <tr> + <th> + <strong>Key</strong> + </th> + <th> + <strong>Value</strong> + </th> + </tr> + </thead> + <tbody> + {hashes.map((item, i) => ( + <TableRow key={i} item={item} /> + ))} + </tbody> + </Table> + </Col> + </Row> +); + +const TableRow = ({ item }) => { + const { prefix, value } = item; + + return ( + <tr> + <td className="text-monospace">{prefix}</td> + <td className="text-monospace">{value}</td> + </tr> + ); +}; + +export default LookupIntermediateHashForm; diff --git a/debug-web-ui/src/components/LookupStorageForm.js b/debug-web-ui/src/components/LookupStorageForm.js index 9f301a316adb6cd9491a6e5527fe6e234a73f337..fa4751f1bdc8e53bda4fe2dc99e2c90bf2810404 100644 --- a/debug-web-ui/src/components/LookupStorageForm.js +++ b/debug-web-ui/src/components/LookupStorageForm.js @@ -24,10 +24,12 @@ const LookupStorageForm = ({ api }) => { return ( <div> + <SearchField + placeholder="lookup by prefix" + disabled={state.loading} + onSubmit={(data) => search(data.search, api, setState)} + /> {state.loading && <Spinner animation="border" />} - {!state.loading && ( - <SearchField placeholder="lookup by prefix" onClick={(prefix) => search(prefix, api, setState)} /> - )} {state.data && <Details data={state.data} />} </div> ); diff --git a/debug-web-ui/src/components/SearchField.js b/debug-web-ui/src/components/SearchField.js index a1a8a749802b33f0fafef9469b0996157a5885a7..5777ab38a6042a67859b87621236a8c4c043f7fd 100644 --- a/debug-web-ui/src/components/SearchField.js +++ b/debug-web-ui/src/components/SearchField.js @@ -4,45 +4,34 @@ import Form from 'react-bootstrap/Form'; import Col from 'react-bootstrap/Col'; import Button from 'react-bootstrap/Button'; -class SearchField extends React.Component { - constructor(props) { - super(props); - this.state = { value: '' }; - - this.handleChange = this.handleChange.bind(this); - this.handleSubmit = this.handleSubmit.bind(this); - } - - handleChange(event) { - this.setState({ value: event.target.value }); - } - - handleSubmit(event) { - this.props.onClick(this.state.value); +const SearchField = (props) => { + const handleSubmit = (event) => { event.preventDefault(); - } + let data = {}; + const formData = new FormData(event.target); + for (const [key, value] of formData.entries()) { + data[key] = value; + } + props.onSubmit(data); + }; - render() { - return ( - <Form onSubmit={this.handleSubmit}> - <Form.Row> - <Col> - <Form.Control - size="sm" - placeholder={this.props.placeholder} - value={this.state.value || ''} - onChange={this.handleChange} - /> - </Col> - <Col> - <Button variant="primary" type="submit" size="sm"> - Find - </Button> - </Col> - </Form.Row> - </Form> - ); - } -} + return ( + <Form onSubmit={handleSubmit} disabled={props.disabled}> + <Form.Row> + <Col> + <Form.Control size="sm" name="search" placeholder={props.placeholder} /> + </Col> + <Col> + <Button disabled={props.disabled} variant="primary" type="submit" size="sm"> + Find + </Button> + </Col> + </Form.Row> + <Form.Row> + <Col>{props.children}</Col> + </Form.Row> + </Form> + ); +}; export default SearchField; diff --git a/debug-web-ui/src/components/StorageTombstonesIntegrityChecks.js b/debug-web-ui/src/components/StorageTombstonesIntegrityChecks.js deleted file mode 100644 index d78208c74c7f76a632c0121978346c1391c0acea..0000000000000000000000000000000000000000 --- a/debug-web-ui/src/components/StorageTombstonesIntegrityChecks.js +++ /dev/null @@ -1,68 +0,0 @@ -import React, { useState } from 'react'; - -import Row from 'react-bootstrap/Row'; -import Col from 'react-bootstrap/Col'; -import { Button, Spinner, Table } from 'react-bootstrap'; - -const load = (api, setState) => { - const lookupSuccess = (response) => setState({ data: response.data, loading: false }); - const lookupFail = (error) => { - setState({ data: undefined, loading: false }); - - setState(() => { - throw error; - }); - }; - - setState({ data: undefined, loading: true }); - return api.storageTombstonesIntegrityChecks().then(lookupSuccess).catch(lookupFail); -}; - -const StorageTombstonesIntegrityChecks = ({ api }) => { - const [state, setState] = useState({ data: undefined, loading: false }); - - return ( - <div> - {state.loading && <Spinner animation="border" />} - {!state.loading && ( - <Button size="sm" onClick={() => load(api, setState)}> - Integrity Checks - </Button> - )} - {state.data && <DetailsForm data={state.data} />} - </div> - ); -}; - -const DetailsForm = ({ data }) => ( - <Row> - <Col> - <Table size="sm" borderless> - <thead> - <tr> - <th> - <strong>Check</strong> - </th> - <th>Result</th> - </tr> - </thead> - <tbody> - {data.map((el, i) => ( - <TableRow key={i} name={el.name} value={el.value} /> - ))} - </tbody> - </Table> - </Col> - </Row> -); - -const TableRow = ({ name, value }) => ( - <tr> - <td>{name}</td> - <td> - <code>{value}</code> - </td> - </tr> -); - -export default StorageTombstonesIntegrityChecks; diff --git a/debug-web-ui/src/page/IntermediateHashPage.js b/debug-web-ui/src/page/IntermediateHashPage.js new file mode 100644 index 0000000000000000000000000000000000000000..b49f4072aafee9e3cbb9613e4e7b26a4333c7e83 --- /dev/null +++ b/debug-web-ui/src/page/IntermediateHashPage.js @@ -0,0 +1,21 @@ +import React from 'react'; + +import { Col, Container, Row } from 'react-bootstrap'; +import LookupIntermediateHashForm from '../components/LookupIntermediateHashForm'; + +const IntermediateHashPage = ({ api }) => ( + <Container fluid className="mt-1"> + <Row> + <Col> + <h1>Intermediate Hash</h1> + </Col> + </Row> + <Row> + <Col xs={10}> + <LookupIntermediateHashForm api={api} /> + </Col> + </Row> + </Container> +); + +export default IntermediateHashPage; diff --git a/debug-web-ui/src/utils/API.js b/debug-web-ui/src/utils/API.js index 0f669d978eb93b023be0a0c9f88649373dc2655d..f1346eb46009fb7ee635be948fef6a8548bdefd4 100644 --- a/debug-web-ui/src/utils/API.js +++ b/debug-web-ui/src/utils/API.js @@ -44,20 +44,14 @@ export default class API { }); } - lookupStorageTombstones(prefix) { + lookupStorageTombstones(prefix, tombstones) { return axios({ - url: this.endpoint('/api/v1/storage-tombstones/'), + url: this.endpoint('/api/v1/intermediate-hash/'), method: 'get', params: { prefix: prefix, + tombstones: tombstones, }, }); } - - storageTombstonesIntegrityChecks() { - return axios({ - url: this.endpoint('/api/v1/storage-tombstones/integrity/'), - method: 'get', - }); - } } diff --git a/debug-web-ui/yarn.lock b/debug-web-ui/yarn.lock index 0895abca1dcca3fe2fd99838b5c1054baf3f8ae8..c4cc5b6e7db3e6904031fc917979ae1e6f29b03a 100644 --- a/debug-web-ui/yarn.lock +++ b/debug-web-ui/yarn.lock @@ -899,7 +899,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== @@ -1137,10 +1137,10 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395" - integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA== +"@jest/types@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6" + integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" @@ -1161,9 +1161,9 @@ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== "@popperjs/core@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.1.1.tgz#12c572ab88ef7345b43f21883fca26631c223085" - integrity sha512-sLqWxCzC5/QHLhziXSCAksBxHfOnQlhPRVgPK0egEw+ktWvG75T2k+aYWVjVh9+WKeT3tlG3ZNbZQvZLmfuOIw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.2.1.tgz#d7d1d7fbdc1f2aa24e62f4ef4b001be7727340c5" + integrity sha512-BChdj3idQiLi+7vPhE6gEDiPzpozvSrUqbSMoSTlRbOQkU0p6u4si0UBydegTyphsYSZC2AUHGYYICP0gqmEVg== "@restart/context@^2.1.4": version "2.1.4" @@ -1281,10 +1281,10 @@ "@svgr/plugin-svgo" "^4.3.1" loader-utils "^1.2.3" -"@testing-library/dom@^7.0.2": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.1.1.tgz#bf890c2468bd717ffd8b336a819686907fbe4daa" - integrity sha512-CxspAIntyK2joLUJChOZgnwx7xBxdBC8ugwP+Z49Dd9O3sGVs0wHkOUOsfBVXHgBjmdZk8E3SyHZVrMRd9O1sA== +"@testing-library/dom@^7.1.0": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.2.1.tgz#bb3b31d669bbe0c4939dadd95d69caa3c1d0b372" + integrity sha512-xIGoHlQ2ZiEL1dJIFKNmLDypzYF+4OJTTASRctl/aoIDaS5y/pRVHRigoqvPUV11mdJoR71IIgi/6UviMgyz4g== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__dom" "^7.0.0" @@ -1292,40 +1292,39 @@ dom-accessibility-api "^0.4.2" pretty-format "^25.1.0" -"@testing-library/jest-dom@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.1.1.tgz#e88a5c08f9b9f36b384f948a0532eae2abbc8204" - integrity sha512-7xnmBFcUmmUVAUhFiZ/u3CxFh1e46THAwra4SiiKNCW4By26RedCRwEk0rtleFPZG0wlTSNOKDvJjWYy93dp0w== +"@testing-library/jest-dom@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.3.0.tgz#2ae813b8b0eb69e8808f75d3af8efa3f0dc4d7ec" + integrity sha512-Cdhpc3BHL888X55qBNyra9eM0UG63LCm/FqCWTa1Ou/0MpsUbQTM9vW1NU6/jBQFoSLgkFfDG5XVpm2V0dOm/A== dependencies: - "@babel/runtime" "^7.8.3" - "@types/testing-library__jest-dom" "^5.0.0" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.0.2" chalk "^3.0.0" css "^2.2.4" css.escape "^1.5.1" jest-diff "^25.1.0" jest-matcher-utils "^25.1.0" lodash "^4.17.15" - pretty-format "^25.1.0" redent "^3.0.0" -"@testing-library/react@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.0.1.tgz#4f5e2a8836257c5bd3df640b21d7bea5a0d83ead" - integrity sha512-sMHWud2dcymOzq2AhEniICSijEwKeTiBX+K0y36FYNY7wH2t0SIP1o732Bf5dDY0jYoMC2hj2UJSVpZC/rDsWg== +"@testing-library/react@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.0.2.tgz#8eca7aa52d810cf7150048a2829fdc487162006d" + integrity sha512-YT6Mw0oJz7R6vlEkmo1FlUD+K15FeXApOB5Ffm9zooFVnrwkt00w18dUJFMOh1yRp9wTdVRonbor7o4PIpFCmA== dependencies: - "@babel/runtime" "^7.8.7" - "@testing-library/dom" "^7.0.2" - "@types/testing-library__react" "^9.1.3" + "@babel/runtime" "^7.9.2" + "@testing-library/dom" "^7.1.0" + "@types/testing-library__react" "^10.0.0" -"@testing-library/user-event@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-10.0.0.tgz#68dc84111c882cbf595d6bafa3691e4daa375fbd" - integrity sha512-ygQ1SaX3AzWDGPer5e2LF7FvWwLPG+XYViHvpW4ObseOkqmJI2ruawp9iLmEwxQW88jNCCExvonh0jBAwwiYZw== +"@testing-library/user-event@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-10.0.1.tgz#9a02dbbc813135f25778b17f92a63933a58e8af5" + integrity sha512-M63ftowo1QpAGMnWyz7df0ygqnu4XyF68Sty7mivMAz2HLcY1uLoN3qcen6WMobdY0MoZUi4+BLsziSDAP62Vg== "@types/babel__core@^7.1.0": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" - integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" + integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1349,9 +1348,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" - integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + version "7.0.10" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.10.tgz#d9a99f017317d9b3d1abc2ced45d3bca68df0daf" + integrity sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw== dependencies: "@babel/types" "^7.3.0" @@ -1400,12 +1399,12 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "25.1.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.4.tgz#9e9f1e59dda86d3fd56afce71d1ea1b331f6f760" - integrity sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw== + version "25.2.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" + integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== dependencies: - jest-diff "^25.1.0" - pretty-format "^25.1.0" + jest-diff "^25.2.1" + pretty-format "^25.2.1" "@types/json-schema@^7.0.3": version "7.0.4" @@ -1418,9 +1417,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "13.9.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.3.tgz#6356df2647de9eac569f9a52eda3480fa9e70b4d" - integrity sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA== + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1438,16 +1437,16 @@ integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== "@types/react-dom@*": - version "16.9.5" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.5.tgz#5de610b04a35d07ffd8f44edad93a71032d9aaa7" - integrity sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg== + version "16.9.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.6.tgz#9e7f83d90566521cc2083be2277c6712dcaf754c" + integrity sha512-S6ihtlPMDotrlCJE9ST1fRmYrQNNwfgL61UB4I1W7M6kPulUKx9fXAleW5zpdIjUQ4fTaaog8uERezjsGUj9HQ== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^16.9.11", "@types/react@^16.9.23": - version "16.9.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.25.tgz#6ae2159b40138c792058a23c3c04fd3db49e929e" - integrity sha512-Dlj2V72cfYLPNscIG3/SMUOzhzj7GK3bpSrfefwt2YT9GLynvLCCZjbhyF6VsT0q0+aRACRX03TDJGb7cA0cqg== + version "16.9.32" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" + integrity sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -1458,23 +1457,23 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/testing-library__dom@*", "@types/testing-library__dom@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.0.0.tgz#c0fb7d1c2495a3d26f19342102142d47500f0319" - integrity sha512-1TEPWyqQ6IQ7R1hCegZmFSA3KrBQjdzJW7yC9ybpRcFst5XuPOqBGNr0mTAKbxwI/TrTyc1skeyLJrpcvAf93w== + version "7.0.1" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.0.1.tgz#426bef0aa306a603fe071859d4b485941b28aca6" + integrity sha512-WokGRksRJb3Dla6h02/0/NNHTkjsj4S8aJZiwMj/5/UL8VZ1iCe3H8SHzfpmBeH8Vp4SPRT8iC2o9kYULFhDIw== dependencies: pretty-format "^25.1.0" -"@types/testing-library__jest-dom@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.2.tgz#89b782e0f187fe1e80d6375133da74182ba02065" - integrity sha512-dZP+/WHndgCSmdaImITy0KhjGAa9c0hlGGkzefbtrPFpnGEPZECDA0zyvfSp8RKhHECJJSKHFExjOwzo0rHyIA== +"@types/testing-library__jest-dom@^5.0.2": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.3.tgz#8efef348eeedc62e7de21acbe455a779936417c4" + integrity sha512-NdbKc6yseg6uq4UJFwimPws0iwsGugVbPoOTP2EH+PJMJKiZsoSg5F2H3XYweOyytftCOuIMuXifBUrF9CSvaQ== dependencies: "@types/jest" "*" -"@types/testing-library__react@^9.1.3": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" - integrity sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w== +"@types/testing-library__react@^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-10.0.1.tgz#92bb4a02394bf44428e35f1da2970ed77f803593" + integrity sha512-RbDwmActAckbujLZeVO/daSfdL1pnjVqas25UueOkAY5r7vriavWf0Zqg7ghXMHa8ycD/kLkv8QOj31LmSYwww== dependencies: "@types/react-dom" "*" "@types/testing-library__dom" "*" @@ -1500,39 +1499,39 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.10.0": - version "2.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.25.0.tgz#0b60917332f20dcff54d0eb9be2a9e9f4c9fbd02" - integrity sha512-W2YyMtjmlrOjtXc+FtTelVs9OhuR6OlYc4XKIslJ8PUJOqgYYAPRJhAqkYRQo3G4sjvG8jSodsNycEn4W2gHUw== + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz#e479cdc4c9cf46f96b4c287755733311b0d0ba4b" + integrity sha512-/my+vVHRN7zYgcp0n4z5A6HAK7bvKGBiswaM5zIlOQczsxj/aiD7RcgD+dvVFuwFaGh5+kM7XA6Q6PN0bvb1tw== dependencies: - "@typescript-eslint/experimental-utils" "2.25.0" + "@typescript-eslint/experimental-utils" "2.27.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.25.0": - version "2.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.25.0.tgz#13691c4fe368bd377b1e5b1e4ad660b220bf7714" - integrity sha512-0IZ4ZR5QkFYbaJk+8eJ2kYeA+1tzOE1sBjbwwtSV85oNWYUBep+EyhlZ7DLUCyhMUGuJpcCCFL0fDtYAP1zMZw== +"@typescript-eslint/experimental-utils@2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a" + integrity sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.25.0" + "@typescript-eslint/typescript-estree" "2.27.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" "@typescript-eslint/parser@^2.10.0": - version "2.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.25.0.tgz#abfb3d999084824d9a756d9b9c0f36fba03adb76" - integrity sha512-mccBLaBSpNVgp191CP5W+8U1crTyXsRziWliCqzj02kpxdjKMvFHGJbK33NroquH3zB/gZ8H511HEsJBa2fNEg== + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287" + integrity sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.25.0" - "@typescript-eslint/typescript-estree" "2.25.0" + "@typescript-eslint/experimental-utils" "2.27.0" + "@typescript-eslint/typescript-estree" "2.27.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.25.0": - version "2.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.25.0.tgz#b790497556734b7476fa7dd3fa539955a5c79e2c" - integrity sha512-VUksmx5lDxSi6GfmwSK7SSoIKSw9anukWWNitQPqt58LuYrKalzsgeuignbqnB+rK/xxGlSsCy8lYnwFfB6YJg== +"@typescript-eslint/typescript-estree@2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8" + integrity sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -2070,12 +2069,12 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.7.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" - integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== + version "9.7.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4" + integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ== dependencies: - browserslist "^4.11.0" - caniuse-lite "^1.0.30001036" + browserslist "^4.11.1" + caniuse-lite "^1.0.30001039" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" @@ -2476,15 +2475,15 @@ browserslist@4.10.0: node-releases "^1.1.52" pkg-up "^3.1.0" -browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: - version "4.11.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" - integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== +browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" + integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.380" - node-releases "^1.1.52" - pkg-up "^3.1.0" + caniuse-lite "^1.0.30001038" + electron-to-chromium "^1.3.390" + node-releases "^1.1.53" + pkg-up "^2.0.0" bser@2.1.1: version "2.1.1" @@ -2649,10 +2648,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: - version "1.0.30001036" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz#930ea5272010d8bf190d859159d757c0b398caf0" - integrity sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001038, caniuse-lite@^1.0.30001039: + version "1.0.30001039" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" + integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== capture-exit@^2.0.0: version "2.0.0" @@ -2704,7 +2703,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -3401,9 +3400,9 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: cssom "0.3.x" csstype@^2.2.0, csstype@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" - integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== + version "2.6.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" + integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== cyclist@^1.0.1: version "1.0.1" @@ -3605,10 +3604,10 @@ diff-sequences@^24.9.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== -diff-sequences@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32" - integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw== +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== diffie-hellman@^5.0.0: version "5.0.3" @@ -3682,11 +3681,11 @@ dom-converter@^0.2: utila "~0.4" dom-helpers@^5.0.1, dom-helpers@^5.1.0, dom-helpers@^5.1.2: - version "5.1.3" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" - integrity sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw== + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== dependencies: - "@babel/runtime" "^7.6.3" + "@babel/runtime" "^7.8.7" csstype "^2.6.7" dom-serializer@0: @@ -3795,10 +3794,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.380: - version "1.3.383" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.383.tgz#8bbef55963529bfbf8344ac3620e1bcb455cffc3" - integrity sha512-EHYVJl6Ox1kFy/SzGVbijHu8ksQotJnqHCFFfaVhXiC+erOSplwhCtOTSocu1jRwirlNsSn/aZ9Kf84Z6s5qrg== +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.390: + version "1.3.398" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz#4c01e29091bf39e578ac3f66c1f157d92fa5725d" + integrity sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w== elliptic@^6.0.0: version "6.5.2" @@ -3878,7 +3877,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -3984,9 +3983,9 @@ eslint-loader@3.0.3: schema-utils "^2.6.1" eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: debug "^2.6.9" pkg-dir "^2.0.0" @@ -4531,9 +4530,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatten@^1.0.2: version "1.0.3" @@ -4556,9 +4555,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== dependencies: debug "^3.0.0" @@ -4872,9 +4871,9 @@ gzip-size@5.1.1: pify "^4.0.1" handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== har-schema@^2.0.0: version "2.0.0" @@ -5056,9 +5055,9 @@ html-entities@^1.2.1: integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= html-escaper@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.1.tgz#beed86b5d2b921e92533aa11bce6d8e3b583dee7" - integrity sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: version "5.0.5" @@ -5837,15 +5836,15 @@ jest-diff@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" -jest-diff@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad" - integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw== +jest-diff@^25.1.0, jest-diff@^25.2.1, jest-diff@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.6.tgz#a6d70a9ab74507715ea1092ac513d1ab81c1b5e7" + integrity sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg== dependencies: chalk "^3.0.0" - diff-sequences "^25.1.0" - jest-get-type "^25.1.0" - pretty-format "^25.1.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.2.6" jest-docblock@^24.3.0: version "24.9.0" @@ -5905,10 +5904,10 @@ jest-get-type@^24.9.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== -jest-get-type@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876" - integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw== +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== jest-haste-map@^24.9.0: version "24.9.0" @@ -5970,14 +5969,14 @@ jest-matcher-utils@^24.9.0: pretty-format "^24.9.0" jest-matcher-utils@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz#fa5996c45c7193a3c24e73066fc14acdee020220" - integrity sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ== + version "25.2.7" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz#53fad3c11fc42e92e374306df543026712c957a3" + integrity sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA== dependencies: chalk "^3.0.0" - jest-diff "^25.1.0" - jest-get-type "^25.1.0" - pretty-format "^25.1.0" + jest-diff "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.2.6" jest-message-util@^24.9.0: version "24.9.0" @@ -6173,9 +6172,9 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: supports-color "^6.1.0" jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" + integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -6330,9 +6329,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: minimist "^1.2.5" @@ -6912,9 +6911,9 @@ mixin-object@^2.0.1: is-extendable "^0.1.1" mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" @@ -6991,9 +6990,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== + version "2.4.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a" + integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -7098,12 +7097,10 @@ node-pre-gyp@*: semver "^5.3.0" tar "^4.4.2" -node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== - dependencies: - semver "^6.3.0" +node-releases@^1.1.52, node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== nopt@^4.0.1: version "4.0.3" @@ -7456,9 +7453,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -7784,6 +7781,13 @@ pkg-up@3.1.0, pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -8481,10 +8485,10 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08" - integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg== +prettier@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" + integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== pretty-bytes@^5.1.0: version "5.3.0" @@ -8509,12 +8513,12 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" - integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== +pretty-format@^25.1.0, pretty-format@^25.2.1, pretty-format@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.6.tgz#542a1c418d019bbf1cca2e3620443bc1323cb8d7" + integrity sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.2.6" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -8590,9 +8594,9 @@ prr@~1.0.1: integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -9089,9 +9093,9 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regexpu-core@^4.7.0: version "4.7.0" @@ -9355,9 +9359,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: tslib "^1.9.0" @@ -9623,9 +9627,9 @@ side-channel@^1.0.2: object-inspect "^1.7.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-swizzle@^0.2.2: version "0.2.2" @@ -9798,9 +9802,9 @@ spdy-transport@^3.0.0: wbuf "^1.7.3" spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -9978,21 +9982,39 @@ string.prototype.matchall@^4.0.2: regexp.prototype.flags "^1.3.0" side-channel "^1.0.2" +string.prototype.trimend@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" + integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" + integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -10071,9 +10093,9 @@ strip-indent@^3.0.0: min-indent "^1.0.0" strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== strip-json-comments@~2.0.1: version "2.0.1" @@ -10211,9 +10233,9 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: - version "4.6.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" - integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + version "4.6.10" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" + integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -10353,11 +10375,16 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -ts-pnp@1.1.6, ts-pnp@^1.1.6: +ts-pnp@1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" @@ -10689,11 +10716,11 @@ warning@^4.0.0, warning@^4.0.3: loose-envify "^1.0.0" watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== dependencies: - chokidar "^2.0.2" + chokidar "^2.1.8" graceful-fs "^4.1.2" neo-async "^2.5.0" diff --git a/eth/handler.go b/eth/handler.go index 11ccf916953ad5319bb7c4c25d3c03497780a099..a4eaa39f0e790f424196ee4f13d5f31d7f04d4b2 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -31,7 +31,6 @@ import ( "time" "github.com/ledgerwatch/turbo-geth/common" - "github.com/ledgerwatch/turbo-geth/common/debug" "github.com/ledgerwatch/turbo-geth/consensus" "github.com/ledgerwatch/turbo-geth/core" "github.com/ledgerwatch/turbo-geth/core/forkid" @@ -1316,9 +1315,6 @@ func (pm *ProtocolManager) handleDebugMsg(p *debugPeer) error { downloader.MaxHeaderFetch = 192 * 10 downloader.MaxReceiptFetch = 256 * 10 - // hacks to enable asserts - debug.IntermediateTrieHashAssertDbIntegrity = true - log.Warn("Succeed to set new Genesis") if err := p2p.Send(p.rw, DebugSetGenesisMsg, "{}"); err != nil { return fmt.Errorf("p2p.Send: %w", err) diff --git a/trie/intermediate_hashes_test.go b/trie/intermediate_hashes_test.go index a8fed525d0bb7271b631dd4710850115b4ffeba1..3258f6d0f25a5655b3b4810dc82c8361083b8d17 100644 --- a/trie/intermediate_hashes_test.go +++ b/trie/intermediate_hashes_test.go @@ -2,7 +2,6 @@ package trie import ( "fmt" - "io" "strconv" "testing" @@ -41,215 +40,3 @@ func TestCompressNibbles(t *testing.T) { assert.Equal(t, tc.in, fmt.Sprintf("%x", decompressed), msg) } } - -/* -BenchmarkCompImplOnly/buf,_io.ByteWriter-12 22229425 53.0 ns/op 0 B/op 0 allocs/op -BenchmarkCompImplOnly/[]byte-12 78929832 15.1 ns/op 0 B/op 0 allocs/op -BenchmarkCompImplOnly/*[]byte-12 77875892 14.9 ns/op 0 B/op 0 allocs/op -BenchmarkCompImplOnly/*[]byte_+_append()-12 75405454 15.7 ns/op 0 B/op 0 allocs/op -BenchmarkCompImplOnly/[]byte_+_append()_+_return-12 65988324 18.0 ns/op 0 B/op 0 allocs/op -BenchmarkCompImplOnly/var_[64]byte-12 73355667 20.0 ns/op 0 B/op 0 allocs/op -*/ -func BenchmarkCompImplOnly(b *testing.B) { - in := common.Hex2Bytes("0102030405060708090f0102030405060708090f0102030405060708090f") - pool.PutBuffer(pool.GetBuffer(64)) - - b.Run("buf, io.ByteWriter", func(b *testing.B) { - buf := pool.GetBuffer(64) - defer pool.PutBuffer(buf) - for i := 0; i < b.N; i++ { - buf.B = buf.B[:0] - if err := Compress2(in, buf); err != nil { - panic(err) - } - _ = buf.B - } - }) - - b.Run("[]byte", func(b *testing.B) { - buf := pool.GetBuffer(64) - defer pool.PutBuffer(buf) - for i := 0; i < b.N; i++ { - buf.B = buf.B[:0] - l := Compress3(in, buf.B) - k := buf.B[:l] - _ = k - } - }) - - b.Run("*[]byte", func(b *testing.B) { - buf := pool.GetBuffer(64) - defer pool.PutBuffer(buf) - for i := 0; i < b.N; i++ { - buf.B = buf.B[:0] - Compress3a(in, &buf.B) - } - }) - - //b.Run("[]byte + append()", func(b *testing.B) { - // buf := pool.GetBuffer(64) - // defer pool.PutBuffer(buf) - // for i := 0; i < b.N; i++ { - // l := Compress4a(in, buf.B) - // k := buf.B[:l] - // _ = k - // } - //}) - - b.Run("*[]byte + append()", func(b *testing.B) { - buf := pool.GetBuffer(64) - defer pool.PutBuffer(buf) - for i := 0; i < b.N; i++ { - buf.B = buf.B[:0] - Compress4(in, &buf.B) - } - }) - - b.Run("[]byte + append() + return", func(b *testing.B) { - buf := pool.GetBuffer(64) - defer pool.PutBuffer(buf) - for i := 0; i < b.N; i++ { - buf.B = Compress4a(in, buf.B) - } - }) - - b.Run("var [64]byte", func(b *testing.B) { - var out [64]byte - for i := 0; i < b.N; i++ { - l := Compress5(in, &out) - k := out[:l] - _ = k - } - }) -} - -/* -BenchmarkCompWithAlloc/Buf_Pool_as_io.ByteWriter-12 16608708 90.4 ns/op 0 B/op 0 allocs/op -BenchmarkCompWithAlloc/Buf_Pool_as_bytes-12 34118124 35.3 ns/op 0 B/op 0 allocs/op -BenchmarkCompWithAlloc/Buf_Pool_as_bytes_2-12 33667668 36.5 ns/op 0 B/op 0 allocs/op -BenchmarkCompWithAlloc/make_outside-12 37161247 32.0 ns/op 16 B/op 1 allocs/op -BenchmarkCompWithAlloc/var_[64]byte-12 72436761 16.8 ns/op 0 B/op 0 allocs/op -BenchmarkCompWithAlloc/make_inside_func-12 38349050 34.2 ns/op 16 B/op 1 allocs/op -*/ -func BenchmarkCompWithAlloc(b *testing.B) { - in := common.Hex2Bytes("0102030405060708090f0102030405060708090f0102030405060708090f") - pool.PutBuffer(pool.GetBuffer(64)) - - b.Run("Buf Pool as io.ByteWriter", func(b *testing.B) { - for i := 0; i < b.N; i++ { - buf := pool.GetBuffer(64) - buf.Reset() - if err := Compress2(in, buf); err != nil { - panic(err) - } - pool.PutBuffer(buf) - } - }) - - b.Run("Buf Pool as bytes", func(b *testing.B) { - for i := 0; i < b.N; i++ { - buf := pool.GetBuffer(64) - Compress4(in, &buf.B) - pool.PutBuffer(buf) - } - }) - - b.Run("Buf Pool as bytes 2", func(b *testing.B) { - for i := 0; i < b.N; i++ { - buf := pool.GetBuffer(64) - buf.B = Compress4a(in, buf.B) - pool.PutBuffer(buf) - } - }) - - b.Run("make outside", func(b *testing.B) { - for i := 0; i < b.N; i++ { - k := make([]byte, len(in)/2) - Compress4(in, &k) - } - }) - - b.Run("var [64]byte", func(b *testing.B) { - for i := 0; i < b.N; i++ { - var out [64]byte - l := Compress5(in, &out) - k := out[:l] - _ = k - } - }) - b.Run("make inside func", func(b *testing.B) { - for i := 0; i < b.N; i++ { - k := Compress6(in) - _ = k - } - }) -} - -func Compress2(nibbles []byte, out io.ByteWriter) error { - for i := 0; i < len(nibbles); i += 2 { - if err := out.WriteByte(nibbles[i]<<4 | nibbles[i+1]); err != nil { - return err - } - } - - return nil -} - -func Compress3(nibbles []byte, out []byte) int { - var bi int - out = out[:len(nibbles)/2] - for i := 0; i < len(nibbles); bi, i = bi+1, i+2 { - out[bi] = nibbles[i]<<4 | nibbles[i+1] - } - return bi -} - -func Compress3a(nibbles []byte, out *[]byte) { - k := (*out)[:len(nibbles)/2] - var bi int - for i := 0; i < len(nibbles); bi, i = bi+1, i+2 { - k[bi] = nibbles[i]<<4 | nibbles[i+1] - } - *out = k -} - -func Compress4(nibbles []byte, out *[]byte) { - k := (*out)[:0] - for j, i := 0, 0; i < len(nibbles); j, i = i+1, i+2 { - k = append(k, nibbles[i]<<4|nibbles[j]) - } - *out = k -} - -func Compress4a(nibbles []byte, out []byte) []byte { - out = out[:0] - for j, i := 0, 0; i < len(nibbles); j, i = i+1, i+2 { - out = append(out, nibbles[i]<<4|nibbles[j]) - } - return out -} - -// this version disqualified because linter doesn't like it -//func Compress4a(nibbles []byte, out []byte) int { -// out = out[:0] -// for i := 0; i < len(nibbles); i += 2 { -// out = append(out, nibbles[i]<<4|nibbles[i+1]) -// } -// return len(nibbles) / 2 -//} - -func Compress5(nibbles []byte, out *[64]byte) (outLength int) { - var bi int - for i := 0; i < len(nibbles); bi, i = bi+1, i+2 { - out[bi] = (nibbles[i] << 4) | nibbles[i+1] - } - return bi -} - -func Compress6(nibbles []byte) []byte { - out := make([]byte, len(nibbles)/2) - for bi, i := 0, 0; i < len(nibbles); bi, i = bi+1, i+2 { - out[bi] = nibbles[i]<<4 | nibbles[i+1] - } - return out -} diff --git a/trie/resolver_stateful_cached.go b/trie/resolver_stateful_cached.go index 357f41f38900c5ec6a45656f606c542288031997..ed7143eecabc3beaef67cce7921c084d83a87664 100644 --- a/trie/resolver_stateful_cached.go +++ b/trie/resolver_stateful_cached.go @@ -384,6 +384,19 @@ func (tr *ResolverStatefulCached) MultiWalk2(db *bolt.DB, blockNr uint64, bucket fmt.Printf("For loop: %x, %x\n", cacheK, k) } + // Special case: self-destructed accounts. + // self-destructed accounts may be marked in IH bucket by empty value + // in this case: skip all IH keys of given prefix + if cacheV != nil && len(cacheV) == 0 { + next, ok := nextSubtree(cacheK) + if !ok { // no siblings left + cacheK, cacheV = nil, nil + continue + } + cacheK, cacheV = cache.Seek(next) + continue + } + // for Address bucket, skip cache keys longer than 31 bytes if isAccountBucket { for len(cacheK) > maxAccountKeyLen { @@ -502,10 +515,7 @@ func (tr *ResolverStatefulCached) MultiWalk2(db *bolt.DB, blockNr uint64, bucket } // cache part - if len(cacheV) == 0 { // skip empty values - cacheK, cacheV = cache.Next() - continue - } + canUseCache := false currentReq := tr.requests[tr.reqIndices[rangeIdx]] currentRs := tr.rss[rangeIdx] @@ -517,7 +527,7 @@ func (tr *ResolverStatefulCached) MultiWalk2(db *bolt.DB, blockNr uint64, bucket continue } - canUseCache := currentRs.HashOnly(keyAsNibbles.B[currentReq.extResolvePos:]) + canUseCache = currentRs.HashOnly(keyAsNibbles.B[currentReq.extResolvePos:]) if !canUseCache { // can't use cache as is, need go to children cacheK, cacheV = cache.Next() // go to children, not to sibling continue