From 3cfcba042b0e69ccff9e11d1a72d561e816e6e99 Mon Sep 17 00:00:00 2001 From: Arijit Das Date: Tue, 23 Nov 2021 21:15:43 +0530 Subject: [PATCH 1/4] Refactor and update to use new schema. --- cmd/validate.go | 2 +- go.mod | 6 +- go.sum | 139 +++++++++++++++++++-- pkg/eth/api.go | 60 ++++----- pkg/eth/api_test.go | 45 +++---- pkg/eth/backend.go | 168 +++++++++++++------------- pkg/eth/cid_retriever.go | 194 +++++++++++++++--------------- pkg/eth/cid_retriever_test.go | 93 +++++++------- pkg/eth/eth_state_test.go | 23 ++-- pkg/eth/filterer.go | 35 +++--- pkg/eth/filterer_test.go | 52 ++++---- pkg/eth/ipld_fetcher.go | 90 +++++++------- pkg/eth/ipld_fetcher_test.go | 24 ++-- pkg/eth/ipld_retriever.go | 95 +++++++-------- pkg/eth/test_helpers.go | 44 +++++-- pkg/eth/test_helpers/test_data.go | 46 ++++--- pkg/eth/types.go | 15 ++- pkg/graphql/graphql.go | 10 +- pkg/graphql/graphql_test.go | 39 ++---- pkg/prom/db_stats_collector.go | 21 ++-- pkg/prom/prom.go | 4 +- pkg/serve/api.go | 11 +- pkg/serve/config.go | 33 ++--- pkg/serve/service.go | 21 ++-- pkg/shared/functions.go | 21 ++-- pkg/shared/test_helpers.go | 4 +- test_config/test_config.go | 12 +- 27 files changed, 710 insertions(+), 597 deletions(-) diff --git a/cmd/validate.go b/cmd/validate.go index c91fb918..0853bd89 100644 --- a/cmd/validate.go +++ b/cmd/validate.go @@ -57,7 +57,7 @@ func validate() { stateRoot := common.HexToHash(stateRootStr) cacheSize := viper.GetInt("cacheSize") - ethDB := ipfsethdb.NewDatabase(config.DB.DB, ipfsethdb.CacheConfig{ + ethDB := ipfsethdb.NewDatabase(config.DB, ipfsethdb.CacheConfig{ Name: GroupName, Size: cacheSize * 1024 * 1024, ExpiryDuration: time.Minute * time.Duration(CacheExpiryInMins), diff --git a/go.mod b/go.mod index 8f21e5ef..91bab53e 100644 --- a/go.mod +++ b/go.mod @@ -32,4 +32,8 @@ require ( golang.org/x/tools v0.1.7 // indirect ) -replace github.com/ethereum/go-ethereum v1.10.11 => github.com/vulcanize/go-ethereum v1.10.11-statediff-0.0.27 +replace ( + github.com/ethereum/go-ethereum v1.10.11 => /Users/arijitdas/go/src/github.com/ethereum/go-ethereum + github.com/vulcanize/eth-ipfs-state-validator v0.0.2 => /Users/arijitdas/go/src/github.com/Vulcanize/eth-ipfs-state-validator + github.com/vulcanize/ipfs-ethdb v0.0.5 => /Users/arijitdas/go/src/github.com/Vulcanize/ipfs-ethdb +) diff --git a/go.sum b/go.sum index 56c2d6dd..c6c4a95f 100644 --- a/go.sum +++ b/go.sum @@ -69,6 +69,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= @@ -183,6 +185,10 @@ github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3h github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/cockroach-go/v2 v2.0.3 h1:ZA346ACHIZctef6trOTwBAEvPVm1k0uLm/bb2Atc+S8= +github.com/cockroachdb/cockroach-go/v2 v2.0.3/go.mod h1:hAuDgiVgDVkfirP9JnhXEfcXEPRKBpYdGz+l7mvYSzw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= @@ -198,6 +204,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -226,6 +233,7 @@ github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0 github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -267,6 +275,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/ethereum/go-ethereum v1.9.11/go.mod h1:7oC0Ni6dosMv5pxMigm6s0hN8g4haJMBnqmmo0D9YfQ= github.com/ethereum/go-ethereum v1.10.9/go.mod h1:CaTMQrv51WaAlD2eULQ3f03KiahDRO28fleQcKjWrrg= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= @@ -297,6 +306,8 @@ github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5 github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/georgysavva/scany v0.2.9 h1:Xt6rjYpHnMClTm/g+oZTnoSxUwiln5GqMNU+QeLNHQU= +github.com/georgysavva/scany v0.2.9/go.mod h1:yeOeC1BdIdl6hOwy8uefL2WNSlseFzbhlG/frrh65SA= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -334,7 +345,10 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -343,6 +357,7 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -728,6 +743,79 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.2 h1:StIquYvKIRuSEAtjJDr39fyzBtziioHPwVC75tBiXzo= github.com/ipld/go-ipld-prime v0.12.2/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.6.4/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= +github.com/jackc/pgconn v1.7.0/go.mod h1:sF/lPpNEMEOp+IYhyQGdAvrG20gWf6A1tKlr0v7JMeA= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU= +github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.5/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.4.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs= +github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= +github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.8.1/go.mod h1:4HOLxrl8wToZJReD04/yB20GDwf4KBYETvlHciCnwW0= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570= +github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.2/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -751,6 +839,9 @@ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.2.4 h1:dT3tI+8GzU8DjJFCj9mLYtjfRtUmK7edauduQdcZCpI= github.com/jinzhu/copier v0.2.4/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= +github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= @@ -797,6 +888,7 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= @@ -809,6 +901,7 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -817,7 +910,11 @@ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4F github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= @@ -1181,6 +1278,7 @@ github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -1190,6 +1288,7 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= @@ -1203,8 +1302,8 @@ github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/Qd github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= -github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= +github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -1465,11 +1564,15 @@ github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9Ac github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= @@ -1479,6 +1582,11 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.5+incompatible h1:OloQyEerMi7JUrXiNzy8wQ5XN+baemxSl12QgIzt0jc= github.com/shirou/gopsutil v3.21.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -1503,6 +1611,7 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= @@ -1556,6 +1665,8 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1597,14 +1708,8 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/vulcanize/eth-ipfs-state-validator v0.0.2 h1:d1RUwdIbRAVaCTxrVZ2z4oitlbH8HlcosPWDKJKkWA0= -github.com/vulcanize/eth-ipfs-state-validator v0.0.2/go.mod h1:gBnqe4oycf5Frm/pNrXICJ/p49Wssn+Asu4fnM/stVI= github.com/vulcanize/gap-filler v0.3.1 h1:N5d+jCJo/VTWFvBSbTD7biRhK/OqDZzi1tgA85SIBKs= github.com/vulcanize/gap-filler v0.3.1/go.mod h1:qowG1cgshVpBqMokiWro/1xhh0uypw7oAu8FQ42JMy4= -github.com/vulcanize/go-ethereum v1.10.11-statediff-0.0.27 h1:ldAVLlKll2WHHKLNu8oKbkYRUVRs9T45z12KiSrRW24= -github.com/vulcanize/go-ethereum v1.10.11-statediff-0.0.27/go.mod h1:9L+QY31AnWnX2/2HDOySCjQoYUdWNGBRMezFJVfH73E= -github.com/vulcanize/ipfs-ethdb v0.0.5 h1:8hTTIP+fj8hXM6gVt/JoV7l0lVabnJUreXCEhc3Srq8= -github.com/vulcanize/ipfs-ethdb v0.0.5/go.mod h1:dITNR40SaglTI6EbIFiMpTs1bCnHj4yG9uR8l920+WU= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= @@ -1646,6 +1751,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -1715,6 +1821,8 @@ golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1723,20 +1831,27 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1876,6 +1991,7 @@ golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1986,12 +2102,14 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2037,6 +2155,8 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2165,6 +2285,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/pkg/eth/api.go b/pkg/eth/api.go index 15d6ea17..cdd57a01 100644 --- a/pkg/eth/api.go +++ b/pkg/eth/api.go @@ -88,12 +88,12 @@ Headers and blocks func (pea *PublicEthAPI) GetHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (map[string]interface{}, error) { header, err := pea.B.HeaderByNumber(ctx, number) if header != nil && err == nil { - return pea.rpcMarshalHeader(header) + return pea.rpcMarshalHeader(ctx, header) } if pea.ethClient != nil { if header, err := pea.ethClient.HeaderByNumber(ctx, big.NewInt(number.Int64())); header != nil && err == nil { go pea.writeStateDiffAt(number.Int64()) - return pea.rpcMarshalHeader(header) + return pea.rpcMarshalHeader(ctx, header) } } @@ -104,7 +104,7 @@ func (pea *PublicEthAPI) GetHeaderByNumber(ctx context.Context, number rpc.Block func (pea *PublicEthAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) map[string]interface{} { header, err := pea.B.HeaderByHash(ctx, hash) if header != nil && err == nil { - if res, err := pea.rpcMarshalHeader(header); err == nil { + if res, err := pea.rpcMarshalHeader(ctx, header); err == nil { return res } } @@ -112,7 +112,7 @@ func (pea *PublicEthAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) if pea.ethClient != nil { if header, err := pea.ethClient.HeaderByHash(ctx, hash); header != nil && err == nil { go pea.writeStateDiffFor(hash) - if res, err := pea.rpcMarshalHeader(header); err != nil { + if res, err := pea.rpcMarshalHeader(ctx, header); err != nil { return res } } @@ -122,9 +122,9 @@ func (pea *PublicEthAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) } // rpcMarshalHeader uses the generalized output filler, then adds the total difficulty field -func (pea *PublicEthAPI) rpcMarshalHeader(header *types.Header) (map[string]interface{}, error) { +func (pea *PublicEthAPI) rpcMarshalHeader(ctx context.Context, header *types.Header) (map[string]interface{}, error) { fields := RPCMarshalHeader(header) - td, err := pea.B.GetTd(header.Hash()) + td, err := pea.B.GetTd(ctx, header.Hash()) if err != nil { return nil, err } @@ -135,8 +135,8 @@ func (pea *PublicEthAPI) rpcMarshalHeader(header *types.Header) (map[string]inte } // BlockNumber returns the block number of the chain head. -func (pea *PublicEthAPI) BlockNumber() hexutil.Uint64 { - number, _ := pea.B.Retriever.RetrieveLastBlockNumber() +func (pea *PublicEthAPI) BlockNumber(ctx context.Context) hexutil.Uint64 { + number, _ := pea.B.Retriever.RetrieveLastBlockNumber(ctx) return hexutil.Uint64(number) } @@ -148,13 +148,13 @@ func (pea *PublicEthAPI) BlockNumber() hexutil.Uint64 { func (pea *PublicEthAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { block, err := pea.B.BlockByNumber(ctx, number) if block != nil && err == nil { - return pea.rpcMarshalBlock(block, true, fullTx) + return pea.rpcMarshalBlock(ctx, block, true, fullTx) } if pea.ethClient != nil { if block, err := pea.ethClient.BlockByNumber(ctx, big.NewInt(number.Int64())); block != nil && err == nil { go pea.writeStateDiffAt(number.Int64()) - return pea.rpcMarshalBlock(block, true, fullTx) + return pea.rpcMarshalBlock(ctx, block, true, fullTx) } } @@ -166,13 +166,13 @@ func (pea *PublicEthAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockN func (pea *PublicEthAPI) GetBlockByHash(ctx context.Context, hash common.Hash, fullTx bool) (map[string]interface{}, error) { block, err := pea.B.BlockByHash(ctx, hash) if block != nil && err == nil { - return pea.rpcMarshalBlock(block, true, fullTx) + return pea.rpcMarshalBlock(ctx, block, true, fullTx) } if pea.ethClient != nil { if block, err := pea.ethClient.BlockByHash(ctx, hash); block != nil && err == nil { go pea.writeStateDiffFor(hash) - return pea.rpcMarshalBlock(block, true, fullTx) + return pea.rpcMarshalBlock(ctx, block, true, fullTx) } } @@ -213,13 +213,13 @@ func (pea *PublicEthAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, bloc return nil, nil } block = types.NewBlockWithHeader(uncles[index]) - return pea.rpcMarshalBlock(block, false, false) + return pea.rpcMarshalBlock(ctx, block, false, false) } if pea.rpc != nil { if uncle, uncleHashes, err := getBlockAndUncleHashes(pea.rpc, ctx, "eth_getUncleByBlockNumberAndIndex", blockNr, index); uncle != nil && err == nil { go pea.writeStateDiffAt(blockNr.Int64()) - return pea.rpcMarshalBlockWithUncleHashes(uncle, uncleHashes, false, false) + return pea.rpcMarshalBlockWithUncleHashes(ctx, uncle, uncleHashes, false, false) } } @@ -237,13 +237,13 @@ func (pea *PublicEthAPI) GetUncleByBlockHashAndIndex(ctx context.Context, blockH return nil, nil } block = types.NewBlockWithHeader(uncles[index]) - return pea.rpcMarshalBlock(block, false, false) + return pea.rpcMarshalBlock(ctx, block, false, false) } if pea.rpc != nil { if uncle, uncleHashes, err := getBlockAndUncleHashes(pea.rpc, ctx, "eth_getUncleByBlockHashAndIndex", blockHash, index); uncle != nil && err == nil { go pea.writeStateDiffFor(blockHash) - return pea.rpcMarshalBlockWithUncleHashes(uncle, uncleHashes, false, false) + return pea.rpcMarshalBlockWithUncleHashes(ctx, uncle, uncleHashes, false, false) } } @@ -568,7 +568,7 @@ func (pea *PublicEthAPI) remoteGetTransactionReceipt(ctx context.Context, hash c // // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getlogs func (pea *PublicEthAPI) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([]*types.Log, error) { - logs, err := pea.localGetLogs(crit) + logs, err := pea.localGetLogs(ctx, crit) if err != nil && pea.rpc != nil { var res []*types.Log if err := pea.rpc.CallContext(ctx, &res, "eth_getLogs", crit); err == nil { @@ -579,7 +579,7 @@ func (pea *PublicEthAPI) GetLogs(ctx context.Context, crit filters.FilterCriteri return logs, err } -func (pea *PublicEthAPI) localGetLogs(crit filters.FilterCriteria) ([]*types.Log, error) { +func (pea *PublicEthAPI) localGetLogs(ctx context.Context, crit filters.FilterCriteria) ([]*types.Log, error) { // TODO: this can be optimized away from using the old cid retriever and ipld fetcher interfaces // Convert FilterQuery into ReceiptFilter addrStrs := make([]string, len(crit.Addresses)) @@ -604,24 +604,24 @@ func (pea *PublicEthAPI) localGetLogs(crit filters.FilterCriteria) ([]*types.Log } // Begin tx - tx, err := pea.B.DB.Beginx() + tx, err := pea.B.DB.Begin(ctx) if err != nil { return nil, err } defer func() { if p := recover(); p != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() // If we have a blockHash to filter on, fire off single retrieval query if crit.BlockHash != nil { - filteredLogs, err := pea.B.Retriever.RetrieveFilteredLog(tx, filter, 0, crit.BlockHash) + filteredLogs, err := pea.B.Retriever.RetrieveFilteredLog(ctx, tx, filter, 0, crit.BlockHash) if err != nil { return nil, err } @@ -638,7 +638,7 @@ func (pea *PublicEthAPI) localGetLogs(crit filters.FilterCriteria) ([]*types.Log } if endingBlock == nil { - endingBlockInt, err := pea.B.Retriever.RetrieveLastBlockNumber() + endingBlockInt, err := pea.B.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return nil, err } @@ -649,7 +649,7 @@ func (pea *PublicEthAPI) localGetLogs(crit filters.FilterCriteria) ([]*types.Log end := endingBlock.Int64() var logs []*types.Log for i := start; i <= end; i++ { - filteredLogs, err := pea.B.Retriever.RetrieveFilteredLog(tx, filter, i, nil) + filteredLogs, err := pea.B.Retriever.RetrieveFilteredLog(ctx, tx, filter, i, nil) if err != nil { return nil, err } @@ -662,7 +662,7 @@ func (pea *PublicEthAPI) localGetLogs(crit filters.FilterCriteria) ([]*types.Log logs = append(logs, logCIDs...) } - if err := tx.Commit(); err != nil { + if err := tx.Commit(ctx); err != nil { return nil, err } @@ -1076,13 +1076,13 @@ func (pea *PublicEthAPI) writeStateDiffFor(blockHash common.Hash) { } // rpcMarshalBlock uses the generalized output filler, then adds the total difficulty field -func (pea *PublicEthAPI) rpcMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { +func (pea *PublicEthAPI) rpcMarshalBlock(ctx context.Context, b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { fields, err := RPCMarshalBlock(b, inclTx, fullTx) if err != nil { return nil, err } if inclTx { - td, err := pea.B.GetTd(b.Hash()) + td, err := pea.B.GetTd(ctx, b.Hash()) if err != nil { return nil, err } @@ -1092,12 +1092,12 @@ func (pea *PublicEthAPI) rpcMarshalBlock(b *types.Block, inclTx bool, fullTx boo } // rpcMarshalBlockWithUncleHashes uses the generalized output filler, then adds the total difficulty field -func (pea *PublicEthAPI) rpcMarshalBlockWithUncleHashes(b *types.Block, uncleHashes []common.Hash, inclTx bool, fullTx bool) (map[string]interface{}, error) { +func (pea *PublicEthAPI) rpcMarshalBlockWithUncleHashes(ctx context.Context, b *types.Block, uncleHashes []common.Hash, inclTx bool, fullTx bool) (map[string]interface{}, error) { fields, err := RPCMarshalBlockWithUncleHashes(b, uncleHashes, inclTx, fullTx) if err != nil { return nil, err } - td, err := pea.B.GetTd(b.Hash()) + td, err := pea.B.GetTd(ctx, b.Hash()) if err != nil { return nil, err } diff --git a/pkg/eth/api_test.go b/pkg/eth/api_test.go index 13a6336b..0dd703f9 100644 --- a/pkg/eth/api_test.go +++ b/pkg/eth/api_test.go @@ -19,7 +19,6 @@ package eth_test import ( "context" "math/big" - "os" "strconv" "github.com/ethereum/go-ethereum/common" @@ -31,9 +30,9 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/statediff/indexer" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" "github.com/ethereum/go-ethereum/statediff/indexer/node" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -183,22 +182,9 @@ var ( } ) -// SetupDB is use to setup a db for watcher tests -func SetupDB() (*postgres.DB, error) { - port, _ := strconv.Atoi(os.Getenv("DATABASE_PORT")) - uri := postgres.DbConnectionString(postgres.ConnectionParams{ - User: os.Getenv("DATABASE_USER"), - Password: os.Getenv("DATABASE_PASSWORD"), - Hostname: os.Getenv("DATABASE_HOSTNAME"), - Name: os.Getenv("DATABASE_NAME"), - Port: port, - }) - return postgres.NewDB(uri, postgres.ConnectionConfig{}, node.Info{}) -} - var _ = Describe("API", func() { var ( - db *postgres.DB + db sql.Database api *eth.PublicEthAPI chainConfig = params.TestChainConfig ) @@ -207,13 +193,14 @@ var _ = Describe("API", func() { It("test init", func() { var ( err error - tx *indexer.BlockTx + tx interfaces.Batch ) - db, err = SetupDB() + goodInfo := node.Info{GenesisBlock: "GENESIS1", NetworkID: "1", ID: "1", ClientName: "geth5", ChainID: 1} + // DefaultConfig are default parameters for connecting to a Postgres sql + db, err = eth.Setup(ctx, goodInfo) Expect(err).ToNot(HaveOccurred()) - - indexAndPublisher, err := indexer.NewStateDiffIndexer(chainConfig, db) + indexAndPublisher, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) backend, err := eth.NewEthBackend(db, ð.Config{ ChainConfig: chainConfig, @@ -234,7 +221,7 @@ var _ = Describe("API", func() { Expect(err).ToNot(HaveOccurred()) for _, node := range test_helpers.MockStateNodes { - err = indexAndPublisher.PushStateNode(tx, node) + err = indexAndPublisher.PushStateNode(tx, node, test_helpers.MockBlock.Hash().String()) Expect(err).ToNot(HaveOccurred()) } @@ -246,7 +233,7 @@ var _ = Describe("API", func() { err = indexAndPublisher.PushCodeAndCodeHash(tx, ccHash) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) uncles := test_helpers.MockBlock.Uncles() @@ -258,18 +245,18 @@ var _ = Describe("API", func() { // setting chain config to for london block chainConfig.LondonBlock = big.NewInt(2) - indexAndPublisher, err = indexer.NewStateDiffIndexer(chainConfig, db) + indexAndPublisher, err = sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) tx, err = indexAndPublisher.PushBlock(test_helpers.MockLondonBlock, test_helpers.MockLondonReceipts, test_helpers.MockLondonBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) }) // Single test db tear down at end of all tests - defer It("test teardown", func() { eth.TearDownDB(db) }) + defer It("test teardown", func() { eth.TearDownDB(ctx, db) }) /* Headers and blocks @@ -285,10 +272,8 @@ var _ = Describe("API", func() { It("Throws an error if a header cannot be found", func() { header, err := api.GetHeaderByNumber(ctx, wrongNumber) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + Expect(err.Error()).To(ContainSubstring("no rows in result set")) Expect(header).To(BeNil()) - _, err = api.B.DB.Beginx() - Expect(err).ToNot(HaveOccurred()) }) }) @@ -306,7 +291,7 @@ var _ = Describe("API", func() { Describe("eth_blockNumber", func() { It("Retrieves the head block number", func() { - bn := api.BlockNumber() + bn := api.BlockNumber(ctx) ubn := (uint64)(bn) subn := strconv.FormatUint(ubn, 10) Expect(subn).To(Equal(test_helpers.LondonBlockNum.String())) diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index 1e1445f3..ec7ef407 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -18,7 +18,6 @@ package eth import ( "context" - "database/sql" "errors" "fmt" "math/big" @@ -39,14 +38,16 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" - ethServerShared "github.com/ethereum/go-ethereum/statediff/indexer/shared" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/models" + "github.com/ethereum/go-ethereum/trie" log "github.com/sirupsen/logrus" validator "github.com/vulcanize/eth-ipfs-state-validator/pkg" ipfsethdb "github.com/vulcanize/ipfs-ethdb/postgres" + ethServerShared "github.com/ethereum/go-ethereum/statediff/indexer/shared" + "github.com/vulcanize/ipld-eth-server/pkg/shared" ) @@ -59,6 +60,7 @@ var ( // errMissingSignature is returned if a block's extra-data section doesn't seem // to contain a 65 byte secp256k1 signature. errMissingSignature = errors.New("extra-data 65 byte signature suffix missing") + errNoRows = errors.New("sql: no rows in result set") ) const ( @@ -75,8 +77,8 @@ const ( AND transaction_cids.header_id = header_cids.id AND transaction_cids.tx_hash = $1` RetrieveCodeHashByLeafKeyAndBlockHash = `SELECT code_hash FROM eth.state_accounts, eth.state_cids, eth.header_cids - WHERE state_accounts.state_id = state_cids.id - AND state_cids.header_id = header_cids.id + WHERE state_accounts.header_id = state_cids.header_id AND state_accounts.state_path = state_cids.state_path + AND state_cids.header_id = header_cids.block_hash AND state_leaf_key = $1 AND block_number <= (SELECT block_number FROM eth.header_cids @@ -93,7 +95,7 @@ const ( type Backend struct { // underlying postgres db - DB *postgres.DB + DB sql.Database // postgres db interfaces Retriever *CIDRetriever @@ -115,7 +117,7 @@ type Config struct { GroupCacheConfig *shared.GroupCacheConfig } -func NewEthBackend(db *postgres.DB, c *Config) (*Backend, error) { +func NewEthBackend(db sql.Database, c *Config) (*Backend, error) { gcc := c.GroupCacheConfig groupName := gcc.StateDB.Name @@ -124,7 +126,7 @@ func NewEthBackend(db *postgres.DB, c *Config) (*Backend, error) { } r := NewCIDRetriever(db) - ethDB := ipfsethdb.NewDatabase(db.DB, ipfsethdb.CacheConfig{ + ethDB := ipfsethdb.NewDatabase(db, ipfsethdb.CacheConfig{ Name: groupName, Size: gcc.StateDB.CacheSizeInMB * 1024 * 1024, ExpiryDuration: time.Minute * time.Duration(gcc.StateDB.CacheExpiryInMins), @@ -153,13 +155,13 @@ func (b *Backend) HeaderByNumber(ctx context.Context, blockNumber rpc.BlockNumbe var err error number := blockNumber.Int64() if blockNumber == rpc.LatestBlockNumber { - number, err = b.Retriever.RetrieveLastBlockNumber() + number, err = b.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return nil, err } } if blockNumber == rpc.EarliestBlockNumber { - number, err = b.Retriever.RetrieveFirstBlockNumber() + number, err = b.Retriever.RetrieveFirstBlockNumber(ctx) if err != nil { return nil, err } @@ -170,7 +172,7 @@ func (b *Backend) HeaderByNumber(ctx context.Context, blockNumber rpc.BlockNumbe if number < 0 { return nil, errNegativeBlockNumber } - _, canonicalHeaderRLP, err := b.GetCanonicalHeader(uint64(number)) + _, canonicalHeaderRLP, err := b.GetCanonicalHeader(ctx, uint64(number)) if err != nil { return nil, err } @@ -181,7 +183,7 @@ func (b *Backend) HeaderByNumber(ctx context.Context, blockNumber rpc.BlockNumbe // HeaderByHash gets the header for the provided block hash func (b *Backend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { - _, headerRLP, err := b.IPLDRetriever.RetrieveHeaderByHash(hash) + _, headerRLP, err := b.IPLDRetriever.RetrieveHeaderByHash(ctx, hash) if err != nil { return nil, err } @@ -202,7 +204,7 @@ func (b *Backend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Bl if header == nil { return nil, errors.New("header for hash not found") } - canonicalHash, err := b.GetCanonicalHash(header.Number.Uint64()) + canonicalHash, err := b.GetCanonicalHash(ctx, header.Number.Uint64()) if err != nil { return nil, err } @@ -215,9 +217,9 @@ func (b *Backend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Bl } // GetTd gets the total difficulty at the given block hash -func (b *Backend) GetTd(blockHash common.Hash) (*big.Int, error) { +func (b *Backend) GetTd(ctx context.Context, blockHash common.Hash) (*big.Int, error) { var tdStr string - err := b.DB.Get(&tdStr, RetrieveTD, blockHash.String()) + err := b.DB.Get(ctx, &tdStr, RetrieveTD, blockHash.String()) if err != nil { return nil, err } @@ -247,7 +249,7 @@ func (b *Backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Blo if header == nil { return nil, errors.New("header for hash not found") } - canonicalHash, err := b.GetCanonicalHash(header.Number.Uint64()) + canonicalHash, err := b.GetCanonicalHash(ctx, header.Number.Uint64()) if err != nil { return nil, err } @@ -271,13 +273,13 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber var err error number := blockNumber.Int64() if blockNumber == rpc.LatestBlockNumber { - number, err = b.Retriever.RetrieveLastBlockNumber() + number, err = b.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return nil, err } } if blockNumber == rpc.EarliestBlockNumber { - number, err = b.Retriever.RetrieveFirstBlockNumber() + number, err = b.Retriever.RetrieveFirstBlockNumber(ctx) if err != nil { return nil, err } @@ -289,44 +291,44 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber return nil, errNegativeBlockNumber } // Get the canonical hash - canonicalHash, err := b.GetCanonicalHash(uint64(number)) + canonicalHash, err := b.GetCanonicalHash(ctx, uint64(number)) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err } // Retrieve all the CIDs for the block // TODO: optimize this by retrieving iplds directly rather than the cids first (this is remanent from when we fetched iplds through ipfs blockservice interface) - headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(canonicalHash) + headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(ctx, canonicalHash) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err } // Begin tx - tx, err := b.DB.Beginx() + tx, err := b.DB.Begin(ctx) if err != nil { return nil, err } defer func() { if p := recover(); p != nil { - ethServerShared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - ethServerShared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() // Fetch and decode the header IPLD - var headerIPLD ipfs.BlockModel - headerIPLD, err = b.Fetcher.FetchHeader(tx, headerCID) + var headerIPLD models.IPLDModel + headerIPLD, err = b.Fetcher.FetchHeader(ctx, tx, headerCID) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err @@ -337,8 +339,8 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber return nil, err } // Fetch and decode the uncle IPLDs - var uncleIPLDs []ipfs.BlockModel - uncleIPLDs, err = b.Fetcher.FetchUncles(tx, uncleCIDs) + var uncleIPLDs []models.IPLDModel + uncleIPLDs, err = b.Fetcher.FetchUncles(ctx, tx, uncleCIDs) if err != nil { return nil, err } @@ -352,8 +354,8 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber uncles = append(uncles, &uncle) } // Fetch and decode the transaction IPLDs - var txIPLDs []ipfs.BlockModel - txIPLDs, err = b.Fetcher.FetchTrxs(tx, txCIDs) + var txIPLDs []models.IPLDModel + txIPLDs, err = b.Fetcher.FetchTrxs(ctx, tx, txCIDs) if err != nil { return nil, err } @@ -367,8 +369,8 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber transactions = append(transactions, &transaction) } // Fetch and decode the receipt IPLDs - var rctIPLDs []ipfs.BlockModel - rctIPLDs, err = b.Fetcher.FetchRcts(tx, rctCIDs) + var rctIPLDs []models.IPLDModel + rctIPLDs, err = b.Fetcher.FetchRcts(ctx, tx, rctCIDs) if err != nil { return nil, err } @@ -394,35 +396,35 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber // detail, otherwise only the transaction hash is returned. func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { // Retrieve all the CIDs for the block - headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(hash) + headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(ctx, hash) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err } // Begin tx - tx, err := b.DB.Beginx() + tx, err := b.DB.Begin(ctx) if err != nil { return nil, err } defer func() { if p := recover(); p != nil { - ethServerShared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - ethServerShared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() // Fetch and decode the header IPLD - var headerIPLD ipfs.BlockModel - headerIPLD, err = b.Fetcher.FetchHeader(tx, headerCID) + var headerIPLD models.IPLDModel + headerIPLD, err = b.Fetcher.FetchHeader(ctx, tx, headerCID) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err @@ -433,10 +435,10 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo return nil, err } // Fetch and decode the uncle IPLDs - var uncleIPLDs []ipfs.BlockModel - uncleIPLDs, err = b.Fetcher.FetchUncles(tx, uncleCIDs) + var uncleIPLDs []models.IPLDModel + uncleIPLDs, err = b.Fetcher.FetchUncles(ctx, tx, uncleCIDs) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err @@ -451,10 +453,10 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo uncles = append(uncles, &uncle) } // Fetch and decode the transaction IPLDs - var txIPLDs []ipfs.BlockModel - txIPLDs, err = b.Fetcher.FetchTrxs(tx, txCIDs) + var txIPLDs []models.IPLDModel + txIPLDs, err = b.Fetcher.FetchTrxs(ctx, tx, txCIDs) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err @@ -469,10 +471,10 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo transactions = append(transactions, &transaction) } // Fetch and decode the receipt IPLDs - var rctIPLDs []ipfs.BlockModel - rctIPLDs, err = b.Fetcher.FetchRcts(tx, rctCIDs) + var rctIPLDs []models.IPLDModel + rctIPLDs, err = b.Fetcher.FetchRcts(ctx, tx, rctCIDs) if err != nil { - if err == sql.ErrNoRows { + if err == errNoRows { return nil, nil } return nil, err @@ -504,7 +506,7 @@ func (b *Backend) GetTransaction(ctx context.Context, txHash common.Hash) (*type BlockNumber uint64 `db:"block_number"` Index uint64 `db:"index"` } - if err := b.DB.Get(&tempTxStruct, RetrieveRPCTransaction, txHash.String()); err != nil { + if err := b.DB.Get(ctx, &tempTxStruct, RetrieveRPCTransaction, txHash.String()); err != nil { return nil, common.Hash{}, 0, 0, err } var transaction types.Transaction @@ -516,7 +518,7 @@ func (b *Backend) GetTransaction(ctx context.Context, txHash common.Hash) (*type // GetReceipts retrieves receipts for provided block hash func (b *Backend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { - _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(hash) + _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(ctx, hash) if err != nil { return nil, err } @@ -534,7 +536,7 @@ func (b *Backend) GetReceipts(ctx context.Context, hash common.Hash) (types.Rece // GetLogs returns all the logs for the given block hash func (b *Backend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types.Log, error) { - _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(hash) + _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(ctx, hash) if err != nil { return nil, err } @@ -567,7 +569,7 @@ func (b *Backend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHas if header == nil { return nil, nil, errors.New("header for hash not found") } - canonicalHash, err := b.GetCanonicalHash(header.Number.Uint64()) + canonicalHash, err := b.GetCanonicalHash(ctx, header.Number.Uint64()) if err != nil { return nil, nil, err } @@ -599,9 +601,9 @@ func (b *Backend) StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNu } // GetCanonicalHash gets the canonical hash for the provided number, if there is one -func (b *Backend) GetCanonicalHash(number uint64) (common.Hash, error) { +func (b *Backend) GetCanonicalHash(ctx context.Context, number uint64) (common.Hash, error) { var hashResult string - if err := b.DB.Get(&hashResult, RetrieveCanonicalBlockHashByNumber, number); err != nil { + if err := b.DB.Get(ctx, &hashResult, RetrieveCanonicalBlockHashByNumber, number); err != nil { return common.Hash{}, err } return common.HexToHash(hashResult), nil @@ -613,9 +615,9 @@ type rowResult struct { } // GetCanonicalHeader gets the canonical header for the provided number, if there is one -func (b *Backend) GetCanonicalHeader(number uint64) (string, []byte, error) { +func (b *Backend) GetCanonicalHeader(ctx context.Context, number uint64) (string, []byte, error) { headerResult := new(rowResult) - return headerResult.CID, headerResult.Data, b.DB.QueryRowx(RetrieveCanonicalHeaderByNumber, number).StructScan(headerResult) + return headerResult.CID, headerResult.Data, b.DB.QueryRow(ctx, RetrieveCanonicalHeaderByNumber, number).Scan(&headerResult.CID, &headerResult.Data) } // GetEVM constructs and returns a vm.EVM @@ -642,13 +644,13 @@ func (b *Backend) GetAccountByNumber(ctx context.Context, address common.Address var err error number := blockNumber.Int64() if blockNumber == rpc.LatestBlockNumber { - number, err = b.Retriever.RetrieveLastBlockNumber() + number, err = b.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return nil, err } } if blockNumber == rpc.EarliestBlockNumber { - number, err = b.Retriever.RetrieveFirstBlockNumber() + number, err = b.Retriever.RetrieveFirstBlockNumber(ctx) if err != nil { return nil, err } @@ -656,8 +658,8 @@ func (b *Backend) GetAccountByNumber(ctx context.Context, address common.Address if blockNumber == rpc.PendingBlockNumber { return nil, errPendingBlockNumber } - hash, err := b.GetCanonicalHash(uint64(number)) - if err == sql.ErrNoRows { + hash, err := b.GetCanonicalHash(ctx, uint64(number)) + if err == errNoRows { return nil, errHeaderNotFound } else if err != nil { return nil, err @@ -669,13 +671,13 @@ func (b *Backend) GetAccountByNumber(ctx context.Context, address common.Address // GetAccountByHash returns the account object for the provided address at the block with the provided hash func (b *Backend) GetAccountByHash(ctx context.Context, address common.Address, hash common.Hash) (*types.StateAccount, error) { _, err := b.HeaderByHash(context.Background(), hash) - if err == sql.ErrNoRows { + if err == errNoRows { return nil, errHeaderHashNotFound } else if err != nil { return nil, err } - _, accountRlp, err := b.IPLDRetriever.RetrieveAccountByAddressAndBlockHash(address, hash) + _, accountRlp, err := b.IPLDRetriever.RetrieveAccountByAddressAndBlockHash(ctx, address, hash) if err != nil { return nil, err } @@ -700,13 +702,13 @@ func (b *Backend) GetCodeByNumber(ctx context.Context, address common.Address, b var err error number := blockNumber.Int64() if blockNumber == rpc.LatestBlockNumber { - number, err = b.Retriever.RetrieveLastBlockNumber() + number, err = b.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return nil, err } } if blockNumber == rpc.EarliestBlockNumber { - number, err = b.Retriever.RetrieveFirstBlockNumber() + number, err = b.Retriever.RetrieveFirstBlockNumber(ctx) if err != nil { return nil, err } @@ -714,7 +716,7 @@ func (b *Backend) GetCodeByNumber(ctx context.Context, address common.Address, b if blockNumber == rpc.PendingBlockNumber { return nil, errPendingBlockNumber } - hash, err := b.GetCanonicalHash(uint64(number)) + hash, err := b.GetCanonicalHash(ctx, uint64(number)) if err != nil { return nil, err } @@ -729,21 +731,21 @@ func (b *Backend) GetCodeByHash(ctx context.Context, address common.Address, has codeHash := make([]byte, 0) leafKey := crypto.Keccak256Hash(address.Bytes()) // Begin tx - tx, err := b.DB.Beginx() + tx, err := b.DB.Begin(ctx) if err != nil { return nil, err } defer func() { if p := recover(); p != nil { - ethServerShared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - ethServerShared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() - err = tx.Get(&codeHash, RetrieveCodeHashByLeafKeyAndBlockHash, leafKey.Hex(), hash.Hex()) + err = tx.QueryRow(ctx, RetrieveCodeHashByLeafKeyAndBlockHash, leafKey.Hex(), hash.Hex()).Scan(&codeHash) if err != nil { return nil, err } @@ -753,7 +755,7 @@ func (b *Backend) GetCodeByHash(ctx context.Context, address common.Address, has return nil, err } code := make([]byte, 0) - err = tx.Get(&code, RetrieveCodeByMhKey, mhKey) + err = tx.QueryRow(ctx, RetrieveCodeByMhKey, mhKey).Scan(&code) return code, err } @@ -773,13 +775,13 @@ func (b *Backend) GetStorageByNumber(ctx context.Context, address common.Address var err error number := blockNumber.Int64() if blockNumber == rpc.LatestBlockNumber { - number, err = b.Retriever.RetrieveLastBlockNumber() + number, err = b.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return nil, err } } if blockNumber == rpc.EarliestBlockNumber { - number, err = b.Retriever.RetrieveFirstBlockNumber() + number, err = b.Retriever.RetrieveFirstBlockNumber(ctx) if err != nil { return nil, err } @@ -787,8 +789,8 @@ func (b *Backend) GetStorageByNumber(ctx context.Context, address common.Address if blockNumber == rpc.PendingBlockNumber { return nil, errPendingBlockNumber } - hash, err := b.GetCanonicalHash(uint64(number)) - if err == sql.ErrNoRows { + hash, err := b.GetCanonicalHash(ctx, uint64(number)) + if err == errNoRows { return nil, errHeaderNotFound } else if err != nil { return nil, err @@ -800,13 +802,13 @@ func (b *Backend) GetStorageByNumber(ctx context.Context, address common.Address // GetStorageByHash returns the storage value for the provided contract address an storage key at the block corresponding to the provided hash func (b *Backend) GetStorageByHash(ctx context.Context, address common.Address, key, hash common.Hash) (hexutil.Bytes, error) { _, err := b.HeaderByHash(context.Background(), hash) - if err == sql.ErrNoRows { + if err == errNoRows { return nil, errHeaderHashNotFound } else if err != nil { return nil, err } - _, _, storageRlp, err := b.IPLDRetriever.RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(address, key, hash) + _, _, storageRlp, err := b.IPLDRetriever.RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(ctx, address, key, hash) return storageRlp, err } diff --git a/pkg/eth/cid_retriever.go b/pkg/eth/cid_retriever.go index 4b3a193b..f724079a 100644 --- a/pkg/eth/cid_retriever.go +++ b/pkg/eth/cid_retriever.go @@ -17,13 +17,14 @@ package eth import ( + "context" "fmt" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" "github.com/jmoiron/sqlx" "github.com/lib/pq" log "github.com/sirupsen/logrus" @@ -33,60 +34,60 @@ import ( // Retriever interface for substituting mocks in tests type Retriever interface { - RetrieveFirstBlockNumber() (int64, error) - RetrieveLastBlockNumber() (int64, error) - Retrieve(filter SubscriptionSettings, blockNumber int64) ([]CIDWrapper, bool, error) + RetrieveFirstBlockNumber(ctx context.Context) (int64, error) + RetrieveLastBlockNumber(ctx context.Context) (int64, error) + Retrieve(ctx context.Context, filter SubscriptionSettings, blockNumber int64) ([]CIDWrapper, bool, error) } // CIDRetriever satisfies the CIDRetriever interface for ethereum type CIDRetriever struct { - db *postgres.DB + db sql.Database } // NewCIDRetriever returns a pointer to a new CIDRetriever which supports the CIDRetriever interface -func NewCIDRetriever(db *postgres.DB) *CIDRetriever { +func NewCIDRetriever(db sql.Database) *CIDRetriever { return &CIDRetriever{ db: db, } } // RetrieveFirstBlockNumber is used to retrieve the first block number in the db -func (ecr *CIDRetriever) RetrieveFirstBlockNumber() (int64, error) { +func (ecr *CIDRetriever) RetrieveFirstBlockNumber(ctx context.Context) (int64, error) { var blockNumber int64 - err := ecr.db.Get(&blockNumber, "SELECT block_number FROM eth.header_cids ORDER BY block_number ASC LIMIT 1") + err := ecr.db.Get(ctx, &blockNumber, "SELECT block_number FROM eth.header_cids ORDER BY block_number ASC LIMIT 1") return blockNumber, err } // RetrieveLastBlockNumber is used to retrieve the latest block number in the db -func (ecr *CIDRetriever) RetrieveLastBlockNumber() (int64, error) { +func (ecr *CIDRetriever) RetrieveLastBlockNumber(ctx context.Context) (int64, error) { var blockNumber int64 - err := ecr.db.Get(&blockNumber, "SELECT block_number FROM eth.header_cids ORDER BY block_number DESC LIMIT 1 ") + err := ecr.db.Get(ctx, &blockNumber, "SELECT block_number FROM eth.header_cids ORDER BY block_number DESC LIMIT 1 ") return blockNumber, err } // Retrieve is used to retrieve all of the CIDs which conform to the passed StreamFilters -func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64) ([]CIDWrapper, bool, error) { +func (ecr *CIDRetriever) Retrieve(ctx context.Context, filter SubscriptionSettings, blockNumber int64) ([]CIDWrapper, bool, error) { log.Debug("retrieving cids") // Begin new db tx - tx, err := ecr.db.Beginx() + tx, err := ecr.db.Begin(ctx) if err != nil { return nil, true, err } defer func() { if p := recover(); p != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() // Retrieve cached header CIDs at this block height var headers []models.HeaderModel - headers, err = ecr.RetrieveHeaderCIDs(tx, blockNumber) + headers, err = ecr.RetrieveHeaderCIDs(ctx, tx, blockNumber) if err != nil { log.Error("header cid retrieval error", err) return nil, true, err @@ -102,7 +103,7 @@ func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64 if filter.HeaderFilter.Uncles { // Retrieve uncle cids for this header id var uncleCIDs []models.UncleModel - uncleCIDs, err = ecr.RetrieveUncleCIDsByHeaderID(tx, header.ID) + uncleCIDs, err = ecr.RetrieveUncleCIDsByHeaderID(ctx, tx, header.BlockHash) if err != nil { log.Error("uncle cid retrieval error") return nil, true, err @@ -112,7 +113,7 @@ func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64 } // Retrieve cached trx CIDs if !filter.TxFilter.Off { - cw.Transactions, err = ecr.RetrieveTxCIDs(tx, filter.TxFilter, header.ID) + cw.Transactions, err = ecr.RetrieveTxCIDs(ctx, tx, filter.TxFilter, header.BlockHash) if err != nil { log.Error("transaction cid retrieval error") return nil, true, err @@ -121,13 +122,13 @@ func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64 empty = false } } - trxIds := make([]int64, len(cw.Transactions)) - for j, tx := range cw.Transactions { - trxIds[j] = tx.ID + trxHashes := make([]string, len(cw.Transactions)) + for j, t := range cw.Transactions { + trxHashes[j] = t.TxHash } // Retrieve cached receipt CIDs if !filter.ReceiptFilter.Off { - cw.Receipts, err = ecr.RetrieveRctCIDsByHeaderID(tx, filter.ReceiptFilter, header.ID, trxIds) + cw.Receipts, err = ecr.RetrieveRctCIDsByHeaderID(ctx, tx, filter.ReceiptFilter, header.BlockHash, trxHashes) if err != nil { log.Error("receipt cid retrieval error") return nil, true, err @@ -138,7 +139,7 @@ func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64 } // Retrieve cached state CIDs if !filter.StateFilter.Off { - cw.StateNodes, err = ecr.RetrieveStateCIDs(tx, filter.StateFilter, header.ID) + cw.StateNodes, err = ecr.RetrieveStateCIDs(ctx, tx, filter.StateFilter, header.BlockHash) if err != nil { log.Error("state cid retrieval error") return nil, true, err @@ -149,7 +150,7 @@ func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64 } // Retrieve cached storage CIDs if !filter.StorageFilter.Off { - cw.StorageNodes, err = ecr.RetrieveStorageCIDs(tx, filter.StorageFilter, header.ID) + cw.StorageNodes, err = ecr.RetrieveStorageCIDs(ctx, tx, filter.StorageFilter, header.BlockHash) if err != nil { log.Error("storage cid retrieval error") return nil, true, err @@ -165,26 +166,27 @@ func (ecr *CIDRetriever) Retrieve(filter SubscriptionSettings, blockNumber int64 } // RetrieveHeaderCIDs retrieves and returns all of the header cids at the provided blockheight -func (ecr *CIDRetriever) RetrieveHeaderCIDs(tx *sqlx.Tx, blockNumber int64) ([]models.HeaderModel, error) { +func (ecr *CIDRetriever) RetrieveHeaderCIDs(ctx context.Context, tx sql.Tx, blockNumber int64) ([]models.HeaderModel, error) { log.Debug("retrieving header cids for block ", blockNumber) headers := make([]models.HeaderModel, 0) pgStr := `SELECT * FROM eth.header_cids WHERE block_number = $1` - return headers, tx.Select(&headers, pgStr, blockNumber) + return headers, tx.QueryRow(ctx, pgStr, blockNumber).Scan(&headers) } // RetrieveUncleCIDsByHeaderID retrieves and returns all of the uncle cids for the provided header -func (ecr *CIDRetriever) RetrieveUncleCIDsByHeaderID(tx *sqlx.Tx, headerID int64) ([]models.UncleModel, error) { +func (ecr *CIDRetriever) RetrieveUncleCIDsByHeaderID(ctx context.Context, tx sql.Tx, headerID string) ([]models.UncleModel, error) { log.Debug("retrieving uncle cids for block id ", headerID) headers := make([]models.UncleModel, 0) pgStr := `SELECT * FROM eth.uncle_cids WHERE header_id = $1` - return headers, tx.Select(&headers, pgStr, headerID) + + return headers, tx.QueryRow(ctx, pgStr, headerID).Scan(headers) } // RetrieveTxCIDs retrieves and returns all of the trx cids at the provided blockheight that conform to the provided filter parameters // also returns the ids for the returned transaction cids -func (ecr *CIDRetriever) RetrieveTxCIDs(tx *sqlx.Tx, txFilter TxFilter, headerID int64) ([]models.TxModel, error) { +func (ecr *CIDRetriever) RetrieveTxCIDs(ctx context.Context, tx sql.Tx, txFilter TxFilter, headerID string) ([]models.TxModel, error) { log.Debug("retrieving transaction cids for header id ", headerID) args := make([]interface{}, 0, 3) results := make([]models.TxModel, 0) @@ -206,7 +208,7 @@ func (ecr *CIDRetriever) RetrieveTxCIDs(tx *sqlx.Tx, txFilter TxFilter, headerID args = append(args, pq.Array(txFilter.Src)) } pgStr += ` ORDER BY transaction_cids.index` - return results, tx.Select(&results, pgStr, args...) + return results, tx.QueryRow(ctx, pgStr, args...).Scan(results) } func topicFilterCondition(id *int, topics [][]string, args []interface{}, pgStr string, first bool) (string, []interface{}) { @@ -242,7 +244,7 @@ func logFilterCondition(id *int, pgStr string, args []interface{}, rctFilter Rec return pgStr, args } -func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilter ReceiptFilter, trxIds []int64) (string, []interface{}) { +func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilter ReceiptFilter, txHashes []string) (string, []interface{}) { rctCond := " AND (receipt_cids.id = ANY ( " logQuery := "SELECT receipt_id FROM eth.log_cids WHERE" if len(rctFilter.LogAddresses) > 0 { @@ -258,10 +260,10 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte pgStr += ")" - // Filter on txIDs if there are any and we are matching txs - if rctFilter.MatchTxs && len(trxIds) > 0 { - pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d::INTEGER[])`, *id) - args = append(args, pq.Array(trxIds)) + // Filter on txHashes if there are any, and we are matching txs + if rctFilter.MatchTxs && len(txHashes) > 0 { + pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d::STRING[])`, *id) + args = append(args, pq.Array(txHashes)) } pgStr += ")" } else { // If there are no contract addresses to filter on @@ -270,17 +272,17 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte pgStr += rctCond + logQuery pgStr, args = topicFilterCondition(id, rctFilter.Topics, args, pgStr, true) pgStr += ")" - // Filter on txIDs if there are any and we are matching txs - if rctFilter.MatchTxs && len(trxIds) > 0 { - pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d::INTEGER[])`, *id) - args = append(args, pq.Array(trxIds)) + // Filter on txHashes if there are any, and we are matching txs + if rctFilter.MatchTxs && len(txHashes) > 0 { + pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d::STRING[])`, *id) + args = append(args, pq.Array(txHashes)) } pgStr += ")" - } else if rctFilter.MatchTxs && len(trxIds) > 0 { + } else if rctFilter.MatchTxs && len(txHashes) > 0 { // If there are no contract addresses or topics to filter on, - // Filter on txIDs if there are any and we are matching txs - pgStr += fmt.Sprintf(` AND receipt_cids.tx_id = ANY($%d::INTEGER[])`, *id) - args = append(args, pq.Array(trxIds)) + // Filter on txHashes if there are any, and we are matching txs + pgStr += fmt.Sprintf(` AND receipt_cids.tx_id = ANY($%d::STRING[])`, *id) + args = append(args, pq.Array(txHashes)) } } @@ -289,7 +291,7 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte // RetrieveRctCIDsByHeaderID retrieves and returns all of the rct cids at the provided header ID that conform to the provided // filter parameters and correspond to the provided tx ids -func (ecr *CIDRetriever) RetrieveRctCIDsByHeaderID(tx *sqlx.Tx, rctFilter ReceiptFilter, headerID int64, trxIds []int64) ([]models.ReceiptModel, error) { +func (ecr *CIDRetriever) RetrieveRctCIDsByHeaderID(ctx context.Context, tx sql.Tx, rctFilter ReceiptFilter, headerID string, trxHashes []string) ([]models.ReceiptModel, error) { log.Debug("retrieving receipt cids for header id ", headerID) args := make([]interface{}, 0, 4) pgStr := `SELECT receipt_cids.id, receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, @@ -301,20 +303,20 @@ func (ecr *CIDRetriever) RetrieveRctCIDsByHeaderID(tx *sqlx.Tx, rctFilter Receip id := 2 args = append(args, headerID) - pgStr, args = receiptFilterConditions(&id, pgStr, args, rctFilter, trxIds) + pgStr, args = receiptFilterConditions(&id, pgStr, args, rctFilter, trxHashes) pgStr += ` ORDER BY transaction_cids.index` receiptCids := make([]models.ReceiptModel, 0) - return receiptCids, tx.Select(&receiptCids, pgStr, args...) + return receiptCids, tx.QueryRow(ctx, pgStr, args...).Scan(receiptCids) } // RetrieveFilteredGQLLogs retrieves and returns all the log cIDs provided blockHash that conform to the provided // filter parameters. -func (ecr *CIDRetriever) RetrieveFilteredGQLLogs(tx *sqlx.Tx, rctFilter ReceiptFilter, blockHash *common.Hash) ([]LogResult, error) { +func (ecr *CIDRetriever) RetrieveFilteredGQLLogs(ctx context.Context, tx sql.Tx, rctFilter ReceiptFilter, blockHash *common.Hash) ([]LogResult, error) { log.Debug("retrieving log cids for receipt ids") args := make([]interface{}, 0, 4) id := 1 - pgStr := `SELECT eth.log_cids.leaf_cid, eth.log_cids.index, eth.log_cids.receipt_id, + pgStr := `SELECT eth.log_cids.leaf_cid, eth.log_cids.index, eth.log_cids.rct_id, eth.log_cids.address, eth.log_cids.topic0, eth.log_cids.topic1, eth.log_cids.topic2, eth.log_cids.topic3, eth.log_cids.log_data, eth.transaction_cids.tx_hash, data, eth.receipt_cids.leaf_cid as cid, eth.receipt_cids.post_status FROM eth.log_cids, eth.receipt_cids, eth.transaction_cids, eth.header_cids, public.blocks @@ -330,20 +332,15 @@ func (ecr *CIDRetriever) RetrieveFilteredGQLLogs(tx *sqlx.Tx, rctFilter ReceiptF pgStr += ` ORDER BY log_cids.index` logCIDs := make([]LogResult, 0) - err := tx.Select(&logCIDs, pgStr, args...) - if err != nil { - return nil, err - } - - return logCIDs, nil + return logCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&logCIDs) } // RetrieveFilteredLog retrieves and returns all the log cIDs provided blockHeight or blockHash that conform to the provided // filter parameters. -func (ecr *CIDRetriever) RetrieveFilteredLog(tx *sqlx.Tx, rctFilter ReceiptFilter, blockNumber int64, blockHash *common.Hash) ([]LogResult, error) { +func (ecr *CIDRetriever) RetrieveFilteredLog(ctx context.Context, tx sql.Tx, rctFilter ReceiptFilter, blockNumber int64, blockHash *common.Hash) ([]LogResult, error) { log.Debug("retrieving log cids for receipt ids") args := make([]interface{}, 0, 4) - pgStr := `SELECT eth.log_cids.leaf_cid, eth.log_cids.index, eth.log_cids.receipt_id, + pgStr := `SELECT eth.log_cids.leaf_cid, eth.log_cids.index, eth.log_cids.rct_id, eth.log_cids.address, eth.log_cids.topic0, eth.log_cids.topic1, eth.log_cids.topic2, eth.log_cids.topic3, eth.log_cids.log_data, eth.transaction_cids.tx_hash, eth.transaction_cids.index as txn_index, header_cids.block_hash, header_cids.block_number @@ -367,17 +364,12 @@ func (ecr *CIDRetriever) RetrieveFilteredLog(tx *sqlx.Tx, rctFilter ReceiptFilte pgStr += ` ORDER BY log_cids.index` logCIDs := make([]LogResult, 0) - err := tx.Select(&logCIDs, pgStr, args...) - if err != nil { - return nil, err - } - - return logCIDs, nil + return logCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&logCIDs) } // RetrieveRctCIDs retrieves and returns all of the rct cids at the provided blockheight or block hash that conform to the provided // filter parameters and correspond to the provided tx ids -func (ecr *CIDRetriever) RetrieveRctCIDs(tx *sqlx.Tx, rctFilter ReceiptFilter, blockNumber int64, blockHash *common.Hash, trxIds []int64) ([]models.ReceiptModel, error) { +func (ecr *CIDRetriever) RetrieveRctCIDs(tx *sqlx.Tx, rctFilter ReceiptFilter, blockNumber int64, blockHash *common.Hash, txHashes []string) ([]models.ReceiptModel, error) { log.Debug("retrieving receipt cids for block ", blockNumber) args := make([]interface{}, 0, 5) pgStr := `SELECT receipt_cids.id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.tx_id @@ -396,7 +388,7 @@ func (ecr *CIDRetriever) RetrieveRctCIDs(tx *sqlx.Tx, rctFilter ReceiptFilter, b id++ } - pgStr, args = receiptFilterConditions(&id, pgStr, args, rctFilter, trxIds) + pgStr, args = receiptFilterConditions(&id, pgStr, args, rctFilter, txHashes) pgStr += ` ORDER BY transaction_cids.index` receiptCids := make([]models.ReceiptModel, 0) @@ -413,7 +405,7 @@ func hasTopics(topics [][]string) bool { } // RetrieveStateCIDs retrieves and returns all of the state node cids at the provided header ID that conform to the provided filter parameters -func (ecr *CIDRetriever) RetrieveStateCIDs(tx *sqlx.Tx, stateFilter StateFilter, headerID int64) ([]models.StateNodeModel, error) { +func (ecr *CIDRetriever) RetrieveStateCIDs(ctx context.Context, tx sql.Tx, stateFilter StateFilter, headerID string) ([]models.StateNodeModel, error) { log.Debug("retrieving state cids for header id ", headerID) args := make([]interface{}, 0, 2) pgStr := `SELECT state_cids.id, state_cids.header_id, @@ -434,19 +426,19 @@ func (ecr *CIDRetriever) RetrieveStateCIDs(tx *sqlx.Tx, stateFilter StateFilter, pgStr += ` AND state_cids.node_type = 2` } stateNodeCIDs := make([]models.StateNodeModel, 0) - return stateNodeCIDs, tx.Select(&stateNodeCIDs, pgStr, args...) + return stateNodeCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&stateNodeCIDs) } // RetrieveStorageCIDs retrieves and returns all of the storage node cids at the provided header id that conform to the provided filter parameters -func (ecr *CIDRetriever) RetrieveStorageCIDs(tx *sqlx.Tx, storageFilter StorageFilter, headerID int64) ([]models.StorageNodeWithStateKeyModel, error) { +func (ecr *CIDRetriever) RetrieveStorageCIDs(ctx context.Context, tx sql.Tx, storageFilter StorageFilter, headerID string) ([]models.StorageNodeWithStateKeyModel, error) { log.Debug("retrieving storage cids for header id ", headerID) args := make([]interface{}, 0, 3) pgStr := `SELECT storage_cids.id, storage_cids.state_id, storage_cids.storage_leaf_key, storage_cids.node_type, storage_cids.cid, storage_cids.mh_key, storage_cids.storage_path, state_cids.state_leaf_key FROM eth.storage_cids, eth.state_cids, eth.header_cids - WHERE storage_cids.state_id = state_cids.id - AND state_cids.header_id = header_cids.id - AND header_cids.id = $1` + WHERE storage_cids.header_id = state_cids.header_id AND storage_cids.state_path = state_cids.state_path + AND state_cids.header_id = header_cids.block_hash + AND header_cids.block_hash = $1` args = append(args, headerID) id := 2 addrLen := len(storageFilter.Addresses) @@ -467,53 +459,53 @@ func (ecr *CIDRetriever) RetrieveStorageCIDs(tx *sqlx.Tx, storageFilter StorageF pgStr += ` AND storage_cids.node_type = 2` } storageNodeCIDs := make([]models.StorageNodeWithStateKeyModel, 0) - return storageNodeCIDs, tx.Select(&storageNodeCIDs, pgStr, args...) + return storageNodeCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&storageNodeCIDs) } // RetrieveBlockByHash returns all of the CIDs needed to compose an entire block, for a given block hash -func (ecr *CIDRetriever) RetrieveBlockByHash(blockHash common.Hash) (models.HeaderModel, []models.UncleModel, []models.TxModel, []models.ReceiptModel, error) { +func (ecr *CIDRetriever) RetrieveBlockByHash(ctx context.Context, blockHash common.Hash) (models.HeaderModel, []models.UncleModel, []models.TxModel, []models.ReceiptModel, error) { log.Debug("retrieving block cids for block hash ", blockHash.String()) // Begin new db tx - tx, err := ecr.db.Beginx() + tx, err := ecr.db.Begin(ctx) if err != nil { return models.HeaderModel{}, nil, nil, nil, err } defer func() { if p := recover(); p != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() var headerCID models.HeaderModel - headerCID, err = ecr.RetrieveHeaderCIDByHash(tx, blockHash) + headerCID, err = ecr.RetrieveHeaderCIDByHash(ctx, tx, blockHash) if err != nil { log.Error("header cid retrieval error") return models.HeaderModel{}, nil, nil, nil, err } var uncleCIDs []models.UncleModel - uncleCIDs, err = ecr.RetrieveUncleCIDsByHeaderID(tx, headerCID.ID) + uncleCIDs, err = ecr.RetrieveUncleCIDsByHeaderID(ctx, tx, headerCID.BlockHash) if err != nil { log.Error("uncle cid retrieval error") return models.HeaderModel{}, nil, nil, nil, err } var txCIDs []models.TxModel - txCIDs, err = ecr.RetrieveTxCIDsByHeaderID(tx, headerCID.ID) + txCIDs, err = ecr.RetrieveTxCIDsByHeaderID(ctx, tx, headerCID.BlockHash) if err != nil { log.Error("tx cid retrieval error") return models.HeaderModel{}, nil, nil, nil, err } - txIDs := make([]int64, len(txCIDs)) + txHashes := make([]string, len(txCIDs)) for i, txCID := range txCIDs { - txIDs[i] = txCID.ID + txHashes[i] = txCID.TxHash } var rctCIDs []models.ReceiptModel - rctCIDs, err = ecr.RetrieveReceiptCIDsByTxIDs(tx, txIDs) + rctCIDs, err = ecr.RetrieveReceiptCIDsByTxIDs(ctx, tx, txHashes) if err != nil { log.Error("rct cid retrieval error") } @@ -521,27 +513,27 @@ func (ecr *CIDRetriever) RetrieveBlockByHash(blockHash common.Hash) (models.Head } // RetrieveBlockByNumber returns all of the CIDs needed to compose an entire block, for a given block number -func (ecr *CIDRetriever) RetrieveBlockByNumber(blockNumber int64) (models.HeaderModel, []models.UncleModel, []models.TxModel, []models.ReceiptModel, error) { +func (ecr *CIDRetriever) RetrieveBlockByNumber(ctx context.Context, blockNumber int64) (models.HeaderModel, []models.UncleModel, []models.TxModel, []models.ReceiptModel, error) { log.Debug("retrieving block cids for block number ", blockNumber) // Begin new db tx - tx, err := ecr.db.Beginx() + tx, err := ecr.db.Begin(ctx) if err != nil { return models.HeaderModel{}, nil, nil, nil, err } defer func() { if p := recover(); p != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() var headerCID []models.HeaderModel - headerCID, err = ecr.RetrieveHeaderCIDs(tx, blockNumber) + headerCID, err = ecr.RetrieveHeaderCIDs(ctx, tx, blockNumber) if err != nil { log.Error("header cid retrieval error") return models.HeaderModel{}, nil, nil, nil, err @@ -550,23 +542,23 @@ func (ecr *CIDRetriever) RetrieveBlockByNumber(blockNumber int64) (models.Header return models.HeaderModel{}, nil, nil, nil, fmt.Errorf("header cid retrieval error, no header CIDs found at block %d", blockNumber) } var uncleCIDs []models.UncleModel - uncleCIDs, err = ecr.RetrieveUncleCIDsByHeaderID(tx, headerCID[0].ID) + uncleCIDs, err = ecr.RetrieveUncleCIDsByHeaderID(ctx, tx, headerCID[0].BlockHash) if err != nil { log.Error("uncle cid retrieval error") return models.HeaderModel{}, nil, nil, nil, err } var txCIDs []models.TxModel - txCIDs, err = ecr.RetrieveTxCIDsByHeaderID(tx, headerCID[0].ID) + txCIDs, err = ecr.RetrieveTxCIDsByHeaderID(ctx, tx, headerCID[0].BlockHash) if err != nil { log.Error("tx cid retrieval error") return models.HeaderModel{}, nil, nil, nil, err } - txIDs := make([]int64, len(txCIDs)) + txHashes := make([]string, len(txCIDs)) for i, txCID := range txCIDs { - txIDs[i] = txCID.ID + txHashes[i] = txCID.TxHash } var rctCIDs []models.ReceiptModel - rctCIDs, err = ecr.RetrieveReceiptCIDsByTxIDs(tx, txIDs) + rctCIDs, err = ecr.RetrieveReceiptCIDsByTxIDs(ctx, tx, txHashes) if err != nil { log.Error("rct cid retrieval error") } @@ -574,27 +566,29 @@ func (ecr *CIDRetriever) RetrieveBlockByNumber(blockNumber int64) (models.Header } // RetrieveHeaderCIDByHash returns the header for the given block hash -func (ecr *CIDRetriever) RetrieveHeaderCIDByHash(tx *sqlx.Tx, blockHash common.Hash) (models.HeaderModel, error) { +func (ecr *CIDRetriever) RetrieveHeaderCIDByHash(ctx context.Context, tx sql.Tx, blockHash common.Hash) (models.HeaderModel, error) { log.Debug("retrieving header cids for block hash ", blockHash.String()) pgStr := `SELECT * FROM eth.header_cids WHERE block_hash = $1` var headerCID models.HeaderModel - return headerCID, tx.Get(&headerCID, pgStr, blockHash.String()) + return headerCID, tx.QueryRow(ctx, pgStr, blockHash.String()).Scan(&headerCID.CID, &headerCID.NodeID, &headerCID.BlockHash, &headerCID.BlockNumber, + &headerCID.BaseFee, &headerCID.Bloom, &headerCID.MhKey, &headerCID.ParentHash, &headerCID.RctRoot, &headerCID.Reward, &headerCID.StateRoot, + &headerCID.Timestamp, &headerCID.TimesValidated, &headerCID.TotalDifficulty, &headerCID.TxRoot, &headerCID.UncleRoot) } // RetrieveTxCIDsByHeaderID retrieves all tx CIDs for the given header id -func (ecr *CIDRetriever) RetrieveTxCIDsByHeaderID(tx *sqlx.Tx, headerID int64) ([]models.TxModel, error) { +func (ecr *CIDRetriever) RetrieveTxCIDsByHeaderID(ctx context.Context, tx sql.Tx, headerID string) ([]models.TxModel, error) { log.Debug("retrieving tx cids for block id ", headerID) pgStr := `SELECT * FROM eth.transaction_cids WHERE header_id = $1 ORDER BY index` var txCIDs []models.TxModel - return txCIDs, tx.Select(&txCIDs, pgStr, headerID) + return txCIDs, tx.QueryRow(ctx, pgStr, headerID).(*sqlx.Row).Scan(&txCIDs) } // RetrieveReceiptCIDsByTxIDs retrieves receipt CIDs by their associated tx IDs -func (ecr *CIDRetriever) RetrieveReceiptCIDsByTxIDs(tx *sqlx.Tx, txIDs []int64) ([]models.ReceiptModel, error) { - log.Debugf("retrieving receipt cids for tx ids %v", txIDs) +func (ecr *CIDRetriever) RetrieveReceiptCIDsByTxIDs(ctx context.Context, tx sql.Tx, txHashes []string) ([]models.ReceiptModel, error) { + log.Debugf("retrieving receipt cids for tx ids %v", txHashes) pgStr := `SELECT receipt_cids.id, receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.contract, receipt_cids.contract_hash FROM eth.receipt_cids, eth.transaction_cids @@ -602,5 +596,5 @@ func (ecr *CIDRetriever) RetrieveReceiptCIDsByTxIDs(tx *sqlx.Tx, txIDs []int64) AND receipt_cids.tx_id = transaction_cids.id ORDER BY transaction_cids.index` var rctCIDs []models.ReceiptModel - return rctCIDs, tx.Select(&rctCIDs, pgStr, pq.Array(txIDs)) + return rctCIDs, tx.QueryRow(ctx, pgStr, pq.Array(txHashes)).Scan(rctCIDs) } diff --git a/pkg/eth/cid_retriever_test.go b/pkg/eth/cid_retriever_test.go index f6b74b99..06fffda6 100644 --- a/pkg/eth/cid_retriever_test.go +++ b/pkg/eth/cid_retriever_test.go @@ -20,9 +20,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/statediff/indexer" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/node" "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/common" @@ -211,21 +212,23 @@ var ( var _ = Describe("Retriever", func() { var ( - db *postgres.DB - diffIndexer *indexer.StateDiffIndexer + db sql.Database + diffIndexer interfaces.StateDiffIndexer retriever *eth.CIDRetriever ) BeforeEach(func() { var err error - db, err = SetupDB() + goodInfo := node.Info{GenesisBlock: "GENESIS2", NetworkID: "2", ID: "2", ClientName: "geth2", ChainID: 2} + db, err = eth.Setup(ctx, goodInfo) Expect(err).ToNot(HaveOccurred()) - diffIndexer, err = indexer.NewStateDiffIndexer(params.TestChainConfig, db) + diffIndexer, err = sql.NewStateDiffIndexer(ctx, params.TestChainConfig, db) + Expect(err).ToNot(HaveOccurred()) retriever = eth.NewCIDRetriever(db) }) AfterEach(func() { - eth.TearDownDB(db) + eth.TearDownDB(ctx, db) }) Describe("Retrieve", func() { @@ -233,11 +236,11 @@ var _ = Describe("Retriever", func() { tx, err := diffIndexer.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) for _, node := range test_helpers.MockStateNodes { - err = diffIndexer.PushStateNode(tx, node) + err = diffIndexer.PushStateNode(tx, node, test_helpers.MockBlock.Hash().String()) Expect(err).ToNot(HaveOccurred()) } - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) }) It("Retrieves all CIDs for the given blocknumber when provided an open filter", func() { @@ -247,19 +250,19 @@ var _ = Describe("Retriever", func() { } expectedRctCIDsAndLeafNodes := make([]rctCIDAndMHKeyResult, 0) pgStr := `SELECT receipt_cids.leaf_cid, receipt_cids.leaf_mh_key FROM eth.receipt_cids, eth.transaction_cids, eth.header_cids - WHERE receipt_cids.tx_id = transaction_cids.id - AND transaction_cids.header_id = header_cids.id + WHERE receipt_cids.tx_id = transaction_cids.tx_hash + AND transaction_cids.header_id = header_cids.block_hash AND header_cids.block_number = $1 ORDER BY transaction_cids.index` - err := db.Select(&expectedRctCIDsAndLeafNodes, pgStr, test_helpers.BlockNumber.Uint64()) - cids, empty, err := retriever.Retrieve(openFilter, 1) + err := db.Select(ctx, &expectedRctCIDsAndLeafNodes, pgStr, test_helpers.BlockNumber.Uint64()) + cids, empty, err := retriever.Retrieve(ctx, openFilter, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids)).To(Equal(1)) Expect(cids[0].BlockNumber).To(Equal(test_helpers.MockCIDWrapper.BlockNumber)) expectedHeaderCID := test_helpers.MockCIDWrapper.Header - expectedHeaderCID.ID = cids[0].Header.ID + expectedHeaderCID.BlockHash = cids[0].Header.BlockHash expectedHeaderCID.NodeID = cids[0].Header.NodeID Expect(cids[0].Header).To(Equal(expectedHeaderCID)) Expect(len(cids[0].Transactions)).To(Equal(4)) @@ -286,8 +289,8 @@ var _ = Describe("Retriever", func() { } Expect(len(cids[0].StorageNodes)).To(Equal(1)) expectedStorageNodeCIDs := test_helpers.MockCIDWrapper.StorageNodes - expectedStorageNodeCIDs[0].ID = cids[0].StorageNodes[0].ID - expectedStorageNodeCIDs[0].StateID = cids[0].StorageNodes[0].StateID + expectedStorageNodeCIDs[0].HeaderID = cids[0].StorageNodes[0].HeaderID + expectedStorageNodeCIDs[0].StatePath = cids[0].StorageNodes[0].StatePath Expect(cids[0].StorageNodes).To(Equal(expectedStorageNodeCIDs)) }) @@ -302,8 +305,8 @@ var _ = Describe("Retriever", func() { AND transaction_cids.header_id = header_cids.id AND header_cids.block_number = $1 ORDER BY transaction_cids.index` - err := db.Select(&expectedRctCIDsAndLeafNodes, pgStr, test_helpers.BlockNumber.Uint64()) - cids1, empty, err := retriever.Retrieve(rctAddressFilter, 1) + err := db.Select(ctx, &expectedRctCIDsAndLeafNodes, pgStr, test_helpers.BlockNumber.Uint64()) + cids1, empty, err := retriever.Retrieve(ctx, rctAddressFilter, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids1)).To(Equal(1)) @@ -314,13 +317,12 @@ var _ = Describe("Retriever", func() { Expect(len(cids1[0].StorageNodes)).To(Equal(0)) Expect(len(cids1[0].Receipts)).To(Equal(1)) expectedReceiptCID := test_helpers.MockCIDWrapper.Receipts[0] - expectedReceiptCID.ID = cids1[0].Receipts[0].ID expectedReceiptCID.TxID = cids1[0].Receipts[0].TxID expectedReceiptCID.LeafCID = expectedRctCIDsAndLeafNodes[0].LeafCID expectedReceiptCID.LeafMhKey = expectedRctCIDsAndLeafNodes[0].LeafMhKey Expect(cids1[0].Receipts[0]).To(Equal(expectedReceiptCID)) - cids2, empty, err := retriever.Retrieve(rctTopicsFilter, 1) + cids2, empty, err := retriever.Retrieve(ctx, rctTopicsFilter, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids2)).To(Equal(1)) @@ -331,13 +333,12 @@ var _ = Describe("Retriever", func() { Expect(len(cids2[0].StorageNodes)).To(Equal(0)) Expect(len(cids2[0].Receipts)).To(Equal(1)) expectedReceiptCID = test_helpers.MockCIDWrapper.Receipts[0] - expectedReceiptCID.ID = cids2[0].Receipts[0].ID expectedReceiptCID.TxID = cids2[0].Receipts[0].TxID expectedReceiptCID.LeafCID = expectedRctCIDsAndLeafNodes[0].LeafCID expectedReceiptCID.LeafMhKey = expectedRctCIDsAndLeafNodes[0].LeafMhKey Expect(cids2[0].Receipts[0]).To(Equal(expectedReceiptCID)) - cids3, empty, err := retriever.Retrieve(rctTopicsAndAddressFilter, 1) + cids3, empty, err := retriever.Retrieve(ctx, rctTopicsAndAddressFilter, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids3)).To(Equal(1)) @@ -348,13 +349,12 @@ var _ = Describe("Retriever", func() { Expect(len(cids3[0].StorageNodes)).To(Equal(0)) Expect(len(cids3[0].Receipts)).To(Equal(1)) expectedReceiptCID = test_helpers.MockCIDWrapper.Receipts[0] - expectedReceiptCID.ID = cids3[0].Receipts[0].ID expectedReceiptCID.TxID = cids3[0].Receipts[0].TxID expectedReceiptCID.LeafCID = expectedRctCIDsAndLeafNodes[0].LeafCID expectedReceiptCID.LeafMhKey = expectedRctCIDsAndLeafNodes[0].LeafMhKey Expect(cids3[0].Receipts[0]).To(Equal(expectedReceiptCID)) - cids4, empty, err := retriever.Retrieve(rctAddressesAndTopicFilter, 1) + cids4, empty, err := retriever.Retrieve(ctx, rctAddressesAndTopicFilter, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids4)).To(Equal(1)) @@ -365,13 +365,12 @@ var _ = Describe("Retriever", func() { Expect(len(cids4[0].StorageNodes)).To(Equal(0)) Expect(len(cids4[0].Receipts)).To(Equal(1)) expectedReceiptCID = test_helpers.MockCIDWrapper.Receipts[1] - expectedReceiptCID.ID = cids4[0].Receipts[0].ID expectedReceiptCID.TxID = cids4[0].Receipts[0].TxID expectedReceiptCID.LeafCID = expectedRctCIDsAndLeafNodes[1].LeafCID expectedReceiptCID.LeafMhKey = expectedRctCIDsAndLeafNodes[1].LeafMhKey Expect(cids4[0].Receipts[0]).To(Equal(expectedReceiptCID)) - cids5, empty, err := retriever.Retrieve(rctsForAllCollectedTrxs, 1) + cids5, empty, err := retriever.Retrieve(ctx, rctsForAllCollectedTrxs, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids5)).To(Equal(1)) @@ -388,7 +387,7 @@ var _ = Describe("Retriever", func() { Expect(eth.ReceiptModelsContainsCID(cids5[0].Receipts, expectedRctCIDsAndLeafNodes[1].LeafCID)).To(BeTrue()) Expect(eth.ReceiptModelsContainsCID(cids5[0].Receipts, expectedRctCIDsAndLeafNodes[2].LeafCID)).To(BeTrue()) - cids6, empty, err := retriever.Retrieve(rctsForSelectCollectedTrxs, 1) + cids6, empty, err := retriever.Retrieve(ctx, rctsForSelectCollectedTrxs, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids6)).To(Equal(1)) @@ -396,20 +395,19 @@ var _ = Describe("Retriever", func() { Expect(cids6[0].Header).To(Equal(models.HeaderModel{})) Expect(len(cids6[0].Transactions)).To(Equal(1)) expectedTxCID := test_helpers.MockCIDWrapper.Transactions[1] - expectedTxCID.ID = cids6[0].Transactions[0].ID + expectedTxCID.TxHash = cids6[0].Transactions[0].TxHash expectedTxCID.HeaderID = cids6[0].Transactions[0].HeaderID Expect(cids6[0].Transactions[0]).To(Equal(expectedTxCID)) Expect(len(cids6[0].StateNodes)).To(Equal(0)) Expect(len(cids6[0].StorageNodes)).To(Equal(0)) Expect(len(cids6[0].Receipts)).To(Equal(1)) expectedReceiptCID = test_helpers.MockCIDWrapper.Receipts[1] - expectedReceiptCID.ID = cids6[0].Receipts[0].ID expectedReceiptCID.TxID = cids6[0].Receipts[0].TxID expectedReceiptCID.LeafCID = expectedRctCIDsAndLeafNodes[1].LeafCID expectedReceiptCID.LeafMhKey = expectedRctCIDsAndLeafNodes[1].LeafMhKey Expect(cids6[0].Receipts[0]).To(Equal(expectedReceiptCID)) - cids7, empty, err := retriever.Retrieve(stateFilter, 1) + cids7, empty, err := retriever.Retrieve(ctx, stateFilter, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).ToNot(BeTrue()) Expect(len(cids7)).To(Equal(1)) @@ -420,7 +418,6 @@ var _ = Describe("Retriever", func() { Expect(len(cids7[0].StorageNodes)).To(Equal(0)) Expect(len(cids7[0].StateNodes)).To(Equal(1)) Expect(cids7[0].StateNodes[0]).To(Equal(models.StateNodeModel{ - ID: cids7[0].StateNodes[0].ID, HeaderID: cids7[0].StateNodes[0].HeaderID, NodeType: 2, StateKey: common.BytesToHash(test_helpers.AccountLeafKey).Hex(), @@ -429,7 +426,7 @@ var _ = Describe("Retriever", func() { Path: []byte{'\x0c'}, })) - _, empty, err = retriever.Retrieve(rctTopicsAndAddressFilterFail, 1) + _, empty, err = retriever.Retrieve(ctx, rctTopicsAndAddressFilterFail, 1) Expect(err).ToNot(HaveOccurred()) Expect(empty).To(BeTrue()) }) @@ -437,17 +434,17 @@ var _ = Describe("Retriever", func() { Describe("RetrieveFirstBlockNumber", func() { It("Throws an error if there are no blocks in the database", func() { - _, err := retriever.RetrieveFirstBlockNumber() + _, err := retriever.RetrieveFirstBlockNumber(ctx) Expect(err).To(HaveOccurred()) }) It("Gets the number of the first block that has data in the database", func() { tx, err := diffIndexer.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) - num, err := retriever.RetrieveFirstBlockNumber() + num, err := retriever.RetrieveFirstBlockNumber(ctx) Expect(err).ToNot(HaveOccurred()) Expect(num).To(Equal(int64(1))) }) @@ -458,10 +455,10 @@ var _ = Describe("Retriever", func() { tx, err := diffIndexer.PushBlock(payload.Block, payload.Receipts, payload.Block.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) - num, err := retriever.RetrieveFirstBlockNumber() + num, err := retriever.RetrieveFirstBlockNumber(ctx) Expect(err).ToNot(HaveOccurred()) Expect(num).To(Equal(int64(1010101))) }) @@ -473,15 +470,15 @@ var _ = Describe("Retriever", func() { payload2.Block = newMockBlock(5) tx, err := diffIndexer.PushBlock(payload1.Block, payload1.Receipts, payload1.Block.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) tx, err = diffIndexer.PushBlock(payload2.Block, payload2.Receipts, payload2.Block.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) - num, err := retriever.RetrieveFirstBlockNumber() + num, err := retriever.RetrieveFirstBlockNumber(ctx) Expect(err).ToNot(HaveOccurred()) Expect(num).To(Equal(int64(5))) }) @@ -489,16 +486,16 @@ var _ = Describe("Retriever", func() { Describe("RetrieveLastBlockNumber", func() { It("Throws an error if there are no blocks in the database", func() { - _, err := retriever.RetrieveLastBlockNumber() + _, err := retriever.RetrieveLastBlockNumber(ctx) Expect(err).To(HaveOccurred()) }) It("Gets the number of the latest block that has data in the database", func() { tx, err := diffIndexer.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) - num, err := retriever.RetrieveLastBlockNumber() + num, err := retriever.RetrieveLastBlockNumber(ctx) Expect(err).ToNot(HaveOccurred()) Expect(num).To(Equal(int64(1))) }) @@ -509,10 +506,10 @@ var _ = Describe("Retriever", func() { tx, err := diffIndexer.PushBlock(payload.Block, payload.Receipts, payload.Block.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) - num, err := retriever.RetrieveLastBlockNumber() + num, err := retriever.RetrieveLastBlockNumber(ctx) Expect(err).ToNot(HaveOccurred()) Expect(num).To(Equal(int64(1010101))) }) @@ -524,15 +521,15 @@ var _ = Describe("Retriever", func() { payload2.Block = newMockBlock(5) tx, err := diffIndexer.PushBlock(payload1.Block, payload1.Receipts, payload1.Block.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) tx, err = diffIndexer.PushBlock(payload2.Block, payload2.Receipts, payload2.Block.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) - num, err := retriever.RetrieveLastBlockNumber() + num, err := retriever.RetrieveLastBlockNumber(ctx) Expect(err).ToNot(HaveOccurred()) Expect(num).To(Equal(int64(1010101))) }) diff --git a/pkg/eth/eth_state_test.go b/pkg/eth/eth_state_test.go index f7dccc31..3f9f0014 100644 --- a/pkg/eth/eth_state_test.go +++ b/pkg/eth/eth_state_test.go @@ -31,8 +31,8 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/statediff" - "github.com/ethereum/go-ethereum/statediff/indexer" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/node" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -64,7 +64,7 @@ var _ = Describe("eth state reading tests", func() { blocks []*types.Block receipts []types.Receipts chain *core.BlockChain - db *postgres.DB + db sql.Database api *eth.PublicEthAPI backend *eth.Backend chainConfig = params.TestChainConfig @@ -74,10 +74,11 @@ var _ = Describe("eth state reading tests", func() { It("test init", func() { // db and type initializations var err error - db, err = SetupDB() + goodInfo := node.Info{GenesisBlock: "GENESIS3", NetworkID: "3", ID: "3", ClientName: "geth3", ChainID: 3} + db, err = eth.Setup(ctx, goodInfo) Expect(err).ToNot(HaveOccurred()) - transformer, err := indexer.NewStateDiffIndexer(chainConfig, db) + transformer, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) backend, err = eth.NewEthBackend(db, ð.Config{ @@ -150,21 +151,21 @@ var _ = Describe("eth state reading tests", func() { Expect(err).ToNot(HaveOccurred()) for _, node := range diff.Nodes { - err = transformer.PushStateNode(tx, node) + err = transformer.PushStateNode(tx, node, block.Hash().String()) Expect(err).ToNot(HaveOccurred()) } - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) } // Insert some non-canonical data into the database so that we test our ability to discern canonicity - indexAndPublisher, err := indexer.NewStateDiffIndexer(chainConfig, db) + indexAndPublisher, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) tx, err := indexAndPublisher.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) // The non-canonical header has a child @@ -179,11 +180,11 @@ var _ = Describe("eth state reading tests", func() { err = indexAndPublisher.PushCodeAndCodeHash(tx, hash) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) }) defer It("test teardown", func() { - eth.TearDownDB(db) + eth.TearDownDB(ctx, db) chain.Stop() }) diff --git a/pkg/eth/filterer.go b/pkg/eth/filterer.go index 3f258e37..3fee2209 100644 --- a/pkg/eth/filterer.go +++ b/pkg/eth/filterer.go @@ -23,12 +23,11 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs/ipld" + "github.com/ethereum/go-ethereum/statediff/indexer/ipld" + "github.com/ethereum/go-ethereum/statediff/indexer/models" sdtypes "github.com/ethereum/go-ethereum/statediff/types" "github.com/ipfs/go-cid" "github.com/multiformats/go-multihash" - - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" ) // Filterer interface for substituing mocks in tests @@ -82,12 +81,12 @@ func (s *ResponseFilterer) filterHeaders(headerFilter HeaderFilter, response *IP if err != nil { return err } - response.Header = ipfs.BlockModel{ + response.Header = models.IPLDModel{ Data: headerRLP, - CID: cid.String(), + Key: cid.String(), } if headerFilter.Uncles { - response.Uncles = make([]ipfs.BlockModel, len(payload.Block.Body().Uncles)) + response.Uncles = make([]models.IPLDModel, len(payload.Block.Body().Uncles)) for i, uncle := range payload.Block.Body().Uncles { uncleRlp, err := rlp.EncodeToBytes(uncle) if err != nil { @@ -97,9 +96,9 @@ func (s *ResponseFilterer) filterHeaders(headerFilter HeaderFilter, response *IP if err != nil { return err } - response.Uncles[i] = ipfs.BlockModel{ + response.Uncles[i] = models.IPLDModel{ Data: uncleRlp, - CID: cid.String(), + Key: cid.String(), } } } @@ -119,7 +118,7 @@ func (s *ResponseFilterer) filterTransactions(trxFilter TxFilter, response *IPLD if !trxFilter.Off { trxLen := len(payload.Block.Body().Transactions) trxHashes = make([]common.Hash, 0, trxLen) - response.Transactions = make([]ipfs.BlockModel, 0, trxLen) + response.Transactions = make([]models.IPLDModel, 0, trxLen) for i, trx := range payload.Block.Body().Transactions { // TODO: check if want corresponding receipt and if we do we must include this transaction if checkTransactionAddrs(trxFilter.Src, trxFilter.Dst, payload.TxMetaData[i].Src, payload.TxMetaData[i].Dst) { @@ -132,9 +131,9 @@ func (s *ResponseFilterer) filterTransactions(trxFilter TxFilter, response *IPLD if err != nil { return nil, err } - response.Transactions = append(response.Transactions, ipfs.BlockModel{ + response.Transactions = append(response.Transactions, models.IPLDModel{ Data: data, - CID: cid.String(), + Key: cid.String(), }) trxHashes = append(trxHashes, trx.Hash()) } @@ -164,7 +163,7 @@ func checkTransactionAddrs(wantedSrc, wantedDst []string, actualSrc, actualDst s func (s *ResponseFilterer) filerReceipts(receiptFilter ReceiptFilter, response *IPLDs, payload ConvertedPayload, trxHashes []common.Hash) error { if !receiptFilter.Off { - response.Receipts = make([]ipfs.BlockModel, 0, len(payload.Receipts)) + response.Receipts = make([]models.IPLDModel, 0, len(payload.Receipts)) rctLeafCID, rctIPLDData, err := GetRctLeafNodeData(payload.Receipts) if err != nil { return err @@ -183,9 +182,9 @@ func (s *ResponseFilterer) filerReceipts(receiptFilter ReceiptFilter, response * // TODO: Verify this filter logic. if checkReceipts(receipt, receiptFilter.Topics, topics, receiptFilter.LogAddresses, contracts, trxHashes) { - response.Receipts = append(response.Receipts, ipfs.BlockModel{ + response.Receipts = append(response.Receipts, models.IPLDModel{ Data: rctIPLDData[idx], - CID: rctLeafCID[idx].String(), + Key: rctLeafCID[idx].String(), }) } } @@ -282,9 +281,9 @@ func (s *ResponseFilterer) filterStateAndStorage(stateFilter StateFilter, storag response.StateNodes = append(response.StateNodes, StateNode{ StateLeafKey: common.BytesToHash(stateNode.LeafKey), Path: stateNode.Path, - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: stateNode.NodeValue, - CID: cid.String(), + Key: cid.String(), }, Type: stateNode.NodeType, }) @@ -300,9 +299,9 @@ func (s *ResponseFilterer) filterStateAndStorage(stateFilter StateFilter, storag response.StorageNodes = append(response.StorageNodes, StorageNode{ StateLeafKey: common.BytesToHash(stateNode.LeafKey), StorageLeafKey: common.BytesToHash(storageNode.LeafKey), - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: storageNode.NodeValue, - CID: cid.String(), + Key: cid.String(), }, Type: storageNode.NodeType, Path: storageNode.Path, diff --git a/pkg/eth/filterer_test.go b/pkg/eth/filterer_test.go index 84f4de44..6894f99c 100644 --- a/pkg/eth/filterer_test.go +++ b/pkg/eth/filterer_test.go @@ -19,7 +19,7 @@ package eth_test import ( "bytes" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" + "github.com/ethereum/go-ethereum/statediff/indexer/models" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" @@ -46,7 +46,7 @@ var _ = Describe("Filterer", func() { Expect(iplds).ToNot(BeNil()) Expect(iplds.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) Expect(iplds.Header).To(Equal(test_helpers.MockIPLDs.Header)) - var expectedEmptyUncles []ipfs.BlockModel + var expectedEmptyUncles []models.IPLDModel Expect(iplds.Uncles).To(Equal(expectedEmptyUncles)) Expect(len(iplds.Transactions)).To(Equal(4)) Expect(shared.IPLDsContainBytes(iplds.Transactions, test_helpers.Tx1)).To(BeTrue()) @@ -60,15 +60,15 @@ var _ = Describe("Filterer", func() { for _, stateNode := range iplds.StateNodes { Expect(stateNode.Type).To(Equal(sdtypes.Leaf)) if bytes.Equal(stateNode.StateLeafKey.Bytes(), test_helpers.AccountLeafKey) { - Expect(stateNode.IPLD).To(Equal(ipfs.BlockModel{ + Expect(stateNode.IPLD).To(Equal(models.IPLDModel{ Data: test_helpers.State2IPLD.RawData(), - CID: test_helpers.State2IPLD.Cid().String(), + Key: test_helpers.State2IPLD.Cid().String(), })) } if bytes.Equal(stateNode.StateLeafKey.Bytes(), test_helpers.ContractLeafKey) { - Expect(stateNode.IPLD).To(Equal(ipfs.BlockModel{ + Expect(stateNode.IPLD).To(Equal(models.IPLDModel{ Data: test_helpers.State1IPLD.RawData(), - CID: test_helpers.State1IPLD.Cid().String(), + Key: test_helpers.State1IPLD.Cid().String(), })) } } @@ -80,67 +80,67 @@ var _ = Describe("Filterer", func() { Expect(err).ToNot(HaveOccurred()) Expect(iplds1).ToNot(BeNil()) Expect(iplds1.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds1.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds1.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds1.Uncles)).To(Equal(0)) Expect(len(iplds1.Transactions)).To(Equal(0)) Expect(len(iplds1.StorageNodes)).To(Equal(0)) Expect(len(iplds1.StateNodes)).To(Equal(0)) Expect(len(iplds1.Receipts)).To(Equal(1)) - Expect(iplds1.Receipts[0]).To(Equal(ipfs.BlockModel{ + Expect(iplds1.Receipts[0]).To(Equal(models.IPLDModel{ Data: test_helpers.Rct1IPLD, - CID: test_helpers.Rct1CID.String(), + Key: test_helpers.Rct1CID.String(), })) iplds2, err := filterer.Filter(rctTopicsFilter, test_helpers.MockConvertedPayload) Expect(err).ToNot(HaveOccurred()) Expect(iplds2).ToNot(BeNil()) Expect(iplds2.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds2.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds2.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds2.Uncles)).To(Equal(0)) Expect(len(iplds2.Transactions)).To(Equal(0)) Expect(len(iplds2.StorageNodes)).To(Equal(0)) Expect(len(iplds2.StateNodes)).To(Equal(0)) Expect(len(iplds2.Receipts)).To(Equal(1)) - Expect(iplds2.Receipts[0]).To(Equal(ipfs.BlockModel{ + Expect(iplds2.Receipts[0]).To(Equal(models.IPLDModel{ Data: test_helpers.Rct1IPLD, - CID: test_helpers.Rct1CID.String(), + Key: test_helpers.Rct1CID.String(), })) iplds3, err := filterer.Filter(rctTopicsAndAddressFilter, test_helpers.MockConvertedPayload) Expect(err).ToNot(HaveOccurred()) Expect(iplds3).ToNot(BeNil()) Expect(iplds3.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds3.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds3.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds3.Uncles)).To(Equal(0)) Expect(len(iplds3.Transactions)).To(Equal(0)) Expect(len(iplds3.StorageNodes)).To(Equal(0)) Expect(len(iplds3.StateNodes)).To(Equal(0)) Expect(len(iplds3.Receipts)).To(Equal(1)) - Expect(iplds3.Receipts[0]).To(Equal(ipfs.BlockModel{ + Expect(iplds3.Receipts[0]).To(Equal(models.IPLDModel{ Data: test_helpers.Rct1IPLD, - CID: test_helpers.Rct1CID.String(), + Key: test_helpers.Rct1CID.String(), })) iplds4, err := filterer.Filter(rctAddressesAndTopicFilter, test_helpers.MockConvertedPayload) Expect(err).ToNot(HaveOccurred()) Expect(iplds4).ToNot(BeNil()) Expect(iplds4.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds4.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds4.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds4.Uncles)).To(Equal(0)) Expect(len(iplds4.Transactions)).To(Equal(0)) Expect(len(iplds4.StorageNodes)).To(Equal(0)) Expect(len(iplds4.StateNodes)).To(Equal(0)) Expect(len(iplds4.Receipts)).To(Equal(1)) - Expect(iplds4.Receipts[0]).To(Equal(ipfs.BlockModel{ + Expect(iplds4.Receipts[0]).To(Equal(models.IPLDModel{ Data: test_helpers.Rct2IPLD, - CID: test_helpers.Rct2CID.String(), + Key: test_helpers.Rct2CID.String(), })) iplds5, err := filterer.Filter(rctsForAllCollectedTrxs, test_helpers.MockConvertedPayload) Expect(err).ToNot(HaveOccurred()) Expect(iplds5).ToNot(BeNil()) Expect(iplds5.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds5.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds5.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds5.Uncles)).To(Equal(0)) Expect(len(iplds5.Transactions)).To(Equal(4)) Expect(shared.IPLDsContainBytes(iplds5.Transactions, test_helpers.Tx1)).To(BeTrue()) @@ -157,39 +157,39 @@ var _ = Describe("Filterer", func() { Expect(err).ToNot(HaveOccurred()) Expect(iplds6).ToNot(BeNil()) Expect(iplds6.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds6.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds6.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds6.Uncles)).To(Equal(0)) Expect(len(iplds6.Transactions)).To(Equal(1)) Expect(shared.IPLDsContainBytes(iplds5.Transactions, test_helpers.Tx2)).To(BeTrue()) Expect(len(iplds6.StorageNodes)).To(Equal(0)) Expect(len(iplds6.StateNodes)).To(Equal(0)) Expect(len(iplds6.Receipts)).To(Equal(1)) - Expect(iplds4.Receipts[0]).To(Equal(ipfs.BlockModel{ + Expect(iplds4.Receipts[0]).To(Equal(models.IPLDModel{ Data: test_helpers.Rct2IPLD, - CID: test_helpers.Rct2CID.String(), + Key: test_helpers.Rct2CID.String(), })) iplds7, err := filterer.Filter(stateFilter, test_helpers.MockConvertedPayload) Expect(err).ToNot(HaveOccurred()) Expect(iplds7).ToNot(BeNil()) Expect(iplds7.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds7.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds7.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds7.Uncles)).To(Equal(0)) Expect(len(iplds7.Transactions)).To(Equal(0)) Expect(len(iplds7.StorageNodes)).To(Equal(0)) Expect(len(iplds7.Receipts)).To(Equal(0)) Expect(len(iplds7.StateNodes)).To(Equal(1)) Expect(iplds7.StateNodes[0].StateLeafKey.Bytes()).To(Equal(test_helpers.AccountLeafKey)) - Expect(iplds7.StateNodes[0].IPLD).To(Equal(ipfs.BlockModel{ + Expect(iplds7.StateNodes[0].IPLD).To(Equal(models.IPLDModel{ Data: test_helpers.State2IPLD.RawData(), - CID: test_helpers.State2IPLD.Cid().String(), + Key: test_helpers.State2IPLD.Cid().String(), })) iplds8, err := filterer.Filter(rctTopicsAndAddressFilterFail, test_helpers.MockConvertedPayload) Expect(err).ToNot(HaveOccurred()) Expect(iplds8).ToNot(BeNil()) Expect(iplds8.BlockNumber.Int64()).To(Equal(test_helpers.MockIPLDs.BlockNumber.Int64())) - Expect(iplds8.Header).To(Equal(ipfs.BlockModel{})) + Expect(iplds8.Header).To(Equal(models.IPLDModel{})) Expect(len(iplds8.Uncles)).To(Equal(0)) Expect(len(iplds8.Transactions)).To(Equal(0)) Expect(len(iplds8.StorageNodes)).To(Equal(0)) diff --git a/pkg/eth/ipld_fetcher.go b/pkg/eth/ipld_fetcher.go index 94047004..8890268a 100644 --- a/pkg/eth/ipld_fetcher.go +++ b/pkg/eth/ipld_fetcher.go @@ -17,39 +17,39 @@ package eth import ( + "context" "errors" "fmt" "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" - "github.com/jmoiron/sqlx" log "github.com/sirupsen/logrus" + "github.com/vulcanize/ipld-eth-server/pkg/shared" ) // Fetcher interface for substituting mocks in tests type Fetcher interface { - Fetch(cids CIDWrapper) (*IPLDs, error) + Fetch(ctx context.Context, cids CIDWrapper) (*IPLDs, error) } // IPLDFetcher satisfies the IPLDFetcher interface for ethereum // It interfaces directly with PG-IPFS type IPLDFetcher struct { - db *postgres.DB + db sql.Database } // NewIPLDFetcher creates a pointer to a new IPLDFetcher -func NewIPLDFetcher(db *postgres.DB) *IPLDFetcher { +func NewIPLDFetcher(db sql.Database) *IPLDFetcher { return &IPLDFetcher{ db: db, } } // Fetch is the exported method for fetching and returning all the IPLDS specified in the CIDWrapper -func (f *IPLDFetcher) Fetch(cids CIDWrapper) (*IPLDs, error) { +func (f *IPLDFetcher) Fetch(ctx context.Context, cids CIDWrapper) (*IPLDs, error) { log.Debug("fetching iplds") iplds := new(IPLDs) var ok bool @@ -59,42 +59,42 @@ func (f *IPLDFetcher) Fetch(cids CIDWrapper) (*IPLDs, error) { } iplds.BlockNumber = cids.BlockNumber - tx, err := f.db.Beginx() + tx, err := f.db.Begin(ctx) if err != nil { return nil, err } defer func() { if p := recover(); p != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) panic(p) } else if err != nil { - shared.Rollback(tx) + shared.Rollback(ctx, tx) } else { - err = tx.Commit() + err = tx.Commit(ctx) } }() - iplds.Header, err = f.FetchHeader(tx, cids.Header) + iplds.Header, err = f.FetchHeader(ctx, tx, cids.Header) if err != nil { return nil, fmt.Errorf("eth pg fetcher: header fetching error: %s", err.Error()) } - iplds.Uncles, err = f.FetchUncles(tx, cids.Uncles) + iplds.Uncles, err = f.FetchUncles(ctx, tx, cids.Uncles) if err != nil { return nil, fmt.Errorf("eth pg fetcher: uncle fetching error: %s", err.Error()) } - iplds.Transactions, err = f.FetchTrxs(tx, cids.Transactions) + iplds.Transactions, err = f.FetchTrxs(ctx, tx, cids.Transactions) if err != nil { return nil, fmt.Errorf("eth pg fetcher: transaction fetching error: %s", err.Error()) } - iplds.Receipts, err = f.FetchRcts(tx, cids.Receipts) + iplds.Receipts, err = f.FetchRcts(ctx, tx, cids.Receipts) if err != nil { return nil, fmt.Errorf("eth pg fetcher: receipt fetching error: %s", err.Error()) } - iplds.StateNodes, err = f.FetchState(tx, cids.StateNodes) + iplds.StateNodes, err = f.FetchState(ctx, tx, cids.StateNodes) if err != nil { return nil, fmt.Errorf("eth pg fetcher: state fetching error: %s", err.Error()) } - iplds.StorageNodes, err = f.FetchStorage(tx, cids.StorageNodes) + iplds.StorageNodes, err = f.FetchStorage(ctx, tx, cids.StorageNodes) if err != nil { return nil, fmt.Errorf("eth pg fetcher: storage fetching error: %s", err.Error()) } @@ -102,86 +102,86 @@ func (f *IPLDFetcher) Fetch(cids CIDWrapper) (*IPLDs, error) { } // FetchHeaders fetches headers -func (f *IPLDFetcher) FetchHeader(tx *sqlx.Tx, c models.HeaderModel) (ipfs.BlockModel, error) { +func (f *IPLDFetcher) FetchHeader(ctx context.Context, tx sql.Tx, c models.HeaderModel) (models.IPLDModel, error) { log.Debug("fetching header ipld") - headerBytes, err := shared.FetchIPLDByMhKey(tx, c.MhKey) + headerBytes, err := shared.FetchIPLDByMhKey(ctx, tx, c.MhKey) if err != nil { - return ipfs.BlockModel{}, err + return models.IPLDModel{}, err } - return ipfs.BlockModel{ + return models.IPLDModel{ Data: headerBytes, - CID: c.CID, + Key: c.CID, }, nil } // FetchUncles fetches uncles -func (f *IPLDFetcher) FetchUncles(tx *sqlx.Tx, cids []models.UncleModel) ([]ipfs.BlockModel, error) { +func (f *IPLDFetcher) FetchUncles(ctx context.Context, tx sql.Tx, cids []models.UncleModel) ([]models.IPLDModel, error) { log.Debug("fetching uncle iplds") - uncleIPLDs := make([]ipfs.BlockModel, len(cids)) + uncleIPLDs := make([]models.IPLDModel, len(cids)) for i, c := range cids { - uncleBytes, err := shared.FetchIPLDByMhKey(tx, c.MhKey) + uncleBytes, err := shared.FetchIPLDByMhKey(ctx, tx, c.MhKey) if err != nil { return nil, err } - uncleIPLDs[i] = ipfs.BlockModel{ + uncleIPLDs[i] = models.IPLDModel{ Data: uncleBytes, - CID: c.CID, + Key: c.CID, } } return uncleIPLDs, nil } // FetchTrxs fetches transactions -func (f *IPLDFetcher) FetchTrxs(tx *sqlx.Tx, cids []models.TxModel) ([]ipfs.BlockModel, error) { +func (f *IPLDFetcher) FetchTrxs(ctx context.Context, tx sql.Tx, cids []models.TxModel) ([]models.IPLDModel, error) { log.Debug("fetching transaction iplds") - trxIPLDs := make([]ipfs.BlockModel, len(cids)) + trxIPLDs := make([]models.IPLDModel, len(cids)) for i, c := range cids { - txBytes, err := shared.FetchIPLDByMhKey(tx, c.MhKey) + txBytes, err := shared.FetchIPLDByMhKey(ctx, tx, c.MhKey) if err != nil { return nil, err } - trxIPLDs[i] = ipfs.BlockModel{ + trxIPLDs[i] = models.IPLDModel{ Data: txBytes, - CID: c.CID, + Key: c.CID, } } return trxIPLDs, nil } // FetchRcts fetches receipts -func (f *IPLDFetcher) FetchRcts(tx *sqlx.Tx, cids []models.ReceiptModel) ([]ipfs.BlockModel, error) { +func (f *IPLDFetcher) FetchRcts(ctx context.Context, tx sql.Tx, cids []models.ReceiptModel) ([]models.IPLDModel, error) { log.Debug("fetching receipt iplds") - rctIPLDs := make([]ipfs.BlockModel, len(cids)) + rctIPLDs := make([]models.IPLDModel, len(cids)) for i, c := range cids { - rctBytes, err := shared.FetchIPLDByMhKey(tx, c.LeafMhKey) + rctBytes, err := shared.FetchIPLDByMhKey(ctx, tx, c.LeafMhKey) if err != nil { return nil, err } //nodeVal, err := DecodeLeafNode(rctBytes) - rctIPLDs[i] = ipfs.BlockModel{ + rctIPLDs[i] = models.IPLDModel{ Data: rctBytes, - CID: c.LeafCID, + Key: c.LeafCID, } } return rctIPLDs, nil } // FetchState fetches state nodes -func (f *IPLDFetcher) FetchState(tx *sqlx.Tx, cids []models.StateNodeModel) ([]StateNode, error) { +func (f *IPLDFetcher) FetchState(ctx context.Context, tx sql.Tx, cids []models.StateNodeModel) ([]StateNode, error) { log.Debug("fetching state iplds") stateNodes := make([]StateNode, 0, len(cids)) for _, stateNode := range cids { if stateNode.CID == "" { continue } - stateBytes, err := shared.FetchIPLDByMhKey(tx, stateNode.MhKey) + stateBytes, err := shared.FetchIPLDByMhKey(ctx, tx, stateNode.MhKey) if err != nil { return nil, err } stateNodes = append(stateNodes, StateNode{ - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: stateBytes, - CID: stateNode.CID, + Key: stateNode.CID, }, StateLeafKey: common.HexToHash(stateNode.StateKey), Type: ResolveToNodeType(stateNode.NodeType), @@ -192,21 +192,21 @@ func (f *IPLDFetcher) FetchState(tx *sqlx.Tx, cids []models.StateNodeModel) ([]S } // FetchStorage fetches storage nodes -func (f *IPLDFetcher) FetchStorage(tx *sqlx.Tx, cids []models.StorageNodeWithStateKeyModel) ([]StorageNode, error) { +func (f *IPLDFetcher) FetchStorage(ctx context.Context, tx sql.Tx, cids []models.StorageNodeWithStateKeyModel) ([]StorageNode, error) { log.Debug("fetching storage iplds") storageNodes := make([]StorageNode, 0, len(cids)) for _, storageNode := range cids { if storageNode.CID == "" || storageNode.StateKey == "" { continue } - storageBytes, err := shared.FetchIPLDByMhKey(tx, storageNode.MhKey) + storageBytes, err := shared.FetchIPLDByMhKey(ctx, tx, storageNode.MhKey) if err != nil { return nil, err } storageNodes = append(storageNodes, StorageNode{ - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: storageBytes, - CID: storageNode.CID, + Key: storageNode.CID, }, StateLeafKey: common.HexToHash(storageNode.StateKey), StorageLeafKey: common.HexToHash(storageNode.StorageKey), diff --git a/pkg/eth/ipld_fetcher_test.go b/pkg/eth/ipld_fetcher_test.go index c6699a09..fc211af4 100644 --- a/pkg/eth/ipld_fetcher_test.go +++ b/pkg/eth/ipld_fetcher_test.go @@ -18,8 +18,9 @@ package eth_test import ( "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/statediff/indexer" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" + "github.com/ethereum/go-ethereum/statediff/indexer/node" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -29,38 +30,39 @@ import ( var _ = Describe("IPLDFetcher", func() { var ( - db *postgres.DB - pubAndIndexer *indexer.StateDiffIndexer + db sql.Database + pubAndIndexer interfaces.StateDiffIndexer fetcher *eth.IPLDFetcher ) Describe("Fetch", func() { BeforeEach(func() { var ( err error - tx *indexer.BlockTx + tx interfaces.Batch ) - db, err = SetupDB() + goodInfo := node.Info{GenesisBlock: "GENESIS4", NetworkID: "4", ID: "4", ClientName: "geth4", ChainID: 4} + db, err = eth.Setup(ctx, goodInfo) Expect(err).ToNot(HaveOccurred()) - pubAndIndexer, err = indexer.NewStateDiffIndexer(params.TestChainConfig, db) + pubAndIndexer, err = sql.NewStateDiffIndexer(ctx, params.TestChainConfig, db) Expect(err).ToNot(HaveOccurred()) tx, err = pubAndIndexer.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) for _, node := range test_helpers.MockStateNodes { - err = pubAndIndexer.PushStateNode(tx, node) + err = pubAndIndexer.PushStateNode(tx, node, test_helpers.MockBlock.Hash().String()) Expect(err).ToNot(HaveOccurred()) } - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) fetcher = eth.NewIPLDFetcher(db) }) AfterEach(func() { - eth.TearDownDB(db) + eth.TearDownDB(ctx, db) }) It("Fetches and returns IPLDs for the CIDs provided in the CIDWrapper", func() { - iplds, err := fetcher.Fetch(*test_helpers.MockCIDWrapper) + iplds, err := fetcher.Fetch(ctx, *test_helpers.MockCIDWrapper) Expect(err).ToNot(HaveOccurred()) Expect(iplds).ToNot(BeNil()) Expect(iplds.TotalDifficulty).To(Equal(test_helpers.MockConvertedPayload.TotalDifficulty)) diff --git a/pkg/eth/ipld_retriever.go b/pkg/eth/ipld_retriever.go index 08e11884..0e07ff5b 100644 --- a/pkg/eth/ipld_retriever.go +++ b/pkg/eth/ipld_retriever.go @@ -17,15 +17,16 @@ package eth import ( + "context" "fmt" - "github.com/ethereum/go-ethereum/statediff/trie" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/trie_helpers" sdtypes "github.com/ethereum/go-ethereum/statediff/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" "github.com/lib/pq" ) @@ -129,8 +130,8 @@ const ( LIMIT 1` RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockNumberPgStr = `SELECT storage_cids.cid, data, storage_cids.node_type, was_state_leaf_removed($1, $3) AS state_leaf_removed FROM eth.storage_cids - INNER JOIN eth.state_cids ON (storage_cids.state_id = state_cids.id) - INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.id) + INNER JOIN eth.state_cids ON (storage_cids.header_id = state_cids.header_id AND storage_cids.state_path = state_cids.state_path) + INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (storage_cids.mh_key = blocks.key) WHERE state_leaf_key = $1 AND storage_leaf_key = $2 @@ -139,8 +140,8 @@ const ( LIMIT 1` RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockHashPgStr = `SELECT storage_cids.cid, data, storage_cids.node_type, was_state_leaf_removed($1, $3) AS state_leaf_removed FROM eth.storage_cids - INNER JOIN eth.state_cids ON (storage_cids.state_id = state_cids.id) - INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.id) + INNER JOIN eth.state_cids ON (storage_cids.header_id = state_cids.header_id AND storage_cids.state_path = state_cids.state_path) + INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (storage_cids.mh_key = blocks.key) WHERE state_leaf_key = $1 AND storage_leaf_key = $2 @@ -167,23 +168,23 @@ type ipldResult struct { } type IPLDRetriever struct { - db *postgres.DB + db sql.Database } -func NewIPLDRetriever(db *postgres.DB) *IPLDRetriever { +func NewIPLDRetriever(db sql.Database) *IPLDRetriever { return &IPLDRetriever{ db: db, } } // RetrieveHeadersByHashes returns the cids and rlp bytes for the headers corresponding to the provided block hashes -func (r *IPLDRetriever) RetrieveHeadersByHashes(hashes []common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveHeadersByHashes(ctx context.Context, hashes []common.Hash) ([]string, [][]byte, error) { headerResults := make([]ipldResult, 0) hashStrs := make([]string, len(hashes)) for i, hash := range hashes { hashStrs[i] = hash.Hex() } - if err := r.db.Select(&headerResults, RetrieveHeadersByHashesPgStr, pq.Array(hashStrs)); err != nil { + if err := r.db.Select(ctx, &headerResults, RetrieveHeadersByHashesPgStr, pq.Array(hashStrs)); err != nil { return nil, nil, err } cids := make([]string, len(headerResults)) @@ -197,9 +198,9 @@ func (r *IPLDRetriever) RetrieveHeadersByHashes(hashes []common.Hash) ([]string, // RetrieveHeadersByBlockNumber returns the cids and rlp bytes for the headers corresponding to the provided block number // This can return more than one result since there can be more than one header (non-canonical headers) -func (r *IPLDRetriever) RetrieveHeadersByBlockNumber(number uint64) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveHeadersByBlockNumber(ctx context.Context, number uint64) ([]string, [][]byte, error) { headerResults := make([]ipldResult, 0) - if err := r.db.Select(&headerResults, RetrieveHeadersByBlockNumberPgStr, number); err != nil { + if err := r.db.Select(ctx, &headerResults, RetrieveHeadersByBlockNumberPgStr, number); err != nil { return nil, nil, err } cids := make([]string, len(headerResults)) @@ -212,19 +213,19 @@ func (r *IPLDRetriever) RetrieveHeadersByBlockNumber(number uint64) ([]string, [ } // RetrieveHeaderByHash returns the cid and rlp bytes for the header corresponding to the provided block hash -func (r *IPLDRetriever) RetrieveHeaderByHash(hash common.Hash) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveHeaderByHash(ctx context.Context, hash common.Hash) (string, []byte, error) { headerResult := new(ipldResult) - return headerResult.CID, headerResult.Data, r.db.Get(headerResult, RetrieveHeaderByHashPgStr, hash.Hex()) + return headerResult.CID, headerResult.Data, r.db.Get(ctx, headerResult, RetrieveHeaderByHashPgStr, hash.Hex()) } // RetrieveUnclesByHashes returns the cids and rlp bytes for the uncles corresponding to the provided uncle hashes -func (r *IPLDRetriever) RetrieveUnclesByHashes(hashes []common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveUnclesByHashes(ctx context.Context, hashes []common.Hash) ([]string, [][]byte, error) { uncleResults := make([]ipldResult, 0) hashStrs := make([]string, len(hashes)) for i, hash := range hashes { hashStrs[i] = hash.Hex() } - if err := r.db.Select(&uncleResults, RetrieveUnclesByHashesPgStr, pq.Array(hashStrs)); err != nil { + if err := r.db.Select(ctx, &uncleResults, RetrieveUnclesByHashesPgStr, pq.Array(hashStrs)); err != nil { return nil, nil, err } cids := make([]string, len(uncleResults)) @@ -237,9 +238,9 @@ func (r *IPLDRetriever) RetrieveUnclesByHashes(hashes []common.Hash) ([]string, } // RetrieveUnclesByBlockHash returns the cids and rlp bytes for the uncles corresponding to the provided block hash (of non-omner root block) -func (r *IPLDRetriever) RetrieveUnclesByBlockHash(hash common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveUnclesByBlockHash(ctx context.Context, hash common.Hash) ([]string, [][]byte, error) { uncleResults := make([]ipldResult, 0) - if err := r.db.Select(&uncleResults, RetrieveUnclesByBlockHashPgStr, hash.Hex()); err != nil { + if err := r.db.Select(ctx, &uncleResults, RetrieveUnclesByBlockHashPgStr, hash.Hex()); err != nil { return nil, nil, err } cids := make([]string, len(uncleResults)) @@ -252,9 +253,9 @@ func (r *IPLDRetriever) RetrieveUnclesByBlockHash(hash common.Hash) ([]string, [ } // RetrieveUnclesByBlockNumber returns the cids and rlp bytes for the uncles corresponding to the provided block number (of non-omner root block) -func (r *IPLDRetriever) RetrieveUnclesByBlockNumber(number uint64) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveUnclesByBlockNumber(ctx context.Context, number uint64) ([]string, [][]byte, error) { uncleResults := make([]ipldResult, 0) - if err := r.db.Select(&uncleResults, RetrieveUnclesByBlockNumberPgStr, number); err != nil { + if err := r.db.Select(ctx, &uncleResults, RetrieveUnclesByBlockNumberPgStr, number); err != nil { return nil, nil, err } cids := make([]string, len(uncleResults)) @@ -267,19 +268,19 @@ func (r *IPLDRetriever) RetrieveUnclesByBlockNumber(number uint64) ([]string, [] } // RetrieveUncleByHash returns the cid and rlp bytes for the uncle corresponding to the provided uncle hash -func (r *IPLDRetriever) RetrieveUncleByHash(hash common.Hash) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveUncleByHash(ctx context.Context, hash common.Hash) (string, []byte, error) { uncleResult := new(ipldResult) - return uncleResult.CID, uncleResult.Data, r.db.Get(uncleResult, RetrieveUncleByHashPgStr, hash.Hex()) + return uncleResult.CID, uncleResult.Data, r.db.Get(ctx, uncleResult, RetrieveUncleByHashPgStr, hash.Hex()) } // RetrieveTransactionsByHashes returns the cids and rlp bytes for the transactions corresponding to the provided tx hashes -func (r *IPLDRetriever) RetrieveTransactionsByHashes(hashes []common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveTransactionsByHashes(ctx context.Context, hashes []common.Hash) ([]string, [][]byte, error) { txResults := make([]ipldResult, 0) hashStrs := make([]string, len(hashes)) for i, hash := range hashes { hashStrs[i] = hash.Hex() } - if err := r.db.Select(&txResults, RetrieveTransactionsByHashesPgStr, pq.Array(hashStrs)); err != nil { + if err := r.db.Select(ctx, &txResults, RetrieveTransactionsByHashesPgStr, pq.Array(hashStrs)); err != nil { return nil, nil, err } cids := make([]string, len(txResults)) @@ -292,9 +293,9 @@ func (r *IPLDRetriever) RetrieveTransactionsByHashes(hashes []common.Hash) ([]st } // RetrieveTransactionsByBlockHash returns the cids and rlp bytes for the transactions corresponding to the provided block hash -func (r *IPLDRetriever) RetrieveTransactionsByBlockHash(hash common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveTransactionsByBlockHash(ctx context.Context, hash common.Hash) ([]string, [][]byte, error) { txResults := make([]ipldResult, 0) - if err := r.db.Select(&txResults, RetrieveTransactionsByBlockHashPgStr, hash.Hex()); err != nil { + if err := r.db.Select(ctx, &txResults, RetrieveTransactionsByBlockHashPgStr, hash.Hex()); err != nil { return nil, nil, err } cids := make([]string, len(txResults)) @@ -307,9 +308,9 @@ func (r *IPLDRetriever) RetrieveTransactionsByBlockHash(hash common.Hash) ([]str } // RetrieveTransactionsByBlockNumber returns the cids and rlp bytes for the transactions corresponding to the provided block number -func (r *IPLDRetriever) RetrieveTransactionsByBlockNumber(number uint64) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveTransactionsByBlockNumber(ctx context.Context, number uint64) ([]string, [][]byte, error) { txResults := make([]ipldResult, 0) - if err := r.db.Select(&txResults, RetrieveTransactionsByBlockNumberPgStr, number); err != nil { + if err := r.db.Select(ctx, &txResults, RetrieveTransactionsByBlockNumberPgStr, number); err != nil { return nil, nil, err } cids := make([]string, len(txResults)) @@ -322,9 +323,9 @@ func (r *IPLDRetriever) RetrieveTransactionsByBlockNumber(number uint64) ([]stri } // RetrieveTransactionByTxHash returns the cid and rlp bytes for the transaction corresponding to the provided tx hash -func (r *IPLDRetriever) RetrieveTransactionByTxHash(hash common.Hash) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveTransactionByTxHash(ctx context.Context, hash common.Hash) (string, []byte, error) { txResult := new(ipldResult) - return txResult.CID, txResult.Data, r.db.Get(txResult, RetrieveTransactionByHashPgStr, hash.Hex()) + return txResult.CID, txResult.Data, r.db.Get(ctx, txResult, RetrieveTransactionByHashPgStr, hash.Hex()) } // DecodeLeafNode decodes the leaf node data @@ -333,7 +334,7 @@ func DecodeLeafNode(node []byte) ([]byte, error) { if err := rlp.DecodeBytes(node, &nodeElements); err != nil { return nil, err } - ty, err := trie.CheckKeyType(nodeElements) + ty, err := trie_helpers.CheckKeyType(nodeElements) if err != nil { return nil, err } @@ -345,13 +346,13 @@ func DecodeLeafNode(node []byte) ([]byte, error) { } // RetrieveReceiptsByTxHashes returns the cids and rlp bytes for the receipts corresponding to the provided tx hashes -func (r *IPLDRetriever) RetrieveReceiptsByTxHashes(hashes []common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveReceiptsByTxHashes(ctx context.Context, hashes []common.Hash) ([]string, [][]byte, error) { rctResults := make([]rctIpldResult, 0) hashStrs := make([]string, len(hashes)) for i, hash := range hashes { hashStrs[i] = hash.Hex() } - if err := r.db.Select(&rctResults, RetrieveReceiptsByTxHashesPgStr, pq.Array(hashStrs)); err != nil { + if err := r.db.Select(ctx, &rctResults, RetrieveReceiptsByTxHashesPgStr, pq.Array(hashStrs)); err != nil { return nil, nil, err } cids := make([]string, len(rctResults)) @@ -369,9 +370,9 @@ func (r *IPLDRetriever) RetrieveReceiptsByTxHashes(hashes []common.Hash) ([]stri // RetrieveReceiptsByBlockHash returns the cids and rlp bytes for the receipts corresponding to the provided block hash. // cid returned corresponds to the leaf node data which contains the receipt. -func (r *IPLDRetriever) RetrieveReceiptsByBlockHash(hash common.Hash) ([]string, [][]byte, []common.Hash, error) { +func (r *IPLDRetriever) RetrieveReceiptsByBlockHash(ctx context.Context, hash common.Hash) ([]string, [][]byte, []common.Hash, error) { rctResults := make([]rctIpldResult, 0) - if err := r.db.Select(&rctResults, RetrieveReceiptsByBlockHashPgStr, hash.Hex()); err != nil { + if err := r.db.Select(ctx, &rctResults, RetrieveReceiptsByBlockHashPgStr, hash.Hex()); err != nil { return nil, nil, nil, err } cids := make([]string, len(rctResults)) @@ -393,9 +394,9 @@ func (r *IPLDRetriever) RetrieveReceiptsByBlockHash(hash common.Hash) ([]string, // RetrieveReceiptsByBlockNumber returns the cids and rlp bytes for the receipts corresponding to the provided block hash. // cid returned corresponds to the leaf node data which contains the receipt. -func (r *IPLDRetriever) RetrieveReceiptsByBlockNumber(number uint64) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveReceiptsByBlockNumber(ctx context.Context, number uint64) ([]string, [][]byte, error) { rctResults := make([]rctIpldResult, 0) - if err := r.db.Select(&rctResults, RetrieveReceiptsByBlockNumberPgStr, number); err != nil { + if err := r.db.Select(ctx, &rctResults, RetrieveReceiptsByBlockNumberPgStr, number); err != nil { return nil, nil, err } cids := make([]string, len(rctResults)) @@ -413,9 +414,9 @@ func (r *IPLDRetriever) RetrieveReceiptsByBlockNumber(number uint64) ([]string, // RetrieveReceiptByHash returns the cid and rlp bytes for the receipt corresponding to the provided tx hash. // cid returned corresponds to the leaf node data which contains the receipt. -func (r *IPLDRetriever) RetrieveReceiptByHash(hash common.Hash) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveReceiptByHash(ctx context.Context, hash common.Hash) (string, []byte, error) { rctResult := new(rctIpldResult) - if err := r.db.Select(&rctResult, RetrieveReceiptByTxHashPgStr, hash.Hex()); err != nil { + if err := r.db.Select(ctx, &rctResult, RetrieveReceiptByTxHashPgStr, hash.Hex()); err != nil { return "", nil, err } @@ -435,10 +436,10 @@ type nodeInfo struct { // RetrieveAccountByAddressAndBlockHash returns the cid and rlp bytes for the account corresponding to the provided address and block hash // TODO: ensure this handles deleted accounts appropriately -func (r *IPLDRetriever) RetrieveAccountByAddressAndBlockHash(address common.Address, hash common.Hash) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveAccountByAddressAndBlockHash(ctx context.Context, address common.Address, hash common.Hash) (string, []byte, error) { accountResult := new(nodeInfo) leafKey := crypto.Keccak256Hash(address.Bytes()) - if err := r.db.Get(accountResult, RetrieveAccountByLeafKeyAndBlockHashPgStr, leafKey.Hex(), hash.Hex()); err != nil { + if err := r.db.Get(ctx, accountResult, RetrieveAccountByLeafKeyAndBlockHashPgStr, leafKey.Hex(), hash.Hex()); err != nil { return "", nil, err } @@ -458,10 +459,10 @@ func (r *IPLDRetriever) RetrieveAccountByAddressAndBlockHash(address common.Addr // RetrieveAccountByAddressAndBlockNumber returns the cid and rlp bytes for the account corresponding to the provided address and block number // This can return a non-canonical account -func (r *IPLDRetriever) RetrieveAccountByAddressAndBlockNumber(address common.Address, number uint64) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveAccountByAddressAndBlockNumber(ctx context.Context, address common.Address, number uint64) (string, []byte, error) { accountResult := new(nodeInfo) leafKey := crypto.Keccak256Hash(address.Bytes()) - if err := r.db.Get(accountResult, RetrieveAccountByLeafKeyAndBlockNumberPgStr, leafKey.Hex(), number); err != nil { + if err := r.db.Get(ctx, accountResult, RetrieveAccountByLeafKeyAndBlockNumberPgStr, leafKey.Hex(), number); err != nil { return "", nil, err } @@ -480,11 +481,11 @@ func (r *IPLDRetriever) RetrieveAccountByAddressAndBlockNumber(address common.Ad } // RetrieveStorageAtByAddressAndStorageSlotAndBlockHash returns the cid and rlp bytes for the storage value corresponding to the provided address, storage slot, and block hash -func (r *IPLDRetriever) RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(address common.Address, key, hash common.Hash) (string, []byte, []byte, error) { +func (r *IPLDRetriever) RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(ctx context.Context, address common.Address, key, hash common.Hash) (string, []byte, []byte, error) { storageResult := new(nodeInfo) stateLeafKey := crypto.Keccak256Hash(address.Bytes()) storageHash := crypto.Keccak256Hash(key.Bytes()) - if err := r.db.Get(storageResult, RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockHashPgStr, stateLeafKey.Hex(), storageHash.Hex(), hash.Hex()); err != nil { + if err := r.db.Get(ctx, storageResult, RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockHashPgStr, stateLeafKey.Hex(), storageHash.Hex(), hash.Hex()); err != nil { return "", nil, nil, err } if storageResult.StateLeafRemoved || storageResult.NodeType == removedNode { @@ -503,10 +504,10 @@ func (r *IPLDRetriever) RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(add // RetrieveStorageAtByAddressAndStorageKeyAndBlockNumber returns the cid and rlp bytes for the storage value corresponding to the provided address, storage key, and block number // This can retrun a non-canonical value -func (r *IPLDRetriever) RetrieveStorageAtByAddressAndStorageKeyAndBlockNumber(address common.Address, storageLeafKey common.Hash, number uint64) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveStorageAtByAddressAndStorageKeyAndBlockNumber(ctx context.Context, address common.Address, storageLeafKey common.Hash, number uint64) (string, []byte, error) { storageResult := new(nodeInfo) stateLeafKey := crypto.Keccak256Hash(address.Bytes()) - if err := r.db.Get(storageResult, RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockNumberPgStr, stateLeafKey.Hex(), storageLeafKey.Hex(), number); err != nil { + if err := r.db.Get(ctx, storageResult, RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockNumberPgStr, stateLeafKey.Hex(), storageLeafKey.Hex(), number); err != nil { return "", nil, err } diff --git a/pkg/eth/test_helpers.go b/pkg/eth/test_helpers.go index 8c4557db..162f1716 100644 --- a/pkg/eth/test_helpers.go +++ b/pkg/eth/test_helpers.go @@ -17,32 +17,43 @@ package eth import ( + "context" + "os" + + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/node" . "github.com/onsi/gomega" ) +func Setup(ctx context.Context, info node.Info) (sql.Database, error) { + driver, err := postgres.NewPGXDriver(ctx, getConfig(), info) + Expect(err).NotTo(HaveOccurred()) + return postgres.NewPostgresDB(driver), nil +} + // TearDownDB is used to tear down the watcher dbs after tests -func TearDownDB(db *postgres.DB) { - tx, err := db.Beginx() +func TearDownDB(ctx context.Context, db sql.Database) { + tx, err := db.Begin(ctx) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.header_cids`) + _, err = tx.Exec(ctx, `DELETE FROM eth.header_cids`) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.transaction_cids`) + _, err = tx.Exec(ctx, `DELETE FROM eth.transaction_cids`) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.receipt_cids`) + _, err = tx.Exec(ctx, `DELETE FROM eth.receipt_cids`) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.state_cids`) + _, err = tx.Exec(ctx, `DELETE FROM eth.state_cids`) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.storage_cids`) + _, err = tx.Exec(ctx, `DELETE FROM eth.storage_cids`) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM blocks`) + _, err = tx.Exec(ctx, `DELETE FROM blocks`) Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.log_cids`) + _, err = tx.Exec(ctx, `DELETE FROM eth.log_cids`) Expect(err).NotTo(HaveOccurred()) - err = tx.Commit() + err = tx.Commit(ctx) Expect(err).NotTo(HaveOccurred()) } @@ -65,3 +76,14 @@ func ReceiptModelsContainsCID(rcts []models.ReceiptModel, cid string) bool { } return false } + +func getConfig() postgres.Config { + return postgres.Config{ + Hostname: os.Getenv("DATABASE_HOSTNAME"), + Port: 8077, + DatabaseName: os.Getenv("DATABASE_NAME"), + Username: os.Getenv("DATABASE_USER"), + Password: os.Getenv("DATABASE_PASSWORD"), + Driver: postgres.PGX, + } +} diff --git a/pkg/eth/test_helpers/test_data.go b/pkg/eth/test_helpers/test_data.go index fff0806b..a32a5543 100644 --- a/pkg/eth/test_helpers/test_data.go +++ b/pkg/eth/test_helpers/test_data.go @@ -28,13 +28,11 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/statediff/indexer" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs/ipld" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/ipld" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" "github.com/ethereum/go-ethereum/statediff/indexer/shared" - "github.com/ethereum/go-ethereum/statediff/testhelpers" + testhelpers "github.com/ethereum/go-ethereum/statediff/test_helpers" sdtypes "github.com/ethereum/go-ethereum/statediff/types" "github.com/ethereum/go-ethereum/trie" blocks "github.com/ipfs/go-block-format" @@ -439,7 +437,7 @@ var ( StateNodes: MockStateNodes, } - Reward = indexer.CalcEthBlockReward(MockBlock.Header(), MockBlock.Uncles(), MockBlock.Transactions(), MockReceipts) + Reward = shared.CalcEthBlockReward(MockBlock.Header(), MockBlock.Uncles(), MockBlock.Transactions(), MockReceipts) MockCIDWrapper = ð.CIDWrapper{ BlockNumber: new(big.Int).Set(BlockNumber), @@ -486,62 +484,62 @@ var ( MockIPLDs = eth.IPLDs{ BlockNumber: new(big.Int).Set(BlockNumber), - Header: ipfs.BlockModel{ + Header: models.IPLDModel{ Data: HeaderIPLD.RawData(), - CID: HeaderIPLD.Cid().String(), + Key: HeaderIPLD.Cid().String(), }, - Transactions: []ipfs.BlockModel{ + Transactions: []models.IPLDModel{ { Data: Trx1IPLD.RawData(), - CID: Trx1IPLD.Cid().String(), + Key: Trx1IPLD.Cid().String(), }, { Data: Trx2IPLD.RawData(), - CID: Trx2IPLD.Cid().String(), + Key: Trx2IPLD.Cid().String(), }, { Data: Trx3IPLD.RawData(), - CID: Trx3IPLD.Cid().String(), + Key: Trx3IPLD.Cid().String(), }, { Data: Trx4IPLD.RawData(), - CID: Trx4IPLD.Cid().String(), + Key: Trx4IPLD.Cid().String(), }, }, - Receipts: []ipfs.BlockModel{ + Receipts: []models.IPLDModel{ { Data: Rct1IPLD, - CID: Rct1CID.String(), + Key: Rct1CID.String(), }, { Data: Rct2IPLD, - CID: Rct2CID.String(), + Key: Rct2CID.String(), }, { Data: Rct3IPLD, - CID: Rct3CID.String(), + Key: Rct3CID.String(), }, { Data: Rct4IPLD, - CID: Rct4CID.String(), + Key: Rct4CID.String(), }, }, StateNodes: []eth.StateNode{ { StateLeafKey: common.BytesToHash(ContractLeafKey), Type: sdtypes.Leaf, - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: State1IPLD.RawData(), - CID: State1IPLD.Cid().String(), + Key: State1IPLD.Cid().String(), }, Path: []byte{'\x06'}, }, { StateLeafKey: common.BytesToHash(AccountLeafKey), Type: sdtypes.Leaf, - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: State2IPLD.RawData(), - CID: State2IPLD.Cid().String(), + Key: State2IPLD.Cid().String(), }, Path: []byte{'\x0c'}, }, @@ -551,9 +549,9 @@ var ( StateLeafKey: common.BytesToHash(ContractLeafKey), StorageLeafKey: common.BytesToHash(StorageLeafKey), Type: sdtypes.Leaf, - IPLD: ipfs.BlockModel{ + IPLD: models.IPLDModel{ Data: StorageIPLD.RawData(), - CID: StorageIPLD.Cid().String(), + Key: StorageIPLD.Cid().String(), }, Path: []byte{}, }, diff --git a/pkg/eth/types.go b/pkg/eth/types.go index 9e371ff2..9b6b6ca7 100644 --- a/pkg/eth/types.go +++ b/pkg/eth/types.go @@ -24,7 +24,6 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" "github.com/ethereum/go-ethereum/statediff/indexer/models" sdtypes "github.com/ethereum/go-ethereum/statediff/types" "github.com/sirupsen/logrus" @@ -197,10 +196,10 @@ func (arg *CallArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (types.Mes type IPLDs struct { BlockNumber *big.Int TotalDifficulty *big.Int - Header ipfs.BlockModel - Uncles []ipfs.BlockModel - Transactions []ipfs.BlockModel - Receipts []ipfs.BlockModel + Header models.IPLDModel + Uncles []models.IPLDModel + Transactions []models.IPLDModel + Receipts []models.IPLDModel StateNodes []StateNode StorageNodes []StorageNode } @@ -209,7 +208,7 @@ type StateNode struct { Type sdtypes.NodeType StateLeafKey common.Hash Path []byte - IPLD ipfs.BlockModel + IPLD models.IPLDModel } type StorageNode struct { @@ -217,7 +216,7 @@ type StorageNode struct { StateLeafKey common.Hash StorageLeafKey common.Hash Path []byte - IPLD ipfs.BlockModel + IPLD models.IPLDModel } // CIDWrapper is used to direct fetching of IPLDs from IPFS @@ -249,7 +248,7 @@ type ConvertedPayload struct { // LogResult represent a log. type LogResult struct { LeafCID string `db:"leaf_cid"` - ReceiptID int64 `db:"receipt_id"` + ReceiptID int64 `db:"rct_id"` Address string `db:"address"` Index int64 `db:"index"` Data []byte `db:"log_data"` diff --git a/pkg/graphql/graphql.go b/pkg/graphql/graphql.go index 0a746a78..cecf17d0 100644 --- a/pkg/graphql/graphql.go +++ b/pkg/graphql/graphql.go @@ -612,7 +612,7 @@ func (b *Block) TotalDifficulty(ctx context.Context) (hexutil.Big, error) { } h = header.Hash() } - td, err := b.backend.GetTd(h) + td, err := b.backend.GetTd(ctx, h) if err != nil { return hexutil.Big{}, err } @@ -1005,7 +1005,7 @@ func (r *Resolver) GetStorageAt(ctx context.Context, args struct { Contract common.Address Slot common.Hash }) (*StorageResult, error) { - cid, ipldBlock, rlpValue, err := r.backend.IPLDRetriever.RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(args.Contract, args.Slot, args.BlockHash) + cid, ipldBlock, rlpValue, err := r.backend.IPLDRetriever.RetrieveStorageAtByAddressAndStorageSlotAndBlockHash(ctx, args.Contract, args.Slot, args.BlockHash) if err != nil { if err == sql.ErrNoRows { @@ -1042,17 +1042,17 @@ func (r *Resolver) GetLogs(ctx context.Context, args struct { } // Begin tx - tx, err := r.backend.DB.Beginx() + tx, err := r.backend.DB.Begin(ctx) if err != nil { return nil, err } - filteredLogs, err := r.backend.Retriever.RetrieveFilteredGQLLogs(tx, filter, &args.BlockHash) + filteredLogs, err := r.backend.Retriever.RetrieveFilteredGQLLogs(ctx, tx, filter, &args.BlockHash) if err != nil { return nil, err } - if err = tx.Commit(); err != nil { + if err = tx.Commit(ctx); err != nil { return nil, err } diff --git a/pkg/graphql/graphql_test.go b/pkg/graphql/graphql_test.go index ceb87c9d..c370ff46 100644 --- a/pkg/graphql/graphql_test.go +++ b/pkg/graphql/graphql_test.go @@ -20,8 +20,6 @@ import ( "context" "fmt" "math/big" - "os" - "strconv" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -32,9 +30,8 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/statediff" - "github.com/ethereum/go-ethereum/statediff/indexer" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/node" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -45,19 +42,6 @@ import ( ethServerShared "github.com/vulcanize/ipld-eth-server/pkg/shared" ) -// SetupDB is use to setup a db for watcher tests -func SetupDB() (*postgres.DB, error) { - port, _ := strconv.Atoi(os.Getenv("DATABASE_PORT")) - uri := postgres.DbConnectionString(postgres.ConnectionParams{ - User: os.Getenv("DATABASE_USER"), - Password: os.Getenv("DATABASE_PASSWORD"), - Hostname: os.Getenv("DATABASE_HOSTNAME"), - Name: os.Getenv("DATABASE_NAME"), - Port: port, - }) - return postgres.NewDB(uri, postgres.ConnectionConfig{}, node.Info{}) -} - var _ = Describe("GraphQL", func() { const ( gqlEndPoint = "127.0.0.1:8083" @@ -68,7 +52,7 @@ var _ = Describe("GraphQL", func() { blocks []*types.Block receipts []types.Receipts chain *core.BlockChain - db *postgres.DB + db sql.Database blockHashes []common.Hash backend *eth.Backend graphQLServer *graphql.Service @@ -82,10 +66,11 @@ var _ = Describe("GraphQL", func() { It("test init", func() { var err error - db, err = SetupDB() + goodInfo := node.Info{GenesisBlock: "GENESIS5", NetworkID: "5", ID: "5", ClientName: "geth5", ChainID: 5} + db, err = eth.Setup(ctx, goodInfo) Expect(err).ToNot(HaveOccurred()) - transformer, err := indexer.NewStateDiffIndexer(chainConfig, db) + transformer, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) backend, err = eth.NewEthBackend(db, ð.Config{ ChainConfig: chainConfig, @@ -132,7 +117,7 @@ var _ = Describe("GraphQL", func() { rcts = receipts[i-1] } - var diff statediff.StateObject + var diff sdtypes.StateObject diff, err = builder.BuildStateDiffObject(args, params) Expect(err).ToNot(HaveOccurred()) @@ -140,16 +125,16 @@ var _ = Describe("GraphQL", func() { Expect(err).ToNot(HaveOccurred()) for _, node := range diff.Nodes { - err = transformer.PushStateNode(tx, node) + err = transformer.PushStateNode(tx, node, block.Hash().String()) Expect(err).ToNot(HaveOccurred()) } - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) } // Insert some non-canonical data into the database so that we test our ability to discern canonicity - indexAndPublisher, err := indexer.NewStateDiffIndexer(chainConfig, db) + indexAndPublisher, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) blockHash = test_helpers.MockBlock.Hash() @@ -158,7 +143,7 @@ var _ = Describe("GraphQL", func() { tx, err := indexAndPublisher.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) // The non-canonical header has a child @@ -173,7 +158,7 @@ var _ = Describe("GraphQL", func() { err = indexAndPublisher.PushCodeAndCodeHash(tx, ccHash) Expect(err).ToNot(HaveOccurred()) - err = tx.Close(err) + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) graphQLServer, err = graphql.New(backend, gqlEndPoint, nil, []string{"*"}, rpc.HTTPTimeouts{}) @@ -186,7 +171,7 @@ var _ = Describe("GraphQL", func() { defer It("test teardown", func() { err := graphQLServer.Stop() Expect(err).ToNot(HaveOccurred()) - eth.TearDownDB(db) + eth.TearDownDB(ctx, db) chain.Stop() }) diff --git a/pkg/prom/db_stats_collector.go b/pkg/prom/db_stats_collector.go index b0a4f502..88afb6d5 100644 --- a/pkg/prom/db_stats_collector.go +++ b/pkg/prom/db_stats_collector.go @@ -17,8 +17,7 @@ package prom import ( - "database/sql" - + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/prometheus/client_golang/prometheus" ) @@ -26,7 +25,7 @@ const subsystem = "connections" // DBStatsGetter is an interface that gets sql.DBStats. type DBStatsGetter interface { - Stats() sql.DBStats + Stats() sql.Stats } // DBStatsCollector implements the prometheus.Collector interface. @@ -119,41 +118,41 @@ func (c DBStatsCollector) Collect(ch chan<- prometheus.Metric) { ch <- prometheus.MustNewConstMetric( c.maxOpenDesc, prometheus.GaugeValue, - float64(stats.MaxOpenConnections), + float64(stats.MaxOpen()), ) ch <- prometheus.MustNewConstMetric( c.openDesc, prometheus.GaugeValue, - float64(stats.OpenConnections), + float64(stats.Open()), ) ch <- prometheus.MustNewConstMetric( c.inUseDesc, prometheus.GaugeValue, - float64(stats.InUse), + float64(stats.InUse()), ) ch <- prometheus.MustNewConstMetric( c.idleDesc, prometheus.GaugeValue, - float64(stats.Idle), + float64(stats.Idle()), ) ch <- prometheus.MustNewConstMetric( c.waitedForDesc, prometheus.CounterValue, - float64(stats.WaitCount), + float64(stats.WaitCount()), ) ch <- prometheus.MustNewConstMetric( c.blockedSecondsDesc, prometheus.CounterValue, - stats.WaitDuration.Seconds(), + stats.WaitDuration().Seconds(), ) ch <- prometheus.MustNewConstMetric( c.closedMaxIdleDesc, prometheus.CounterValue, - float64(stats.MaxIdleClosed), + float64(stats.MaxIdleClosed()), ) ch <- prometheus.MustNewConstMetric( c.closedMaxLifetimeDesc, prometheus.CounterValue, - float64(stats.MaxLifetimeClosed), + float64(stats.MaxLifetimeClosed()), ) } diff --git a/pkg/prom/prom.go b/pkg/prom/prom.go index f2bd5792..5845eb6a 100644 --- a/pkg/prom/prom.go +++ b/pkg/prom/prom.go @@ -17,7 +17,7 @@ package prom import ( - "github.com/jmoiron/sqlx" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) @@ -72,7 +72,7 @@ func Init() { } // RegisterDBCollector create metric colletor for given connection -func RegisterDBCollector(name string, db *sqlx.DB) { +func RegisterDBCollector(name string, db *postgres.PGXDriver) { if metrics { prometheus.Register(NewDBStatsCollector(name, db)) } diff --git a/pkg/serve/api.go b/pkg/serve/api.go index e00877c4..af88e844 100644 --- a/pkg/serve/api.go +++ b/pkg/serve/api.go @@ -20,7 +20,6 @@ import ( "context" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/statediff/indexer/shared" log "github.com/sirupsen/logrus" "github.com/vulcanize/ipld-eth-server/pkg/eth" @@ -59,7 +58,7 @@ func (api *PublicServerAPI) Stream(ctx context.Context, params eth.SubscriptionS // subscribe to events from the SyncPublishScreenAndServe service payloadChannel := make(chan SubscriptionPayload, PayloadChanBufferSize) quitChan := make(chan bool, 1) - go api.w.Subscribe(rpcSub.ID, payloadChannel, quitChan, params) + go api.w.Subscribe(ctx, rpcSub.ID, payloadChannel, quitChan, params) // loop and await payloads and relay them to the subscriber using notifier for { @@ -83,7 +82,7 @@ func (api *PublicServerAPI) Stream(ctx context.Context, params eth.SubscriptionS return rpcSub, nil } -// Chain returns the chain type that this watcher instance supports -func (api *PublicServerAPI) Chain() shared.ChainType { - return shared.Ethereum -} +//// Chain returns the chain type that this watcher instance supports +//func (api *PublicServerAPI) Chain() shared.ChainType { +// return shared.Ethereum +//} diff --git a/pkg/serve/config.go b/pkg/serve/config.go index 6fb31039..dad0c215 100644 --- a/pkg/serve/config.go +++ b/pkg/serve/config.go @@ -17,16 +17,18 @@ package serve import ( + "context" "errors" "fmt" "math/big" "os" "path/filepath" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" "github.com/spf13/viper" "github.com/vulcanize/ipld-eth-server/pkg/eth" @@ -56,8 +58,7 @@ const ( // Config struct type Config struct { DB *postgres.DB - DBConfig postgres.ConnectionConfig - DBParams postgres.ConnectionParams + DBConfig postgres.Config WSEnabled bool WSEndpoint string @@ -190,13 +191,13 @@ func NewConfig() (*Config, error) { c.IpldGraphqlEnabled = ipldGraphqlEnabled overrideDBConnConfig(&c.DBConfig) - serveDB, err := postgres.NewDB(postgres.DbConnectionString(c.DBParams), c.DBConfig, nodeInfo) + driver, err := postgres.NewPGXDriver(context.Background(), c.DBConfig, nodeInfo) if err != nil { return nil, err } - prom.RegisterDBCollector(c.DBParams.Name, serveDB.DB) - c.DB = serveDB + prom.RegisterDBCollector(c.DBConfig.DatabaseName, driver) + c.DB = postgres.NewPostgresDB(driver) defaultSenderStr := viper.GetString("ethereum.defaultSender") if defaultSenderStr != "" { @@ -223,13 +224,13 @@ func NewConfig() (*Config, error) { return c, err } -func overrideDBConnConfig(con *postgres.ConnectionConfig) { +func overrideDBConnConfig(con *postgres.Config) { viper.BindEnv("database.server.maxIdle", serverMaxIdleConnections) viper.BindEnv("database.server.maxOpen", serverMaxOpenConnections) viper.BindEnv("database.server.maxLifetime", serverMaxConnLifetime) con.MaxIdle = viper.GetInt("database.server.maxIdle") - con.MaxOpen = viper.GetInt("database.server.maxOpen") - con.MaxLifetime = viper.GetInt("database.server.maxLifetime") + con.MaxConns = viper.GetInt("database.server.maxOpen") + con.MaxConnLifetime = time.Duration(viper.GetInt("database.server.maxLifetime")) } func (c *Config) dbInit() { @@ -242,14 +243,14 @@ func (c *Config) dbInit() { viper.BindEnv("database.maxOpen", databaseMaxOpenConnections) viper.BindEnv("database.maxLifetime", databaseMaxOpenConnLifetime) - c.DBParams.Name = viper.GetString("database.name") - c.DBParams.Hostname = viper.GetString("database.hostname") - c.DBParams.Port = viper.GetInt("database.port") - c.DBParams.User = viper.GetString("database.user") - c.DBParams.Password = viper.GetString("database.password") + c.DBConfig.DatabaseName = viper.GetString("database.name") + c.DBConfig.Hostname = viper.GetString("database.hostname") + c.DBConfig.Port = viper.GetInt("database.port") + c.DBConfig.Username = viper.GetString("database.user") + c.DBConfig.Password = viper.GetString("database.password") c.DBConfig.MaxIdle = viper.GetInt("database.maxIdle") - c.DBConfig.MaxOpen = viper.GetInt("database.maxOpen") - c.DBConfig.MaxLifetime = viper.GetInt("database.maxLifetime") + c.DBConfig.MaxConns = viper.GetInt("database.maxOpen") + c.DBConfig.MaxConnLifetime = time.Duration(viper.GetInt("database.maxLifetime")) } func (c *Config) loadGroupCacheConfig() { diff --git a/pkg/serve/service.go b/pkg/serve/service.go index 82ab4bf1..f5d1eb73 100644 --- a/pkg/serve/service.go +++ b/pkg/serve/service.go @@ -17,6 +17,7 @@ package serve import ( + "context" "fmt" "strconv" "sync" @@ -28,7 +29,7 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" log "github.com/sirupsen/logrus" "github.com/vulcanize/ipld-eth-server/pkg/eth" @@ -50,7 +51,7 @@ type Server interface { // Pub-Sub handling event loop Serve(wg *sync.WaitGroup, screenAndServePayload <-chan eth.ConvertedPayload) // Method to subscribe to the service - Subscribe(id rpc.ID, sub chan<- SubscriptionPayload, quitChan chan<- bool, params eth.SubscriptionSettings) + Subscribe(ctx context.Context, id rpc.ID, sub chan<- SubscriptionPayload, quitChan chan<- bool, params eth.SubscriptionSettings) // Method to unsubscribe from the service Unsubscribe(id rpc.ID) // Backend exposes the server's backend @@ -115,7 +116,7 @@ func (sap *Service) Protocols() []p2p.Protocol { // APIs returns the RPC descriptors the watcher service offers func (sap *Service) APIs() []rpc.API { - networkID, _ := strconv.ParseUint(sap.db.Node.NetworkID, 10, 64) + networkID, _ := strconv.ParseUint("sap.db.NodeID().NetworkID", 10, 64) apis := []rpc.API{ { Namespace: APIName, @@ -205,7 +206,7 @@ func (sap *Service) filterAndServe(payload eth.ConvertedPayload) { // Subscribe is used by the API to remotely subscribe to the service loop // The params must be rlp serializable and satisfy the SubscriptionSettings() interface -func (sap *Service) Subscribe(id rpc.ID, sub chan<- SubscriptionPayload, quitChan chan<- bool, params eth.SubscriptionSettings) { +func (sap *Service) Subscribe(ctx context.Context, id rpc.ID, sub chan<- SubscriptionPayload, quitChan chan<- bool, params eth.SubscriptionSettings) { sap.serveWg.Add(1) defer sap.serveWg.Done() log.Infof("new eth ipld subscription %s", id) @@ -235,7 +236,7 @@ func (sap *Service) Subscribe(id rpc.ID, sub chan<- SubscriptionPayload, quitCha // If the subscription requests a backfill, use the Postgres index to lookup and retrieve historical data // Otherwise we only filter new data as it is streamed in from the state diffing geth node if params.BackFill || params.BackFillOnly { - if err := sap.sendHistoricalData(subscription, id, params); err != nil { + if err := sap.sendHistoricalData(ctx, subscription, id, params); err != nil { sendNonBlockingErr(subscription, fmt.Errorf("eth ipld server subscription backfill error: %v", err)) sendNonBlockingQuit(subscription) return @@ -244,20 +245,20 @@ func (sap *Service) Subscribe(id rpc.ID, sub chan<- SubscriptionPayload, quitCha } // sendHistoricalData sends historical data to the requesting subscription -func (sap *Service) sendHistoricalData(sub Subscription, id rpc.ID, params eth.SubscriptionSettings) error { +func (sap *Service) sendHistoricalData(ctx context.Context, sub Subscription, id rpc.ID, params eth.SubscriptionSettings) error { log.Infof("sending eth ipld historical data to subscription %s", id) // Retrieve cached CIDs relevant to this subscriber var endingBlock int64 var startingBlock int64 var err error - startingBlock, err = sap.Retriever.RetrieveFirstBlockNumber() + startingBlock, err = sap.Retriever.RetrieveFirstBlockNumber(ctx) if err != nil { return err } if startingBlock < params.Start.Int64() { startingBlock = params.Start.Int64() } - endingBlock, err = sap.Retriever.RetrieveLastBlockNumber() + endingBlock, err = sap.Retriever.RetrieveLastBlockNumber(ctx) if err != nil { return err } @@ -276,7 +277,7 @@ func (sap *Service) sendHistoricalData(sub Subscription, id rpc.ID, params eth.S return default: } - cidWrappers, empty, err := sap.Retriever.Retrieve(params, i) + cidWrappers, empty, err := sap.Retriever.Retrieve(ctx, params, i) if err != nil { sendNonBlockingErr(sub, fmt.Errorf("eth ipld server cid retrieval error at block %d\r%s", i, err.Error())) continue @@ -285,7 +286,7 @@ func (sap *Service) sendHistoricalData(sub Subscription, id rpc.ID, params eth.S continue } for _, cids := range cidWrappers { - response, err := sap.IPLDFetcher.Fetch(cids) + response, err := sap.IPLDFetcher.Fetch(ctx, cids) if err != nil { sendNonBlockingErr(sub, fmt.Errorf("eth ipld server ipld fetching error at block %d\r%s", i, err.Error())) continue diff --git a/pkg/shared/functions.go b/pkg/shared/functions.go index aa9c4bd9..2441d6ab 100644 --- a/pkg/shared/functions.go +++ b/pkg/shared/functions.go @@ -17,11 +17,14 @@ package shared import ( + "context" + "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs/ipld" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" + "github.com/ethereum/go-ethereum/statediff/indexer/ipld" "github.com/ipfs/go-cid" - "github.com/ipfs/go-ipfs-blockstore" - "github.com/ipfs/go-ipfs-ds-help" + blockstore "github.com/ipfs/go-ipfs-blockstore" + dshelp "github.com/ipfs/go-ipfs-ds-help" node "github.com/ipfs/go-ipld-format" "github.com/jmoiron/sqlx" "github.com/sirupsen/logrus" @@ -44,18 +47,18 @@ func HandleZeroAddr(to common.Address) string { } // Rollback sql transaction and log any error -func Rollback(tx *sqlx.Tx) { - if err := tx.Rollback(); err != nil { +func Rollback(ctx context.Context, tx sql.Tx) { + if err := tx.Rollback(ctx); err != nil { logrus.Error(err) } } // PublishIPLD is used to insert an ipld into Postgres blockstore with the provided tx -func PublishIPLD(tx *sqlx.Tx, i node.Node) error { +func PublishIPLD(ctx context.Context, tx sql.Tx, i node.Node) error { dbKey := dshelp.MultihashToDsKey(i.Cid().Hash()) prefixedKey := blockstore.BlockPrefix.String() + dbKey.String() raw := i.RawData() - _, err := tx.Exec(`INSERT INTO public.blocks (key, data) VALUES ($1, $2) ON CONFLICT (key) DO NOTHING`, prefixedKey, raw) + _, err := tx.Exec(ctx, `INSERT INTO public.blocks (key, data) VALUES ($1, $2) ON CONFLICT (key) DO NOTHING`, prefixedKey, raw) return err } @@ -71,10 +74,10 @@ func FetchIPLD(tx *sqlx.Tx, cid string) ([]byte, error) { } // FetchIPLDByMhKey is used to retrieve an ipld from Postgres blockstore with the provided tx and mhkey string -func FetchIPLDByMhKey(tx *sqlx.Tx, mhKey string) ([]byte, error) { +func FetchIPLDByMhKey(ctx context.Context, tx sql.Tx, mhKey string) ([]byte, error) { pgStr := `SELECT data FROM public.blocks WHERE key = $1` var block []byte - return block, tx.Get(&block, pgStr, mhKey) + return block, tx.QueryRow(ctx, pgStr, mhKey).Scan(&block) } // MultihashKeyFromCID converts a cid into a blockstore-prefixed multihash db key string diff --git a/pkg/shared/test_helpers.go b/pkg/shared/test_helpers.go index 35b7adfa..eed5a7f0 100644 --- a/pkg/shared/test_helpers.go +++ b/pkg/shared/test_helpers.go @@ -19,11 +19,11 @@ package shared import ( "bytes" - "github.com/ethereum/go-ethereum/statediff/indexer/ipfs" + "github.com/ethereum/go-ethereum/statediff/indexer/models" ) // IPLDsContainBytes used to check if a list of strings contains a particular string -func IPLDsContainBytes(iplds []ipfs.BlockModel, b []byte) bool { +func IPLDsContainBytes(iplds []models.IPLDModel, b []byte) bool { for _, ipld := range iplds { if bytes.Equal(ipld.Data, b) { return true diff --git a/test_config/test_config.go b/test_config/test_config.go index 9f48aded..cc2d0eb8 100644 --- a/test_config/test_config.go +++ b/test_config/test_config.go @@ -19,12 +19,12 @@ package test_config import ( "errors" - "github.com/ethereum/go-ethereum/statediff/indexer/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) -var DBConfig postgres.ConnectionParams +var DBConfig postgres.Config func init() { setTestConfig() @@ -52,9 +52,9 @@ func setTestConfig() { port := vip.GetInt("database.port") name := vip.GetString("database.name") - DBConfig = postgres.ConnectionParams{ - Hostname: hn, - Name: name, - Port: port, + DBConfig = postgres.Config{ + Hostname: hn, + DatabaseName: name, + Port: port, } } -- 2.45.2 From 15184202f5c8023d81b3e27f029044baaa8ed9d3 Mon Sep 17 00:00:00 2001 From: Arijit Das Date: Wed, 24 Nov 2021 12:33:23 +0530 Subject: [PATCH 2/4] Update queries and fix failing test. --- docker-compose.yml | 2 +- go.mod | 1 + pkg/eth/api_test.go | 23 ++++++---- pkg/eth/backend.go | 40 +++++++++-------- pkg/eth/cid_retriever.go | 85 +++++++++++++++++------------------ pkg/eth/cid_retriever_test.go | 14 ++++-- pkg/eth/eth_state_test.go | 14 +++++- pkg/eth/ipld_fetcher_test.go | 11 ++++- pkg/eth/ipld_retriever.go | 32 ++++++------- pkg/eth/test_helpers.go | 2 +- pkg/eth/types.go | 2 +- pkg/graphql/graphql_test.go | 10 ++++- pkg/prom/prom.go | 4 +- pkg/serve/config.go | 4 +- 14 files changed, 140 insertions(+), 104 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index cbd0070e..63cb3120 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,7 +18,7 @@ services: ipld-eth-db: restart: always - image: vulcanize/ipld-eth-db:v0.2.0 + image: vulcanize/ipld-eth-db:latest environment: POSTGRES_USER: "vdbm" POSTGRES_DB: "vulcanize_testing" diff --git a/go.mod b/go.mod index 91bab53e..0ffd62fe 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/ipfs/go-ipfs-blockstore v1.0.1 github.com/ipfs/go-ipfs-ds-help v1.0.0 github.com/ipfs/go-ipld-format v0.2.0 + github.com/jackc/pgx/v4 v4.13.0 github.com/jmoiron/sqlx v1.2.0 github.com/lib/pq v1.10.2 github.com/machinebox/graphql v0.2.2 diff --git a/pkg/eth/api_test.go b/pkg/eth/api_test.go index 0dd703f9..f434d83f 100644 --- a/pkg/eth/api_test.go +++ b/pkg/eth/api_test.go @@ -196,9 +196,14 @@ var _ = Describe("API", func() { tx interfaces.Batch ) - goodInfo := node.Info{GenesisBlock: "GENESIS1", NetworkID: "1", ID: "1", ClientName: "geth5", ChainID: 1} - // DefaultConfig are default parameters for connecting to a Postgres sql - db, err = eth.Setup(ctx, goodInfo) + testInfo := node.Info{ + GenesisBlock: test_helpers.Genesis.Hash().String(), + NetworkID: "1", + ID: "1", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + db, err = eth.Setup(ctx, testInfo) Expect(err).ToNot(HaveOccurred()) indexAndPublisher, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) @@ -220,11 +225,6 @@ var _ = Describe("API", func() { tx, err = indexAndPublisher.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) - for _, node := range test_helpers.MockStateNodes { - err = indexAndPublisher.PushStateNode(tx, node, test_helpers.MockBlock.Hash().String()) - Expect(err).ToNot(HaveOccurred()) - } - ccHash := sdtypes.CodeAndCodeHash{ Hash: test_helpers.ContractCodeHash, Code: test_helpers.ContractCode, @@ -233,6 +233,11 @@ var _ = Describe("API", func() { err = indexAndPublisher.PushCodeAndCodeHash(tx, ccHash) Expect(err).ToNot(HaveOccurred()) + for _, node := range test_helpers.MockStateNodes { + err = indexAndPublisher.PushStateNode(tx, node, test_helpers.MockBlock.Hash().String()) + Expect(err).ToNot(HaveOccurred()) + } + err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) @@ -272,7 +277,7 @@ var _ = Describe("API", func() { It("Throws an error if a header cannot be found", func() { header, err := api.GetHeaderByNumber(ctx, wrongNumber) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("no rows in result set")) + Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) Expect(header).To(BeNil()) }) }) diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index ec7ef407..0f390aaa 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -18,6 +18,7 @@ package eth import ( "context" + dbsql "database/sql" "errors" "fmt" "math/big" @@ -60,21 +61,20 @@ var ( // errMissingSignature is returned if a block's extra-data section doesn't seem // to contain a 65 byte secp256k1 signature. errMissingSignature = errors.New("extra-data 65 byte signature suffix missing") - errNoRows = errors.New("sql: no rows in result set") ) const ( RetrieveCanonicalBlockHashByNumber = `SELECT block_hash FROM eth.header_cids INNER JOIN public.blocks ON (header_cids.mh_key = blocks.key) - WHERE id = (SELECT canonical_header_id($1))` + WHERE block_hash = (SELECT canonical_header_id($1))` RetrieveCanonicalHeaderByNumber = `SELECT cid, data FROM eth.header_cids INNER JOIN public.blocks ON (header_cids.mh_key = blocks.key) - WHERE id = (SELECT canonical_header_id($1))` + WHERE block_hash = (SELECT canonical_header_id($1))` RetrieveTD = `SELECT td FROM eth.header_cids WHERE header_cids.block_hash = $1` RetrieveRPCTransaction = `SELECT blocks.data, block_hash, block_number, index FROM public.blocks, eth.transaction_cids, eth.header_cids WHERE blocks.key = transaction_cids.mh_key - AND transaction_cids.header_id = header_cids.id + AND transaction_cids.header_id = header_cids.block_hash AND transaction_cids.tx_hash = $1` RetrieveCodeHashByLeafKeyAndBlockHash = `SELECT code_hash FROM eth.state_accounts, eth.state_cids, eth.header_cids WHERE state_accounts.header_id = state_cids.header_id AND state_accounts.state_path = state_cids.state_path @@ -83,7 +83,7 @@ const ( AND block_number <= (SELECT block_number FROM eth.header_cids WHERE block_hash = $2) - AND header_cids.id = (SELECT canonical_header_id(block_number)) + AND header_cids.block_hash = (SELECT canonical_header_id(block_number)) ORDER BY block_number DESC LIMIT 1` RetrieveCodeByMhKey = `SELECT data FROM public.blocks WHERE key = $1` @@ -293,7 +293,7 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber // Get the canonical hash canonicalHash, err := b.GetCanonicalHash(ctx, uint64(number)) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -302,7 +302,7 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber // TODO: optimize this by retrieving iplds directly rather than the cids first (this is remanent from when we fetched iplds through ipfs blockservice interface) headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(ctx, canonicalHash) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -328,7 +328,7 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber var headerIPLD models.IPLDModel headerIPLD, err = b.Fetcher.FetchHeader(ctx, tx, headerCID) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -398,7 +398,7 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo // Retrieve all the CIDs for the block headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(ctx, hash) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -424,7 +424,7 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo var headerIPLD models.IPLDModel headerIPLD, err = b.Fetcher.FetchHeader(ctx, tx, headerCID) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -438,7 +438,7 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo var uncleIPLDs []models.IPLDModel uncleIPLDs, err = b.Fetcher.FetchUncles(ctx, tx, uncleCIDs) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -456,7 +456,7 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo var txIPLDs []models.IPLDModel txIPLDs, err = b.Fetcher.FetchTrxs(ctx, tx, txCIDs) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -474,7 +474,7 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo var rctIPLDs []models.IPLDModel rctIPLDs, err = b.Fetcher.FetchRcts(ctx, tx, rctCIDs) if err != nil { - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, nil } return nil, err @@ -659,7 +659,7 @@ func (b *Backend) GetAccountByNumber(ctx context.Context, address common.Address return nil, errPendingBlockNumber } hash, err := b.GetCanonicalHash(ctx, uint64(number)) - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, errHeaderNotFound } else if err != nil { return nil, err @@ -671,7 +671,7 @@ func (b *Backend) GetAccountByNumber(ctx context.Context, address common.Address // GetAccountByHash returns the account object for the provided address at the block with the provided hash func (b *Backend) GetAccountByHash(ctx context.Context, address common.Address, hash common.Hash) (*types.StateAccount, error) { _, err := b.HeaderByHash(context.Background(), hash) - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, errHeaderHashNotFound } else if err != nil { return nil, err @@ -745,17 +745,19 @@ func (b *Backend) GetCodeByHash(ctx context.Context, address common.Address, has err = tx.Commit(ctx) } }() - err = tx.QueryRow(ctx, RetrieveCodeHashByLeafKeyAndBlockHash, leafKey.Hex(), hash.Hex()).Scan(&codeHash) + err = tx.Get(ctx, &codeHash, RetrieveCodeHashByLeafKeyAndBlockHash, leafKey.Hex(), hash.Hex()) if err != nil { return nil, err } + var mhKey string mhKey, err = ethServerShared.MultihashKeyFromKeccak256(common.BytesToHash(codeHash)) if err != nil { return nil, err } + code := make([]byte, 0) - err = tx.QueryRow(ctx, RetrieveCodeByMhKey, mhKey).Scan(&code) + err = tx.Get(ctx, &code, RetrieveCodeByMhKey, mhKey) return code, err } @@ -790,7 +792,7 @@ func (b *Backend) GetStorageByNumber(ctx context.Context, address common.Address return nil, errPendingBlockNumber } hash, err := b.GetCanonicalHash(ctx, uint64(number)) - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, errHeaderNotFound } else if err != nil { return nil, err @@ -802,7 +804,7 @@ func (b *Backend) GetStorageByNumber(ctx context.Context, address common.Address // GetStorageByHash returns the storage value for the provided contract address an storage key at the block corresponding to the provided hash func (b *Backend) GetStorageByHash(ctx context.Context, address common.Address, key, hash common.Hash) (hexutil.Bytes, error) { _, err := b.HeaderByHash(context.Background(), hash) - if err == errNoRows { + if err == dbsql.ErrNoRows { return nil, errHeaderHashNotFound } else if err != nil { return nil, err diff --git a/pkg/eth/cid_retriever.go b/pkg/eth/cid_retriever.go index f724079a..4072567e 100644 --- a/pkg/eth/cid_retriever.go +++ b/pkg/eth/cid_retriever.go @@ -171,7 +171,8 @@ func (ecr *CIDRetriever) RetrieveHeaderCIDs(ctx context.Context, tx sql.Tx, bloc headers := make([]models.HeaderModel, 0) pgStr := `SELECT * FROM eth.header_cids WHERE block_number = $1` - return headers, tx.QueryRow(ctx, pgStr, blockNumber).Scan(&headers) + + return headers, tx.Select(ctx, &headers, pgStr, blockNumber) } // RetrieveUncleCIDsByHeaderID retrieves and returns all of the uncle cids for the provided header @@ -181,7 +182,7 @@ func (ecr *CIDRetriever) RetrieveUncleCIDsByHeaderID(ctx context.Context, tx sql pgStr := `SELECT * FROM eth.uncle_cids WHERE header_id = $1` - return headers, tx.QueryRow(ctx, pgStr, headerID).Scan(headers) + return headers, tx.Select(ctx, &headers, pgStr, headerID) } // RetrieveTxCIDs retrieves and returns all of the trx cids at the provided blockheight that conform to the provided filter parameters @@ -191,11 +192,11 @@ func (ecr *CIDRetriever) RetrieveTxCIDs(ctx context.Context, tx sql.Tx, txFilter args := make([]interface{}, 0, 3) results := make([]models.TxModel, 0) id := 1 - pgStr := fmt.Sprintf(`SELECT transaction_cids.id, transaction_cids.header_id, + pgStr := fmt.Sprintf(`SELECT transaction_cids.tx_hash, transaction_cids.header_id, transaction_cids.tx_hash, transaction_cids.cid, transaction_cids.mh_key, transaction_cids.dst, transaction_cids.src, transaction_cids.index, transaction_cids.tx_data - FROM eth.transaction_cids INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.id) - WHERE header_cids.id = $%d`, id) + FROM eth.transaction_cids INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.block_hash) + WHERE header_cids.block_hash = $%d`, id) args = append(args, headerID) id++ if len(txFilter.Dst) > 0 { @@ -208,7 +209,7 @@ func (ecr *CIDRetriever) RetrieveTxCIDs(ctx context.Context, tx sql.Tx, txFilter args = append(args, pq.Array(txFilter.Src)) } pgStr += ` ORDER BY transaction_cids.index` - return results, tx.QueryRow(ctx, pgStr, args...).Scan(results) + return results, tx.Select(ctx, &results, pgStr, args...) } func topicFilterCondition(id *int, topics [][]string, args []interface{}, pgStr string, first bool) (string, []interface{}) { @@ -245,8 +246,8 @@ func logFilterCondition(id *int, pgStr string, args []interface{}, rctFilter Rec } func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilter ReceiptFilter, txHashes []string) (string, []interface{}) { - rctCond := " AND (receipt_cids.id = ANY ( " - logQuery := "SELECT receipt_id FROM eth.log_cids WHERE" + rctCond := " AND (receipt_cids.tx_id = ANY ( " + logQuery := "SELECT rct_id FROM eth.log_cids WHERE" if len(rctFilter.LogAddresses) > 0 { // Filter on log contract addresses if there are any pgStr += fmt.Sprintf(`%s %s eth.log_cids.address = ANY ($%d)`, rctCond, logQuery, *id) @@ -262,7 +263,7 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte // Filter on txHashes if there are any, and we are matching txs if rctFilter.MatchTxs && len(txHashes) > 0 { - pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d::STRING[])`, *id) + pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d)`, *id) args = append(args, pq.Array(txHashes)) } pgStr += ")" @@ -274,14 +275,14 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte pgStr += ")" // Filter on txHashes if there are any, and we are matching txs if rctFilter.MatchTxs && len(txHashes) > 0 { - pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d::STRING[])`, *id) + pgStr += fmt.Sprintf(` OR receipt_cids.tx_id = ANY($%d)`, *id) args = append(args, pq.Array(txHashes)) } pgStr += ")" } else if rctFilter.MatchTxs && len(txHashes) > 0 { // If there are no contract addresses or topics to filter on, // Filter on txHashes if there are any, and we are matching txs - pgStr += fmt.Sprintf(` AND receipt_cids.tx_id = ANY($%d::STRING[])`, *id) + pgStr += fmt.Sprintf(` AND receipt_cids.tx_id = ANY($%d)`, *id) args = append(args, pq.Array(txHashes)) } } @@ -294,12 +295,12 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte func (ecr *CIDRetriever) RetrieveRctCIDsByHeaderID(ctx context.Context, tx sql.Tx, rctFilter ReceiptFilter, headerID string, trxHashes []string) ([]models.ReceiptModel, error) { log.Debug("retrieving receipt cids for header id ", headerID) args := make([]interface{}, 0, 4) - pgStr := `SELECT receipt_cids.id, receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, + pgStr := `SELECT receipt_cids.tx_id, receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.contract, receipt_cids.contract_hash FROM eth.receipt_cids, eth.transaction_cids, eth.header_cids - WHERE receipt_cids.tx_id = transaction_cids.id - AND transaction_cids.header_id = header_cids.id - AND header_cids.id = $1` + WHERE receipt_cids.tx_id = transaction_cids.tx_hash + AND transaction_cids.header_id = header_cids.block_hash + AND header_cids.block_hash = $1` id := 2 args = append(args, headerID) @@ -307,7 +308,7 @@ func (ecr *CIDRetriever) RetrieveRctCIDsByHeaderID(ctx context.Context, tx sql.T pgStr += ` ORDER BY transaction_cids.index` receiptCids := make([]models.ReceiptModel, 0) - return receiptCids, tx.QueryRow(ctx, pgStr, args...).Scan(receiptCids) + return receiptCids, tx.Select(ctx, &receiptCids, pgStr, args...) } // RetrieveFilteredGQLLogs retrieves and returns all the log cIDs provided blockHash that conform to the provided @@ -320,9 +321,9 @@ func (ecr *CIDRetriever) RetrieveFilteredGQLLogs(ctx context.Context, tx sql.Tx, eth.log_cids.address, eth.log_cids.topic0, eth.log_cids.topic1, eth.log_cids.topic2, eth.log_cids.topic3, eth.log_cids.log_data, eth.transaction_cids.tx_hash, data, eth.receipt_cids.leaf_cid as cid, eth.receipt_cids.post_status FROM eth.log_cids, eth.receipt_cids, eth.transaction_cids, eth.header_cids, public.blocks - WHERE eth.log_cids.receipt_id = receipt_cids.id - AND receipt_cids.tx_id = transaction_cids.id - AND transaction_cids.header_id = header_cids.id + WHERE eth.log_cids.rct_id = receipt_cids.tx_id + AND receipt_cids.tx_id = transaction_cids.tx_hash + AND transaction_cids.header_id = header_cids.block_hash AND log_cids.leaf_mh_key = blocks.key AND header_cids.block_hash = $1` args = append(args, blockHash.String()) @@ -332,7 +333,7 @@ func (ecr *CIDRetriever) RetrieveFilteredGQLLogs(ctx context.Context, tx sql.Tx, pgStr += ` ORDER BY log_cids.index` logCIDs := make([]LogResult, 0) - return logCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&logCIDs) + return logCIDs, tx.Select(ctx, &logCIDs, pgStr, args...) } // RetrieveFilteredLog retrieves and returns all the log cIDs provided blockHeight or blockHash that conform to the provided @@ -345,9 +346,9 @@ func (ecr *CIDRetriever) RetrieveFilteredLog(ctx context.Context, tx sql.Tx, rct eth.log_cids.log_data, eth.transaction_cids.tx_hash, eth.transaction_cids.index as txn_index, header_cids.block_hash, header_cids.block_number FROM eth.log_cids, eth.receipt_cids, eth.transaction_cids, eth.header_cids - WHERE eth.log_cids.receipt_id = receipt_cids.id - AND receipt_cids.tx_id = transaction_cids.id - AND transaction_cids.header_id = header_cids.id` + WHERE eth.log_cids.rct_id = receipt_cids.tx_id + AND receipt_cids.tx_id = transaction_cids.tx_hash + AND transaction_cids.header_id = header_cids.block_hash` id := 1 if blockNumber > 0 { pgStr += fmt.Sprintf(` AND header_cids.block_number = $%d`, id) @@ -364,7 +365,7 @@ func (ecr *CIDRetriever) RetrieveFilteredLog(ctx context.Context, tx sql.Tx, rct pgStr += ` ORDER BY log_cids.index` logCIDs := make([]LogResult, 0) - return logCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&logCIDs) + return logCIDs, tx.Select(ctx, &logCIDs, pgStr, args...) } // RetrieveRctCIDs retrieves and returns all of the rct cids at the provided blockheight or block hash that conform to the provided @@ -372,10 +373,10 @@ func (ecr *CIDRetriever) RetrieveFilteredLog(ctx context.Context, tx sql.Tx, rct func (ecr *CIDRetriever) RetrieveRctCIDs(tx *sqlx.Tx, rctFilter ReceiptFilter, blockNumber int64, blockHash *common.Hash, txHashes []string) ([]models.ReceiptModel, error) { log.Debug("retrieving receipt cids for block ", blockNumber) args := make([]interface{}, 0, 5) - pgStr := `SELECT receipt_cids.id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.tx_id + pgStr := `SELECT receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.tx_id FROM eth.receipt_cids, eth.transaction_cids, eth.header_cids - WHERE receipt_cids.tx_id = transaction_cids.id - AND transaction_cids.header_id = header_cids.id` + WHERE receipt_cids.tx_id = transaction_cids.tx_hash + AND transaction_cids.header_id = header_cids.block_hash` id := 1 if blockNumber > 0 { pgStr += fmt.Sprintf(` AND header_cids.block_number = $%d`, id) @@ -408,10 +409,10 @@ func hasTopics(topics [][]string) bool { func (ecr *CIDRetriever) RetrieveStateCIDs(ctx context.Context, tx sql.Tx, stateFilter StateFilter, headerID string) ([]models.StateNodeModel, error) { log.Debug("retrieving state cids for header id ", headerID) args := make([]interface{}, 0, 2) - pgStr := `SELECT state_cids.id, state_cids.header_id, + pgStr := `SELECT state_cids.header_id, state_cids.state_leaf_key, state_cids.node_type, state_cids.cid, state_cids.mh_key, state_cids.state_path - FROM eth.state_cids INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.id) - WHERE header_cids.id = $1` + FROM eth.state_cids INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) + WHERE header_cids.block_hash = $1` args = append(args, headerID) addrLen := len(stateFilter.Addresses) if addrLen > 0 { @@ -426,15 +427,15 @@ func (ecr *CIDRetriever) RetrieveStateCIDs(ctx context.Context, tx sql.Tx, state pgStr += ` AND state_cids.node_type = 2` } stateNodeCIDs := make([]models.StateNodeModel, 0) - return stateNodeCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&stateNodeCIDs) + return stateNodeCIDs, tx.Select(ctx, &stateNodeCIDs, pgStr, args...) } // RetrieveStorageCIDs retrieves and returns all of the storage node cids at the provided header id that conform to the provided filter parameters func (ecr *CIDRetriever) RetrieveStorageCIDs(ctx context.Context, tx sql.Tx, storageFilter StorageFilter, headerID string) ([]models.StorageNodeWithStateKeyModel, error) { log.Debug("retrieving storage cids for header id ", headerID) args := make([]interface{}, 0, 3) - pgStr := `SELECT storage_cids.id, storage_cids.state_id, storage_cids.storage_leaf_key, storage_cids.node_type, - storage_cids.cid, storage_cids.mh_key, storage_cids.storage_path, state_cids.state_leaf_key + pgStr := `SELECT storage_cids.header_id, storage_cids.storage_leaf_key, storage_cids.node_type, + storage_cids.cid, storage_cids.mh_key, storage_cids.storage_path, storage_cids.state_path, state_cids.state_leaf_key FROM eth.storage_cids, eth.state_cids, eth.header_cids WHERE storage_cids.header_id = state_cids.header_id AND storage_cids.state_path = state_cids.state_path AND state_cids.header_id = header_cids.block_hash @@ -459,7 +460,7 @@ func (ecr *CIDRetriever) RetrieveStorageCIDs(ctx context.Context, tx sql.Tx, sto pgStr += ` AND storage_cids.node_type = 2` } storageNodeCIDs := make([]models.StorageNodeWithStateKeyModel, 0) - return storageNodeCIDs, tx.QueryRow(ctx, pgStr, args...).Scan(&storageNodeCIDs) + return storageNodeCIDs, tx.Select(ctx, &storageNodeCIDs, pgStr, args...) } // RetrieveBlockByHash returns all of the CIDs needed to compose an entire block, for a given block hash @@ -571,9 +572,7 @@ func (ecr *CIDRetriever) RetrieveHeaderCIDByHash(ctx context.Context, tx sql.Tx, pgStr := `SELECT * FROM eth.header_cids WHERE block_hash = $1` var headerCID models.HeaderModel - return headerCID, tx.QueryRow(ctx, pgStr, blockHash.String()).Scan(&headerCID.CID, &headerCID.NodeID, &headerCID.BlockHash, &headerCID.BlockNumber, - &headerCID.BaseFee, &headerCID.Bloom, &headerCID.MhKey, &headerCID.ParentHash, &headerCID.RctRoot, &headerCID.Reward, &headerCID.StateRoot, - &headerCID.Timestamp, &headerCID.TimesValidated, &headerCID.TotalDifficulty, &headerCID.TxRoot, &headerCID.UncleRoot) + return headerCID, tx.Get(ctx, &headerCID, pgStr, blockHash.String()) } // RetrieveTxCIDsByHeaderID retrieves all tx CIDs for the given header id @@ -583,18 +582,18 @@ func (ecr *CIDRetriever) RetrieveTxCIDsByHeaderID(ctx context.Context, tx sql.Tx WHERE header_id = $1 ORDER BY index` var txCIDs []models.TxModel - return txCIDs, tx.QueryRow(ctx, pgStr, headerID).(*sqlx.Row).Scan(&txCIDs) + return txCIDs, tx.Select(ctx, &txCIDs, pgStr, headerID) } // RetrieveReceiptCIDsByTxIDs retrieves receipt CIDs by their associated tx IDs func (ecr *CIDRetriever) RetrieveReceiptCIDsByTxIDs(ctx context.Context, tx sql.Tx, txHashes []string) ([]models.ReceiptModel, error) { - log.Debugf("retrieving receipt cids for tx ids %v", txHashes) - pgStr := `SELECT receipt_cids.id, receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, + log.Debugf("retrieving receipt cids for tx hashes %v", txHashes) + pgStr := `SELECT receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.contract, receipt_cids.contract_hash FROM eth.receipt_cids, eth.transaction_cids - WHERE tx_id = ANY($1::INTEGER[]) - AND receipt_cids.tx_id = transaction_cids.id + WHERE tx_id = ANY($1) + AND receipt_cids.tx_id = transaction_cids.tx_hash ORDER BY transaction_cids.index` var rctCIDs []models.ReceiptModel - return rctCIDs, tx.QueryRow(ctx, pgStr, pq.Array(txHashes)).Scan(rctCIDs) + return rctCIDs, tx.Select(ctx, &rctCIDs, pgStr, pq.Array(txHashes)) } diff --git a/pkg/eth/cid_retriever_test.go b/pkg/eth/cid_retriever_test.go index 06fffda6..fea6def4 100644 --- a/pkg/eth/cid_retriever_test.go +++ b/pkg/eth/cid_retriever_test.go @@ -218,8 +218,14 @@ var _ = Describe("Retriever", func() { ) BeforeEach(func() { var err error - goodInfo := node.Info{GenesisBlock: "GENESIS2", NetworkID: "2", ID: "2", ClientName: "geth2", ChainID: 2} - db, err = eth.Setup(ctx, goodInfo) + testInfo := node.Info{ + GenesisBlock: test_helpers.Genesis.Hash().String(), + NetworkID: "2", + ID: "2", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + db, err = eth.Setup(ctx, testInfo) Expect(err).ToNot(HaveOccurred()) diffIndexer, err = sql.NewStateDiffIndexer(ctx, params.TestChainConfig, db) @@ -301,8 +307,8 @@ var _ = Describe("Retriever", func() { } expectedRctCIDsAndLeafNodes := make([]rctCIDAndMHKeyResult, 0) pgStr := `SELECT receipt_cids.leaf_cid, receipt_cids.leaf_mh_key FROM eth.receipt_cids, eth.transaction_cids, eth.header_cids - WHERE receipt_cids.tx_id = transaction_cids.id - AND transaction_cids.header_id = header_cids.id + WHERE receipt_cids.tx_id = transaction_cids.tx_hash + AND transaction_cids.header_id = header_cids.block_hash AND header_cids.block_number = $1 ORDER BY transaction_cids.index` err := db.Select(ctx, &expectedRctCIDsAndLeafNodes, pgStr, test_helpers.BlockNumber.Uint64()) diff --git a/pkg/eth/eth_state_test.go b/pkg/eth/eth_state_test.go index 3f9f0014..a582e054 100644 --- a/pkg/eth/eth_state_test.go +++ b/pkg/eth/eth_state_test.go @@ -21,6 +21,7 @@ import ( "context" "io/ioutil" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -74,8 +75,15 @@ var _ = Describe("eth state reading tests", func() { It("test init", func() { // db and type initializations var err error - goodInfo := node.Info{GenesisBlock: "GENESIS3", NetworkID: "3", ID: "3", ClientName: "geth3", ChainID: 3} - db, err = eth.Setup(ctx, goodInfo) + testInfo := node.Info{ + GenesisBlock: test_helpers.Genesis.Hash().String(), + NetworkID: "3", + ID: "3", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + + db, err = eth.Setup(ctx, testInfo) Expect(err).ToNot(HaveOccurred()) transformer, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) @@ -180,6 +188,8 @@ var _ = Describe("eth state reading tests", func() { err = indexAndPublisher.PushCodeAndCodeHash(tx, hash) Expect(err).ToNot(HaveOccurred()) + // wait for tx batch process to complete. + time.Sleep(600 * time.Millisecond) err = tx.Submit(err) Expect(err).ToNot(HaveOccurred()) }) diff --git a/pkg/eth/ipld_fetcher_test.go b/pkg/eth/ipld_fetcher_test.go index fc211af4..c76615f5 100644 --- a/pkg/eth/ipld_fetcher_test.go +++ b/pkg/eth/ipld_fetcher_test.go @@ -40,8 +40,15 @@ var _ = Describe("IPLDFetcher", func() { err error tx interfaces.Batch ) - goodInfo := node.Info{GenesisBlock: "GENESIS4", NetworkID: "4", ID: "4", ClientName: "geth4", ChainID: 4} - db, err = eth.Setup(ctx, goodInfo) + testInfo := node.Info{ + GenesisBlock: test_helpers.Genesis.Hash().String(), + NetworkID: "4", + ID: "4", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + + db, err = eth.Setup(ctx, testInfo) Expect(err).ToNot(HaveOccurred()) pubAndIndexer, err = sql.NewStateDiffIndexer(ctx, params.TestChainConfig, db) Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/eth/ipld_retriever.go b/pkg/eth/ipld_retriever.go index 0e07ff5b..30c337df 100644 --- a/pkg/eth/ipld_retriever.go +++ b/pkg/eth/ipld_retriever.go @@ -53,12 +53,12 @@ const ( WHERE block_hash = ANY($1::VARCHAR(66)[])` RetrieveUnclesByBlockHashPgStr = `SELECT uncle_cids.cid, data FROM eth.uncle_cids - INNER JOIN eth.header_cids ON (uncle_cids.header_id = header_cids.id) + INNER JOIN eth.header_cids ON (uncle_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (uncle_cids.mh_key = blocks.key) WHERE block_hash = $1` RetrieveUnclesByBlockNumberPgStr = `SELECT uncle_cids.cid, data FROM eth.uncle_cids - INNER JOIN eth.header_cids ON (uncle_cids.header_id = header_cids.id) + INNER JOIN eth.header_cids ON (uncle_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (uncle_cids.mh_key = blocks.key) WHERE block_number = $1` RetrieveUncleByHashPgStr = `SELECT cid, data @@ -71,13 +71,13 @@ const ( WHERE tx_hash = ANY($1::VARCHAR(66)[])` RetrieveTransactionsByBlockHashPgStr = `SELECT transaction_cids.cid, data FROM eth.transaction_cids - INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.id) + INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (transaction_cids.mh_key = blocks.key) WHERE block_hash = $1 ORDER BY eth.transaction_cids.index ASC` RetrieveTransactionsByBlockNumberPgStr = `SELECT transaction_cids.cid, data FROM eth.transaction_cids - INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.id) + INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (transaction_cids.mh_key = blocks.key) WHERE block_number = $1 ORDER BY eth.transaction_cids.index ASC` @@ -87,42 +87,42 @@ const ( WHERE tx_hash = $1` RetrieveReceiptsByTxHashesPgStr = `SELECT receipt_cids.leaf_cid, data FROM eth.receipt_cids - INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.id) + INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.tx_hash) INNER JOIN public.blocks ON (receipt_cids.leaf_mh_key = blocks.key) WHERE tx_hash = ANY($1::VARCHAR(66)[])` RetrieveReceiptsByBlockHashPgStr = `SELECT receipt_cids.leaf_cid, data, eth.transaction_cids.tx_hash FROM eth.receipt_cids - INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.id) - INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.id) + INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.tx_hash) + INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (receipt_cids.leaf_mh_key = blocks.key) WHERE block_hash = $1 ORDER BY eth.transaction_cids.index ASC` RetrieveReceiptsByBlockNumberPgStr = `SELECT receipt_cids.leaf_cid, data FROM eth.receipt_cids - INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.id) - INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.id) + INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.tx_hash) + INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (receipt_cids.leaf_mh_key = blocks.key) WHERE block_number = $1 ORDER BY eth.transaction_cids.index ASC` RetrieveReceiptByTxHashPgStr = `SELECT receipt_cids.leaf_cid, data FROM eth.receipt_cids - INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.id) + INNER JOIN eth.transaction_cids ON (receipt_cids.tx_id = transaction_cids.tx_hash) INNER JOIN public.blocks ON (receipt_cids.leaf_mh_key = blocks.key) WHERE tx_hash = $1` RetrieveAccountByLeafKeyAndBlockHashPgStr = `SELECT state_cids.cid, data, state_cids.node_type FROM eth.state_cids - INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.id) + INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (state_cids.mh_key = blocks.key) WHERE state_leaf_key = $1 AND block_number <= (SELECT block_number FROM eth.header_cids WHERE block_hash = $2) - AND header_cids.id = (SELECT canonical_header_id(block_number)) + AND header_cids.block_hash = (SELECT canonical_header_id(block_number)) ORDER BY block_number DESC LIMIT 1` RetrieveAccountByLeafKeyAndBlockNumberPgStr = `SELECT state_cids.cid, data, state_cids.node_type FROM eth.state_cids - INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.id) + INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (state_cids.mh_key = blocks.key) WHERE state_leaf_key = $1 AND block_number <= $2 @@ -130,7 +130,7 @@ const ( LIMIT 1` RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockNumberPgStr = `SELECT storage_cids.cid, data, storage_cids.node_type, was_state_leaf_removed($1, $3) AS state_leaf_removed FROM eth.storage_cids - INNER JOIN eth.state_cids ON (storage_cids.header_id = state_cids.header_id AND storage_cids.state_path = state_cids.state_path) + INNER JOIN eth.state_cids ON (storage_cids.header_id = state_cids.header_id) INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (storage_cids.mh_key = blocks.key) WHERE state_leaf_key = $1 @@ -140,7 +140,7 @@ const ( LIMIT 1` RetrieveStorageLeafByAddressHashAndLeafKeyAndBlockHashPgStr = `SELECT storage_cids.cid, data, storage_cids.node_type, was_state_leaf_removed($1, $3) AS state_leaf_removed FROM eth.storage_cids - INNER JOIN eth.state_cids ON (storage_cids.header_id = state_cids.header_id AND storage_cids.state_path = state_cids.state_path) + INNER JOIN eth.state_cids ON (storage_cids.header_id = state_cids.header_id) INNER JOIN eth.header_cids ON (state_cids.header_id = header_cids.block_hash) INNER JOIN public.blocks ON (storage_cids.mh_key = blocks.key) WHERE state_leaf_key = $1 @@ -148,7 +148,7 @@ const ( AND block_number <= (SELECT block_number FROM eth.header_cids WHERE block_hash = $3) - AND header_cids.id = (SELECT canonical_header_id(block_number)) + AND header_cids.block_hash = (SELECT canonical_header_id(block_number)) ORDER BY block_number DESC LIMIT 1` ) diff --git a/pkg/eth/test_helpers.go b/pkg/eth/test_helpers.go index 162f1716..a83fd9b7 100644 --- a/pkg/eth/test_helpers.go +++ b/pkg/eth/test_helpers.go @@ -28,7 +28,7 @@ import ( ) func Setup(ctx context.Context, info node.Info) (sql.Database, error) { - driver, err := postgres.NewPGXDriver(ctx, getConfig(), info) + driver, err := postgres.NewSQLXDriver(ctx, getConfig(), info) Expect(err).NotTo(HaveOccurred()) return postgres.NewPostgresDB(driver), nil } diff --git a/pkg/eth/types.go b/pkg/eth/types.go index 9b6b6ca7..5118eda2 100644 --- a/pkg/eth/types.go +++ b/pkg/eth/types.go @@ -248,7 +248,7 @@ type ConvertedPayload struct { // LogResult represent a log. type LogResult struct { LeafCID string `db:"leaf_cid"` - ReceiptID int64 `db:"rct_id"` + ReceiptID string `db:"rct_id"` Address string `db:"address"` Index int64 `db:"index"` Data []byte `db:"log_data"` diff --git a/pkg/graphql/graphql_test.go b/pkg/graphql/graphql_test.go index c370ff46..33aa0203 100644 --- a/pkg/graphql/graphql_test.go +++ b/pkg/graphql/graphql_test.go @@ -66,8 +66,14 @@ var _ = Describe("GraphQL", func() { It("test init", func() { var err error - goodInfo := node.Info{GenesisBlock: "GENESIS5", NetworkID: "5", ID: "5", ClientName: "geth5", ChainID: 5} - db, err = eth.Setup(ctx, goodInfo) + testInfo := node.Info{ + GenesisBlock: test_helpers.Genesis.Hash().String(), + NetworkID: "5", + ID: "5", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + db, err = eth.Setup(ctx, testInfo) Expect(err).ToNot(HaveOccurred()) transformer, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) diff --git a/pkg/prom/prom.go b/pkg/prom/prom.go index 5845eb6a..8d820b6c 100644 --- a/pkg/prom/prom.go +++ b/pkg/prom/prom.go @@ -17,7 +17,7 @@ package prom import ( - "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) @@ -72,7 +72,7 @@ func Init() { } // RegisterDBCollector create metric colletor for given connection -func RegisterDBCollector(name string, db *postgres.PGXDriver) { +func RegisterDBCollector(name string, db sql.Database) { if metrics { prometheus.Register(NewDBStatsCollector(name, db)) } diff --git a/pkg/serve/config.go b/pkg/serve/config.go index dad0c215..cee7d8b4 100644 --- a/pkg/serve/config.go +++ b/pkg/serve/config.go @@ -191,13 +191,13 @@ func NewConfig() (*Config, error) { c.IpldGraphqlEnabled = ipldGraphqlEnabled overrideDBConnConfig(&c.DBConfig) - driver, err := postgres.NewPGXDriver(context.Background(), c.DBConfig, nodeInfo) + driver, err := postgres.NewSQLXDriver(context.Background(), c.DBConfig, nodeInfo) if err != nil { return nil, err } - prom.RegisterDBCollector(c.DBConfig.DatabaseName, driver) c.DB = postgres.NewPostgresDB(driver) + prom.RegisterDBCollector(c.DBConfig.DatabaseName, c.DB) defaultSenderStr := viper.GetString("ethereum.defaultSender") if defaultSenderStr != "" { -- 2.45.2 From c44598971b1d3858e8045e4a984b2e8aa513cce0 Mon Sep 17 00:00:00 2001 From: Arijit Das Date: Mon, 29 Nov 2021 19:37:02 +0530 Subject: [PATCH 3/4] Fix failing test. --- go.mod | 4 ++-- go.sum | 5 ++++- pkg/eth/backend.go | 23 ++++++++++++++--------- pkg/eth/cid_retriever.go | 17 +++++++++-------- pkg/eth/test_helpers/test_data.go | 6 +++--- pkg/shared/functions.go | 11 ----------- 6 files changed, 32 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 0ffd62fe..ccd5fcb9 100644 --- a/go.mod +++ b/go.mod @@ -35,6 +35,6 @@ require ( replace ( github.com/ethereum/go-ethereum v1.10.11 => /Users/arijitdas/go/src/github.com/ethereum/go-ethereum - github.com/vulcanize/eth-ipfs-state-validator v0.0.2 => /Users/arijitdas/go/src/github.com/Vulcanize/eth-ipfs-state-validator - github.com/vulcanize/ipfs-ethdb v0.0.5 => /Users/arijitdas/go/src/github.com/Vulcanize/ipfs-ethdb + github.com/vulcanize/eth-ipfs-state-validator v0.0.2 => github.com/Vulcanize/eth-ipfs-state-validator v0.0.0-20211125063620-bd5bbc60275f + github.com/vulcanize/ipfs-ethdb v0.0.5 => github.com/Vulcanize/ipfs-ethdb v0.0.0-20211125071127-730512e6953c ) diff --git a/go.sum b/go.sum index c6c4a95f..7525cbd9 100644 --- a/go.sum +++ b/go.sum @@ -84,6 +84,10 @@ github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/Vulcanize/eth-ipfs-state-validator v0.0.0-20211125063620-bd5bbc60275f h1:Ola2m1pH6ax3LZPDF9S6aeC6aGMidDEgonKPRS8eEAM= +github.com/Vulcanize/eth-ipfs-state-validator v0.0.0-20211125063620-bd5bbc60275f/go.mod h1:cyBC11l/fNcAfEQgx6yjNtzlgfQZqG821k0/qll2lDE= +github.com/Vulcanize/ipfs-ethdb v0.0.0-20211125071127-730512e6953c h1:ooFjd7mPek6aB4pyxa9PolqrjG67ldSiXaZ4755OAZg= +github.com/Vulcanize/ipfs-ethdb v0.0.0-20211125071127-730512e6953c/go.mod h1:Emd7r9hHiZkW/yyOMNjDo89GwYIVQeMU8W9ywwTquBI= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -748,7 +752,6 @@ github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9 github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index 0f390aaa..bdf9b4f0 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -41,7 +41,6 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/trie" log "github.com/sirupsen/logrus" validator "github.com/vulcanize/eth-ipfs-state-validator/pkg" @@ -70,7 +69,7 @@ const ( RetrieveCanonicalHeaderByNumber = `SELECT cid, data FROM eth.header_cids INNER JOIN public.blocks ON (header_cids.mh_key = blocks.key) WHERE block_hash = (SELECT canonical_header_id($1))` - RetrieveTD = `SELECT td FROM eth.header_cids + RetrieveTD = `SELECT CAST(td as Text) FROM eth.header_cids WHERE header_cids.block_hash = $1` RetrieveRPCTransaction = `SELECT blocks.data, block_hash, block_number, index FROM public.blocks, eth.transaction_cids, eth.header_cids WHERE blocks.key = transaction_cids.mh_key @@ -302,9 +301,6 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber // TODO: optimize this by retrieving iplds directly rather than the cids first (this is remanent from when we fetched iplds through ipfs blockservice interface) headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(ctx, canonicalHash) if err != nil { - if err == dbsql.ErrNoRows { - return nil, nil - } return nil, err } @@ -401,7 +397,6 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo if err == dbsql.ErrNoRows { return nil, nil } - return nil, err } // Begin tx @@ -617,7 +612,12 @@ type rowResult struct { // GetCanonicalHeader gets the canonical header for the provided number, if there is one func (b *Backend) GetCanonicalHeader(ctx context.Context, number uint64) (string, []byte, error) { headerResult := new(rowResult) - return headerResult.CID, headerResult.Data, b.DB.QueryRow(ctx, RetrieveCanonicalHeaderByNumber, number).Scan(&headerResult.CID, &headerResult.Data) + err := b.DB.QueryRow(ctx, RetrieveCanonicalHeaderByNumber, number).Scan(&headerResult.CID, &headerResult.Data) + if err != nil { + return "", nil, err + } + + return headerResult.CID, headerResult.Data, nil } // GetEVM constructs and returns a vm.EVM @@ -745,7 +745,8 @@ func (b *Backend) GetCodeByHash(ctx context.Context, address common.Address, has err = tx.Commit(ctx) } }() - err = tx.Get(ctx, &codeHash, RetrieveCodeHashByLeafKeyAndBlockHash, leafKey.Hex(), hash.Hex()) + + err = tx.QueryRow(ctx, RetrieveCodeHashByLeafKeyAndBlockHash, leafKey.Hex(), hash.Hex()).Scan(&codeHash) if err != nil { return nil, err } @@ -757,7 +758,11 @@ func (b *Backend) GetCodeByHash(ctx context.Context, address common.Address, has } code := make([]byte, 0) - err = tx.Get(ctx, &code, RetrieveCodeByMhKey, mhKey) + err = tx.QueryRow(ctx, RetrieveCodeByMhKey, mhKey).Scan(&code) + if err != nil { + return nil, err + } + return code, err } diff --git a/pkg/eth/cid_retriever.go b/pkg/eth/cid_retriever.go index 4072567e..1c17d2a0 100644 --- a/pkg/eth/cid_retriever.go +++ b/pkg/eth/cid_retriever.go @@ -169,7 +169,9 @@ func (ecr *CIDRetriever) Retrieve(ctx context.Context, filter SubscriptionSettin func (ecr *CIDRetriever) RetrieveHeaderCIDs(ctx context.Context, tx sql.Tx, blockNumber int64) ([]models.HeaderModel, error) { log.Debug("retrieving header cids for block ", blockNumber) headers := make([]models.HeaderModel, 0) - pgStr := `SELECT * FROM eth.header_cids + pgStr := `SELECT CAST(block_number as Text), block_hash,parent_hash,cid,mh_key,CAST(td as Text),node_id, + CAST(reward as Text), state_root,uncle_root,tx_root,receipt_root,bloom,timestamp,times_validated, + coinbase FROM eth.header_cids WHERE block_number = $1` return headers, tx.Select(ctx, &headers, pgStr, blockNumber) @@ -179,7 +181,7 @@ func (ecr *CIDRetriever) RetrieveHeaderCIDs(ctx context.Context, tx sql.Tx, bloc func (ecr *CIDRetriever) RetrieveUncleCIDsByHeaderID(ctx context.Context, tx sql.Tx, headerID string) ([]models.UncleModel, error) { log.Debug("retrieving uncle cids for block id ", headerID) headers := make([]models.UncleModel, 0) - pgStr := `SELECT * FROM eth.uncle_cids + pgStr := `SELECT header_id,block_hash,parent_hash,cid,mh_key, CAST(reward as text) FROM eth.uncle_cids WHERE header_id = $1` return headers, tx.Select(ctx, &headers, pgStr, headerID) @@ -192,8 +194,7 @@ func (ecr *CIDRetriever) RetrieveTxCIDs(ctx context.Context, tx sql.Tx, txFilter args := make([]interface{}, 0, 3) results := make([]models.TxModel, 0) id := 1 - pgStr := fmt.Sprintf(`SELECT transaction_cids.tx_hash, transaction_cids.header_id, - transaction_cids.tx_hash, transaction_cids.cid, transaction_cids.mh_key, + pgStr := fmt.Sprintf(`SELECT transaction_cids.tx_hash, transaction_cids.header_id,transaction_cids.cid, transaction_cids.mh_key, transaction_cids.dst, transaction_cids.src, transaction_cids.index, transaction_cids.tx_data FROM eth.transaction_cids INNER JOIN eth.header_cids ON (transaction_cids.header_id = header_cids.block_hash) WHERE header_cids.block_hash = $%d`, id) @@ -295,7 +296,7 @@ func receiptFilterConditions(id *int, pgStr string, args []interface{}, rctFilte func (ecr *CIDRetriever) RetrieveRctCIDsByHeaderID(ctx context.Context, tx sql.Tx, rctFilter ReceiptFilter, headerID string, trxHashes []string) ([]models.ReceiptModel, error) { log.Debug("retrieving receipt cids for header id ", headerID) args := make([]interface{}, 0, 4) - pgStr := `SELECT receipt_cids.tx_id, receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, + pgStr := `SELECT receipt_cids.tx_id, receipt_cids.leaf_cid, receipt_cids.leaf_mh_key, receipt_cids.contract, receipt_cids.contract_hash FROM eth.receipt_cids, eth.transaction_cids, eth.header_cids WHERE receipt_cids.tx_id = transaction_cids.tx_hash @@ -344,7 +345,7 @@ func (ecr *CIDRetriever) RetrieveFilteredLog(ctx context.Context, tx sql.Tx, rct pgStr := `SELECT eth.log_cids.leaf_cid, eth.log_cids.index, eth.log_cids.rct_id, eth.log_cids.address, eth.log_cids.topic0, eth.log_cids.topic1, eth.log_cids.topic2, eth.log_cids.topic3, eth.log_cids.log_data, eth.transaction_cids.tx_hash, eth.transaction_cids.index as txn_index, - header_cids.block_hash, header_cids.block_number + header_cids.block_hash, CAST(header_cids.block_number as Text) FROM eth.log_cids, eth.receipt_cids, eth.transaction_cids, eth.header_cids WHERE eth.log_cids.rct_id = receipt_cids.tx_id AND receipt_cids.tx_id = transaction_cids.tx_hash @@ -569,10 +570,10 @@ func (ecr *CIDRetriever) RetrieveBlockByNumber(ctx context.Context, blockNumber // RetrieveHeaderCIDByHash returns the header for the given block hash func (ecr *CIDRetriever) RetrieveHeaderCIDByHash(ctx context.Context, tx sql.Tx, blockHash common.Hash) (models.HeaderModel, error) { log.Debug("retrieving header cids for block hash ", blockHash.String()) - pgStr := `SELECT * FROM eth.header_cids + pgStr := `SELECT block_hash,cid,mh_key FROM eth.header_cids WHERE block_hash = $1` var headerCID models.HeaderModel - return headerCID, tx.Get(ctx, &headerCID, pgStr, blockHash.String()) + return headerCID, tx.QueryRow(ctx, pgStr, blockHash.String()).Scan(&headerCID.BlockHash, &headerCID.CID, &headerCID.MhKey) } // RetrieveTxCIDsByHeaderID retrieves all tx CIDs for the given header id diff --git a/pkg/eth/test_helpers/test_data.go b/pkg/eth/test_helpers/test_data.go index a32a5543..fac0eaf0 100644 --- a/pkg/eth/test_helpers/test_data.go +++ b/pkg/eth/test_helpers/test_data.go @@ -437,12 +437,11 @@ var ( StateNodes: MockStateNodes, } - Reward = shared.CalcEthBlockReward(MockBlock.Header(), MockBlock.Uncles(), MockBlock.Transactions(), MockReceipts) - + Reward = shared.CalcEthBlockReward(MockBlock.Header(), MockBlock.Uncles(), MockBlock.Transactions(), MockReceipts) MockCIDWrapper = ð.CIDWrapper{ BlockNumber: new(big.Int).Set(BlockNumber), Header: models.HeaderModel{ - BlockNumber: "1", + BlockNumber: BlockNumber.String(), BlockHash: MockBlock.Hash().String(), ParentHash: "0x0000000000000000000000000000000000000000000000000000000000000000", CID: HeaderCID.String(), @@ -456,6 +455,7 @@ var ( Bloom: MockBlock.Bloom().Bytes(), Timestamp: MockBlock.Time(), TimesValidated: 1, + Coinbase: "0x0000000000000000000000000000000000000000", }, Transactions: MockTrxMetaPostPublsh, Receipts: MockRctMetaPostPublish, diff --git a/pkg/shared/functions.go b/pkg/shared/functions.go index 2441d6ab..54643156 100644 --- a/pkg/shared/functions.go +++ b/pkg/shared/functions.go @@ -62,17 +62,6 @@ func PublishIPLD(ctx context.Context, tx sql.Tx, i node.Node) error { return err } -// FetchIPLD is used to retrieve an ipld from Postgres blockstore with the provided tx and cid string -func FetchIPLD(tx *sqlx.Tx, cid string) ([]byte, error) { - mhKey, err := MultihashKeyFromCIDString(cid) - if err != nil { - return nil, err - } - pgStr := `SELECT data FROM public.blocks WHERE key = $1` - var block []byte - return block, tx.Get(&block, pgStr, mhKey) -} - // FetchIPLDByMhKey is used to retrieve an ipld from Postgres blockstore with the provided tx and mhkey string func FetchIPLDByMhKey(ctx context.Context, tx sql.Tx, mhKey string) ([]byte, error) { pgStr := `SELECT data FROM public.blocks WHERE key = $1` -- 2.45.2 From 7cd8a2dce1bf571c101cc6af58acd981979ce94a Mon Sep 17 00:00:00 2001 From: Arijit Das Date: Mon, 29 Nov 2021 20:19:22 +0530 Subject: [PATCH 4/4] Refactor code. --- pkg/eth/api_test.go | 10 +--------- pkg/eth/cid_retriever_test.go | 11 +---------- pkg/eth/eth_state_test.go | 11 +---------- pkg/eth/ipld_fetcher_test.go | 10 +--------- pkg/eth/test_helpers.go | 13 +++++++++++-- pkg/graphql/graphql_test.go | 10 +--------- 6 files changed, 16 insertions(+), 49 deletions(-) diff --git a/pkg/eth/api_test.go b/pkg/eth/api_test.go index f434d83f..b972c0d1 100644 --- a/pkg/eth/api_test.go +++ b/pkg/eth/api_test.go @@ -32,7 +32,6 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" - "github.com/ethereum/go-ethereum/statediff/indexer/node" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -196,14 +195,7 @@ var _ = Describe("API", func() { tx interfaces.Batch ) - testInfo := node.Info{ - GenesisBlock: test_helpers.Genesis.Hash().String(), - NetworkID: "1", - ID: "1", - ClientName: "geth", - ChainID: params.TestChainConfig.ChainID.Uint64(), - } - db, err = eth.Setup(ctx, testInfo) + db, err = eth.SetupDB(ctx, test_helpers.Genesis.Hash()) Expect(err).ToNot(HaveOccurred()) indexAndPublisher, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/eth/cid_retriever_test.go b/pkg/eth/cid_retriever_test.go index fea6def4..dd6b025e 100644 --- a/pkg/eth/cid_retriever_test.go +++ b/pkg/eth/cid_retriever_test.go @@ -23,7 +23,6 @@ import ( "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/node" "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/common" @@ -218,17 +217,9 @@ var _ = Describe("Retriever", func() { ) BeforeEach(func() { var err error - testInfo := node.Info{ - GenesisBlock: test_helpers.Genesis.Hash().String(), - NetworkID: "2", - ID: "2", - ClientName: "geth", - ChainID: params.TestChainConfig.ChainID.Uint64(), - } - db, err = eth.Setup(ctx, testInfo) + db, err = eth.SetupDB(ctx, test_helpers.Genesis.Hash()) Expect(err).ToNot(HaveOccurred()) diffIndexer, err = sql.NewStateDiffIndexer(ctx, params.TestChainConfig, db) - Expect(err).ToNot(HaveOccurred()) retriever = eth.NewCIDRetriever(db) diff --git a/pkg/eth/eth_state_test.go b/pkg/eth/eth_state_test.go index a582e054..d167f74f 100644 --- a/pkg/eth/eth_state_test.go +++ b/pkg/eth/eth_state_test.go @@ -33,7 +33,6 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/statediff" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" - "github.com/ethereum/go-ethereum/statediff/indexer/node" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -75,15 +74,7 @@ var _ = Describe("eth state reading tests", func() { It("test init", func() { // db and type initializations var err error - testInfo := node.Info{ - GenesisBlock: test_helpers.Genesis.Hash().String(), - NetworkID: "3", - ID: "3", - ClientName: "geth", - ChainID: params.TestChainConfig.ChainID.Uint64(), - } - - db, err = eth.Setup(ctx, testInfo) + db, err = eth.SetupDB(ctx, test_helpers.Genesis.Hash()) Expect(err).ToNot(HaveOccurred()) transformer, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) diff --git a/pkg/eth/ipld_fetcher_test.go b/pkg/eth/ipld_fetcher_test.go index c76615f5..84515034 100644 --- a/pkg/eth/ipld_fetcher_test.go +++ b/pkg/eth/ipld_fetcher_test.go @@ -20,7 +20,6 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" - "github.com/ethereum/go-ethereum/statediff/indexer/node" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -40,15 +39,8 @@ var _ = Describe("IPLDFetcher", func() { err error tx interfaces.Batch ) - testInfo := node.Info{ - GenesisBlock: test_helpers.Genesis.Hash().String(), - NetworkID: "4", - ID: "4", - ClientName: "geth", - ChainID: params.TestChainConfig.ChainID.Uint64(), - } - db, err = eth.Setup(ctx, testInfo) + db, err = eth.SetupDB(ctx, test_helpers.Genesis.Hash()) Expect(err).ToNot(HaveOccurred()) pubAndIndexer, err = sql.NewStateDiffIndexer(ctx, params.TestChainConfig, db) Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/eth/test_helpers.go b/pkg/eth/test_helpers.go index a83fd9b7..bb481f36 100644 --- a/pkg/eth/test_helpers.go +++ b/pkg/eth/test_helpers.go @@ -20,6 +20,8 @@ import ( "context" "os" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" "github.com/ethereum/go-ethereum/statediff/indexer/models" @@ -27,8 +29,15 @@ import ( . "github.com/onsi/gomega" ) -func Setup(ctx context.Context, info node.Info) (sql.Database, error) { - driver, err := postgres.NewSQLXDriver(ctx, getConfig(), info) +func SetupDB(ctx context.Context, genHash common.Hash) (sql.Database, error) { + testInfo := node.Info{ + GenesisBlock: genHash.String(), + NetworkID: "1", + ID: "1", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + driver, err := postgres.NewSQLXDriver(ctx, getConfig(), testInfo) Expect(err).NotTo(HaveOccurred()) return postgres.NewPostgresDB(driver), nil } diff --git a/pkg/graphql/graphql_test.go b/pkg/graphql/graphql_test.go index 33aa0203..503bdbed 100644 --- a/pkg/graphql/graphql_test.go +++ b/pkg/graphql/graphql_test.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/statediff" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql" - "github.com/ethereum/go-ethereum/statediff/indexer/node" sdtypes "github.com/ethereum/go-ethereum/statediff/types" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -66,14 +65,7 @@ var _ = Describe("GraphQL", func() { It("test init", func() { var err error - testInfo := node.Info{ - GenesisBlock: test_helpers.Genesis.Hash().String(), - NetworkID: "5", - ID: "5", - ClientName: "geth", - ChainID: params.TestChainConfig.ChainID.Uint64(), - } - db, err = eth.Setup(ctx, testInfo) + db, err = eth.SetupDB(ctx, test_helpers.Genesis.Hash()) Expect(err).ToNot(HaveOccurred()) transformer, err := sql.NewStateDiffIndexer(ctx, chainConfig, db) -- 2.45.2