From 497e5e9ebe1e463b79cec53baf6d5d8fc2bf313e Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Thu, 7 Sep 2023 16:07:44 +0530 Subject: [PATCH 01/13] Avail:0:Intial commit:Avail DA layer with op-stack --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 88f8a41783b..2608c9bf209 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +# Added these ingnores for avail-optimism +cmd-addrs-keys.txt + + + .DS_Store node_modules results From 8ce4141e0dc486772eefb91f111335d9c7d70dc6 Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Fri, 8 Sep 2023 16:59:00 +0530 Subject: [PATCH 02/13] Avail:1:+ op-avail,+ submit data func,+ block ref --- go.mod | 13 +++ go.sum | 60 +++++++++++ op-avail/.gitignore | 1 + op-avail/internal/config/config.go | 35 ++++++ op-avail/internal/types/availBlockRef.go | 30 ++++++ op-avail/internal/utils/utils.go | 12 +++ op-avail/services/submitDataAndWatch.go | 131 +++++++++++++++++++++++ op-service/txmgr/txmgr.go | 22 ++++ 8 files changed, 304 insertions(+) create mode 100644 op-avail/.gitignore create mode 100644 op-avail/internal/config/config.go create mode 100644 op-avail/internal/types/availBlockRef.go create mode 100644 op-avail/internal/utils/utils.go create mode 100644 op-avail/services/submitDataAndWatch.go diff --git a/go.mod b/go.mod index 00ea82efb8a..44a82bf90bd 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( ) require ( + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/VictoriaMetrics/fastcache v1.10.0 // indirect github.com/allegro/bigcache v1.2.1 // indirect @@ -47,6 +48,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/btcsuite/btcd/btcutil v1.1.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect + github.com/centrifuge/go-substrate-rpc-client/v4 v4.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect @@ -54,10 +56,13 @@ require ( github.com/cockroachdb/redact v1.1.3 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect + github.com/deckarep/golang-set v1.8.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/decred/base58 v1.0.3 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/docker/docker v20.10.24+incompatible // indirect @@ -84,6 +89,8 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.3.0 // indirect + github.com/gtank/merlin v0.1.1 // indirect + github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -118,6 +125,7 @@ require ( github.com/miekg/dns v1.1.50 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect + github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect @@ -134,6 +142,7 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 // indirect + github.com/pierrec/xxHash v0.1.5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.39.0 // indirect @@ -157,6 +166,7 @@ require ( github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.5.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/vedhavyas/go-subkey v1.0.3 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.uber.org/atomic v1.10.0 // indirect @@ -180,4 +190,7 @@ require ( replace github.com/ethereum/go-ethereum v1.11.6 => github.com/ethereum-optimism/op-geth v1.101106.0-rc.2 +//To interact with Avail DA +replace github.com/centrifuge/go-substrate-rpc-client/v4 => github.com/availproject/go-substrate-rpc-client/v4 v4.0.12-avail-1.4.0-rc1-5e286e3 + //replace github.com/ethereum/go-ethereum v1.11.6 => ../go-ethereum diff --git a/go.sum b/go.sum index bbf384ec463..a0f3f74d9b7 100644 --- a/go.sum +++ b/go.sum @@ -9,23 +9,42 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.10.0 h1:5hDJnLsKLpnUEToub7ETuRu8RCkb40woBZAUiKonXzY= github.com/VictoriaMetrics/fastcache v1.10.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/availproject/go-substrate-rpc-client/v4 v4.0.12-avail-1.4.0-rc1-5e286e3 h1:9bPK0/Vd+uOQul3vEBSemRXO+rwqi+UXDAvFzNUlG8A= +github.com/availproject/go-substrate-rpc-client/v4 v4.0.12-avail-1.4.0-rc1-5e286e3/go.mod h1:5g1oM4Zu3BOaLpsKQ+O8PAv2kNuq+kPcA1VzFbsSqxE= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= @@ -49,6 +68,7 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= @@ -59,7 +79,9 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -68,6 +90,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= @@ -80,6 +103,7 @@ github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoG github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= @@ -91,6 +115,9 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -104,8 +131,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/base58 v1.0.3 h1:KGZuh8d1WEMIrK0leQRM47W85KqCAdl2N+uagbctdDI= +github.com/decred/base58 v1.0.3/go.mod h1:pXP9cXCfM2sFLb2viz2FNIdeMWmZDBKG3ZBYbiSM78E= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -145,6 +176,7 @@ github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0Kqy github.com/ethereum-optimism/op-geth v1.101106.0-rc.2 h1:F3SGS0XIvRQ0MjL3Rzbx3A688hNsqv/DtdlBnZimFTw= github.com/ethereum-optimism/op-geth v1.101106.0-rc.2/go.mod h1:X9t7oeerFMU9/zMIjZKT/jbIca+O05QqtBTLjL+XVeA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= @@ -180,6 +212,7 @@ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclK github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -194,6 +227,7 @@ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/j github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= @@ -289,6 +323,11 @@ github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY4 github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -348,17 +387,22 @@ github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABo github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= @@ -393,6 +437,7 @@ 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= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= @@ -468,6 +513,9 @@ github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUM github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= @@ -485,6 +533,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -513,6 +562,9 @@ github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqd github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -555,6 +607,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= +github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -657,6 +711,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -689,6 +744,8 @@ github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBn github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vedhavyas/go-subkey v1.0.3 h1:iKR33BB/akKmcR2PMlXPBeeODjWLM90EL98OrOGs8CA= +github.com/vedhavyas/go-subkey v1.0.3/go.mod h1:CloUaFQSSTdWnINfBRFjVMkWXZANW+nd8+TI5jYcl6Y= 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/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -736,9 +793,11 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -952,6 +1011,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/op-avail/.gitignore b/op-avail/.gitignore new file mode 100644 index 00000000000..d344ba6b06c --- /dev/null +++ b/op-avail/.gitignore @@ -0,0 +1 @@ +config.json diff --git a/op-avail/internal/config/config.go b/op-avail/internal/config/config.go new file mode 100644 index 00000000000..bc6892839c1 --- /dev/null +++ b/op-avail/internal/config/config.go @@ -0,0 +1,35 @@ +package config + +import ( + "encoding/json" + "io" + "os" +) + +type Config struct { + Seed string `json:"seed"` + ApiURL string `json:"api_url"` + AppID int `json:"app_id"` + Address string `json:"address"` +} + +func (c *Config) GetConfig(configFileName string) error { + + jsonFile, err := os.Open(configFileName) + if err != nil { + return err + } + defer jsonFile.Close() + + byteValue, err := io.ReadAll(jsonFile) + if err != nil { + return err + } + + err = json.Unmarshal(byteValue, c) + if err != nil { + return err + } + + return nil +} diff --git a/op-avail/internal/types/availBlockRef.go b/op-avail/internal/types/availBlockRef.go new file mode 100644 index 00000000000..0e7d69fc4c3 --- /dev/null +++ b/op-avail/internal/types/availBlockRef.go @@ -0,0 +1,30 @@ +package avail_types + +import ( + "encoding/json" + "fmt" + + "github.com/centrifuge/go-substrate-rpc-client/v4/types" +) + +type AvailBlockRef struct { + BlockHash string // Hash for block on avail chain + Sender string // sender address to filter extrinsic out sepecifically for this address + Nonce types.UCompact // nonce to filter specific extrinsic +} + +func (a *AvailBlockRef) MarshalToBinary() ([]byte, error) { + ref_bytes, err := json.Marshal(a) + if err != nil { + return []byte{}, fmt.Errorf("unable to covert the avail block referece into array of bytes and getting error:%v", err) + } + return ref_bytes, nil +} + +func (a *AvailBlockRef) UnmarshalFromBinary(avail_Blk_Ref []byte) error { + err := json.Unmarshal(avail_Blk_Ref, a) + if err != nil { + return fmt.Errorf("unable to convert avail_Blk_Ref bytes to AvailBlockRef Struct and getting error:%v", err) + } + return nil +} diff --git a/op-avail/internal/utils/utils.go b/op-avail/internal/utils/utils.go new file mode 100644 index 00000000000..034e49f8b17 --- /dev/null +++ b/op-avail/internal/utils/utils.go @@ -0,0 +1,12 @@ +package utils + +var localNonce uint32 = 0 + +func GetAccountNonce(accountNonce uint32) uint32 { + if accountNonce > localNonce { + localNonce = accountNonce + return accountNonce + } + localNonce++ + return localNonce +} diff --git a/op-avail/services/submitDataAndWatch.go b/op-avail/services/submitDataAndWatch.go new file mode 100644 index 00000000000..71b0ab2010a --- /dev/null +++ b/op-avail/services/submitDataAndWatch.go @@ -0,0 +1,131 @@ +package service + +import ( + "errors" + "fmt" + "time" + + gsrpc "github.com/centrifuge/go-substrate-rpc-client/v4" + "github.com/centrifuge/go-substrate-rpc-client/v4/signature" + "github.com/centrifuge/go-substrate-rpc-client/v4/types" + "github.com/ethereum-optimism/optimism/op-avail/internal/config" + avail_types "github.com/ethereum-optimism/optimism/op-avail/internal/types" + "github.com/ethereum-optimism/optimism/op-avail/internal/utils" +) + +// submitData creates a transaction and makes a Avail data submission +func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { + + var config config.Config + err := config.GetConfig("../op-avail/config.json") + if err != nil { + panic(fmt.Sprintf("cannot get config:%v", err)) + } + + //Intitializing variables + ApiURL := config.ApiURL + Seed := config.Seed + AppID := config.AppID + + api, err := gsrpc.NewSubstrateAPI(ApiURL) + if err != nil { + fmt.Printf("cannot create api: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + meta, err := api.RPC.State.GetMetadataLatest() + if err != nil { + fmt.Printf("cannot get metadata: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + appID := 0 + // if app id is greater than 0 then it must be created before submitting data + if AppID != 0 { + appID = AppID + } + + c, err := types.NewCall(meta, "DataAvailability.submit_data", types.NewBytes([]byte(data))) + if err != nil { + fmt.Printf("cannot create new call: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + // Create the extrinsic + ext := types.NewExtrinsic(c) + + genesisHash, err := api.RPC.Chain.GetBlockHash(0) + if err != nil { + fmt.Printf("cannot get block hash: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + rv, err := api.RPC.State.GetRuntimeVersionLatest() + if err != nil { + fmt.Printf("cannot get runtime version: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + keyringPair, err := signature.KeyringPairFromSecret(Seed, 42) + if err != nil { + fmt.Printf("cannot create LeyPair: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + key, err := types.CreateStorageKey(meta, "System", "Account", keyringPair.PublicKey) + if err != nil { + fmt.Printf("cannot create storage key: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + var accountInfo types.AccountInfo + ok, err := api.RPC.State.GetStorageLatest(key, &accountInfo) + if err != nil || !ok { + fmt.Printf("cannot get latest storage: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + nonce := utils.GetAccountNonce(uint32(accountInfo.Nonce)) + //fmt.Println("Nonce from localDatabase:", nonce, " :::::::: from acountInfo:", accountInfo.Nonce) + o := types.SignatureOptions{ + BlockHash: genesisHash, + Era: types.ExtrinsicEra{IsMortalEra: false}, + GenesisHash: genesisHash, + Nonce: types.NewUCompactFromUInt(uint64(nonce)), + SpecVersion: rv.SpecVersion, + Tip: types.NewUCompactFromUInt(0), + AppID: types.NewUCompactFromUInt(uint64(appID)), + TransactionVersion: rv.TransactionVersion, + } + + // Sign the transaction using Alice's default account + err = ext.Sign(keyringPair, o) + if err != nil { + fmt.Printf("cannot sign: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + // Send the extrinsic + sub, err := api.RPC.Author.SubmitAndWatchExtrinsic(ext) + if err != nil { + fmt.Printf("cannot submit extrinsic: error:%v", err) + return avail_types.AvailBlockRef{}, err + } + + fmt.Println("Data of lenght :", len(data), "submitted by op-stack with address ", keyringPair.Address, " using appID ", appID) + + defer sub.Unsubscribe() + timeout := time.After(50 * time.Second) + for { + select { + case status := <-sub.Chan(): + if status.IsInBlock { + fmt.Printf("Txn inside block %v\n", status.AsInBlock.Hex()) + } + return avail_types.AvailBlockRef{BlockHash: status.AsInBlock.Hex(), Sender: keyringPair.Address, Nonce: o.Nonce}, nil + case <-timeout: + fmt.Printf("timeout of 100 seconds reached without getting finalized status for extrinsic") + return avail_types.AvailBlockRef{}, errors.New("Timitout before getting finalized status") + } + } +} diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go index cb5e058cd5d..d9f19c577a4 100644 --- a/op-service/txmgr/txmgr.go +++ b/op-service/txmgr/txmgr.go @@ -10,6 +10,7 @@ import ( "sync/atomic" "time" + avail "github.com/ethereum-optimism/optimism/op-avail/services" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -155,6 +156,27 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ ctx, cancel = context.WithTimeout(ctx, m.cfg.TxSendTimeout) defer cancel() } + + // To pass the data on avail for batcher + if candidate.To.Hex() == "0xfF00000000000000000000000000000000042069" { + + // Submitting data to Avail + avail_Blk_Ref, err := avail.SubmitDataAndWatch(candidate.TxData) + if err != nil { + panic(fmt.Sprintf("cannot submit data:%v", err)) + } + + fmt.Printf("Avail Block Reference: %+v", avail_Blk_Ref) + + // ref_bytes_Data, err := avail_Blk_Ref.MarshalToBinary() + // if err != nil { + // panic(fmt.Sprintf("cannot get the binary form of avail block reference:%v", err)) + // } + + // To add reference on ethereum layer + // candidate = TxCandidate{TxData: ref_bytes_Data, To: candidate.To, GasLimit: candidate.GasLimit} + } + tx, err := m.craftTx(ctx, candidate) if err != nil { return nil, fmt.Errorf("failed to create the tx: %w", err) From f9ea95574bc51b8d96fbb29368ba2655ce67aae0 Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Mon, 11 Sep 2023 16:52:10 +0530 Subject: [PATCH 03/13] Avail:2: Added func for derivation from DA layer --- op-avail/services/getBlockExtrinsicData.go | 65 +++++++++++++++++++ op-avail/services/submitDataAndWatch.go | 10 +-- .../{internal => }/types/availBlockRef.go | 8 +-- op-node/.gitignore | 5 ++ op-node/rollup/derive/calldata_source.go | 20 +++++- op-service/txmgr/txmgr.go | 15 +++-- packages/contracts-bedrock/.gitignore | 4 ++ 7 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 op-avail/services/getBlockExtrinsicData.go rename op-avail/{internal => }/types/availBlockRef.go (68%) diff --git a/op-avail/services/getBlockExtrinsicData.go b/op-avail/services/getBlockExtrinsicData.go new file mode 100644 index 00000000000..c250289cac0 --- /dev/null +++ b/op-avail/services/getBlockExtrinsicData.go @@ -0,0 +1,65 @@ +package service + +import ( + "errors" + "fmt" + + gsrpc "github.com/centrifuge/go-substrate-rpc-client/v4" + "github.com/centrifuge/go-substrate-rpc-client/v4/types" + "github.com/centrifuge/go-substrate-rpc-client/v4/types/codec" + "github.com/ethereum-optimism/optimism/op-avail/internal/config" + avail_types "github.com/ethereum-optimism/optimism/op-avail/types" + "github.com/vedhavyas/go-subkey" +) + +// GetBlock: To fetch the extrinsic Data from block's extrinsic by hash +func GetBlockExtrinsicData(avail_blk_ref avail_types.AvailBlockRef) ([]byte, error) { + + var config config.Config + err := config.GetConfig("../op-avail/config.json") + if err != nil { + panic(fmt.Sprintf("cannot get config:%v", err)) + } + + //Intitializing variables + ApiURL := config.ApiURL + Hash := avail_blk_ref.BlockHash + Address := avail_blk_ref.Sender + Nonce := avail_blk_ref.Nonce + + api, err := gsrpc.NewSubstrateAPI(ApiURL) + if err != nil { + return []byte{}, fmt.Errorf("cannot create api:%w", err) + } + + // Converting this string type hash into types.hash type + blk_hash, err := types.NewHashFromHexString(Hash) + if err != nil { + return []byte{}, fmt.Errorf("unable to convert string hash into types.hash, error:%v", err) + } + + avail_blk, err := api.RPC.Chain.GetBlock(blk_hash) + if err != nil { + return []byte{}, fmt.Errorf("cannot get block for hash:%v and getting error:%v", Hash, err) + } + + for _, ext := range avail_blk.Block.Extrinsics { + // these values below are specific indexes only for data submission, differs with each extrinsic + ext_Addr, err := subkey.SS58Address(ext.Signature.Signer.AsID.ToBytes(), 42) + if err != nil { + fmt.Printf("error in creating address from accountId, error:%v", err) + } + fmt.Println("ext_Addr=", ext_Addr, " Address=", Address, " ext_Nonce=", ext.Signature.Nonce.Int64(), " Nonce=", Nonce) + if ext_Addr == Address && ext.Signature.Nonce.Int64() == Nonce && ext.Signature.AppID.Int64() == 1 && ext.Method.CallIndex.SectionIndex == 29 && ext.Method.CallIndex.MethodIndex == 1 { + args := ext.Method.Args + var data []byte + err = codec.Decode(args, &data) + if err != nil { + fmt.Printf("Error in decoding args :%v", err) + } + return data, nil + } + } + + return []byte{}, errors.New(fmt.Sprintf("Didn't found any extrinsic data for address:%v in block having hash:%v", Address, Hash)) +} diff --git a/op-avail/services/submitDataAndWatch.go b/op-avail/services/submitDataAndWatch.go index 71b0ab2010a..50cdba44c81 100644 --- a/op-avail/services/submitDataAndWatch.go +++ b/op-avail/services/submitDataAndWatch.go @@ -9,8 +9,8 @@ import ( "github.com/centrifuge/go-substrate-rpc-client/v4/signature" "github.com/centrifuge/go-substrate-rpc-client/v4/types" "github.com/ethereum-optimism/optimism/op-avail/internal/config" - avail_types "github.com/ethereum-optimism/optimism/op-avail/internal/types" "github.com/ethereum-optimism/optimism/op-avail/internal/utils" + avail_types "github.com/ethereum-optimism/optimism/op-avail/types" ) // submitData creates a transaction and makes a Avail data submission @@ -115,14 +115,14 @@ func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { fmt.Println("Data of lenght :", len(data), "submitted by op-stack with address ", keyringPair.Address, " using appID ", appID) defer sub.Unsubscribe() - timeout := time.After(50 * time.Second) + timeout := time.After(100 * time.Second) for { select { case status := <-sub.Chan(): - if status.IsInBlock { - fmt.Printf("Txn inside block %v\n", status.AsInBlock.Hex()) + if status.IsFinalized { + fmt.Printf("Txn inside finalized block %v\n", status.AsFinalized.Hex()) + return avail_types.AvailBlockRef{BlockHash: string(status.AsFinalized.Hex()), Sender: keyringPair.Address, Nonce: o.Nonce.Int64()}, nil } - return avail_types.AvailBlockRef{BlockHash: status.AsInBlock.Hex(), Sender: keyringPair.Address, Nonce: o.Nonce}, nil case <-timeout: fmt.Printf("timeout of 100 seconds reached without getting finalized status for extrinsic") return avail_types.AvailBlockRef{}, errors.New("Timitout before getting finalized status") diff --git a/op-avail/internal/types/availBlockRef.go b/op-avail/types/availBlockRef.go similarity index 68% rename from op-avail/internal/types/availBlockRef.go rename to op-avail/types/availBlockRef.go index 0e7d69fc4c3..6fed9922567 100644 --- a/op-avail/internal/types/availBlockRef.go +++ b/op-avail/types/availBlockRef.go @@ -3,14 +3,12 @@ package avail_types import ( "encoding/json" "fmt" - - "github.com/centrifuge/go-substrate-rpc-client/v4/types" ) type AvailBlockRef struct { - BlockHash string // Hash for block on avail chain - Sender string // sender address to filter extrinsic out sepecifically for this address - Nonce types.UCompact // nonce to filter specific extrinsic + BlockHash string // Hash for block on avail chain + Sender string // sender address to filter extrinsic out sepecifically for this address + Nonce int64 // nonce to filter specific extrinsic } func (a *AvailBlockRef) MarshalToBinary() ([]byte, error) { diff --git a/op-node/.gitignore b/op-node/.gitignore index ba077a4031a..7c4f7a2306e 100644 --- a/op-node/.gitignore +++ b/op-node/.gitignore @@ -1 +1,6 @@ +# Ingnore for avail-optimism +genesis.json +rollup.json +jwt.txt + bin diff --git a/op-node/rollup/derive/calldata_source.go b/op-node/rollup/derive/calldata_source.go index 52314420a8d..04d41449880 100644 --- a/op-node/rollup/derive/calldata_source.go +++ b/op-node/rollup/derive/calldata_source.go @@ -11,6 +11,10 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + avail "github.com/ethereum-optimism/optimism/op-avail/services" + + avail_types "github.com/ethereum-optimism/optimism/op-avail/types" + "github.com/ethereum-optimism/optimism/op-node/eth" "github.com/ethereum-optimism/optimism/op-node/rollup" ) @@ -119,7 +123,21 @@ func DataFromEVMTransactions(config *rollup.Config, batcherAddr common.Address, log.Warn("tx in inbox with unauthorized submitter", "index", j, "err", err) continue // not an authorized batch submitter, ignore } - out = append(out, tx.Data()) + + //Getting Avail block reference from callData + avail_blk_ref := avail_types.AvailBlockRef{} + err = avail_blk_ref.UnmarshalFromBinary(tx.Data()) + if err != nil { + panic(fmt.Errorf("Failed to unmarshal the ethereum trxn data to avail block refrence, error:%v", err)) + } + fmt.Printf("Avail Block Reference: %+v", avail_blk_ref) + + trxn_data, err := avail.GetBlockExtrinsicData(avail_blk_ref) + if err != nil { + panic(fmt.Errorf("Failed to get block extrinsic data, error:%v", err)) + } + + out = append(out, trxn_data) } } return out diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go index d9f19c577a4..ba2c5fe095c 100644 --- a/op-service/txmgr/txmgr.go +++ b/op-service/txmgr/txmgr.go @@ -158,7 +158,8 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ } // To pass the data on avail for batcher - if candidate.To.Hex() == "0xfF00000000000000000000000000000000042069" { + if candidate.To.Hex() == "0xFf00000000000000000000000000000000042069" { + fmt.Println("Working on batch submission for avail") // Submitting data to Avail avail_Blk_Ref, err := avail.SubmitDataAndWatch(candidate.TxData) @@ -168,13 +169,13 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ fmt.Printf("Avail Block Reference: %+v", avail_Blk_Ref) - // ref_bytes_Data, err := avail_Blk_Ref.MarshalToBinary() - // if err != nil { - // panic(fmt.Sprintf("cannot get the binary form of avail block reference:%v", err)) - // } + ref_bytes_Data, err := avail_Blk_Ref.MarshalToBinary() + if err != nil { + panic(fmt.Sprintf("cannot get the binary form of avail block reference:%v", err)) + } - // To add reference on ethereum layer - // candidate = TxCandidate{TxData: ref_bytes_Data, To: candidate.To, GasLimit: candidate.GasLimit} + //To add reference on ethereum layer + candidate = TxCandidate{TxData: ref_bytes_Data, To: candidate.To, GasLimit: candidate.GasLimit} } tx, err := m.craftTx(ctx, candidate) diff --git a/packages/contracts-bedrock/.gitignore b/packages/contracts-bedrock/.gitignore index 4611ced23b6..69de02f396a 100644 --- a/packages/contracts-bedrock/.gitignore +++ b/packages/contracts-bedrock/.gitignore @@ -1,3 +1,7 @@ +# Ingnore for avail-optimism +deployments/avail-optimism +deploy-config/avail-optimism.json + artifacts forge-artifacts cache From 443c40b0a1316a96d70bb18a10cf3becf8e7a7ff Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Tue, 12 Sep 2023 15:58:26 +0530 Subject: [PATCH 04/13] Avail:3:optimised the code --- op-avail/avail/getTxDataByDARef.go | 25 ++++++++++ op-avail/avail/submitTxDataAndGetRef.go | 26 ++++++++++ .../services/getBlockExtrinsicData.go | 8 ++-- .../services/submitDataAndWatch.go | 48 +++++++++---------- .../{ => internal}/types/availBlockRef.go | 2 +- op-node/rollup/derive/calldata_source.go | 19 ++------ op-service/txmgr/txmgr.go | 20 ++------ 7 files changed, 90 insertions(+), 58 deletions(-) create mode 100644 op-avail/avail/getTxDataByDARef.go create mode 100644 op-avail/avail/submitTxDataAndGetRef.go rename op-avail/{ => internal}/services/getBlockExtrinsicData.go (88%) rename op-avail/{ => internal}/services/submitDataAndWatch.go (67%) rename op-avail/{ => internal}/types/availBlockRef.go (97%) diff --git a/op-avail/avail/getTxDataByDARef.go b/op-avail/avail/getTxDataByDARef.go new file mode 100644 index 00000000000..6575c17670e --- /dev/null +++ b/op-avail/avail/getTxDataByDARef.go @@ -0,0 +1,25 @@ +package avail + +import ( + "fmt" + + service "github.com/ethereum-optimism/optimism/op-avail/internal/services" + types "github.com/ethereum-optimism/optimism/op-avail/internal/types" +) + +func GetTxDataByDARef(RefData []byte) ([]byte, error) { + //Getting Avail block reference from callData + avail_blk_ref := types.AvailBlockRef{} + err := avail_blk_ref.UnmarshalFromBinary(RefData) + if err != nil { + return []byte{}, fmt.Errorf("Failed to unmarshal the ethereum trxn data to avail block refrence, error:%v", err) + } + fmt.Printf("Avail Block Reference: %+v", avail_blk_ref) + + txData, err := service.GetBlockExtrinsicData(avail_blk_ref) + if err != nil { + return []byte{}, fmt.Errorf("Failed to get block extrinsic data, error:%v", err) + } + + return txData, nil +} diff --git a/op-avail/avail/submitTxDataAndGetRef.go b/op-avail/avail/submitTxDataAndGetRef.go new file mode 100644 index 00000000000..ee768b08928 --- /dev/null +++ b/op-avail/avail/submitTxDataAndGetRef.go @@ -0,0 +1,26 @@ +package avail + +import ( + "fmt" + + service "github.com/ethereum-optimism/optimism/op-avail/internal/services" +) + +func SubmitTxDataAndGetRef(TxData []byte) ([]byte, error) { + fmt.Println("Working on batch submission for avail") + + // Submitting data to Avail + avail_Blk_Ref, err := service.SubmitDataAndWatch(TxData) + if err != nil { + return []byte{}, fmt.Errorf("cannot submit data:%v", err) + } + + fmt.Printf("Avail Block Reference: %+v", avail_Blk_Ref) + + ref_bytes_Data, err := avail_Blk_Ref.MarshalToBinary() + if err != nil { + return []byte{}, fmt.Errorf("cannot get the binary form of avail block reference:%v", err) + } + + return ref_bytes_Data, nil +} diff --git a/op-avail/services/getBlockExtrinsicData.go b/op-avail/internal/services/getBlockExtrinsicData.go similarity index 88% rename from op-avail/services/getBlockExtrinsicData.go rename to op-avail/internal/services/getBlockExtrinsicData.go index c250289cac0..95f9161c25e 100644 --- a/op-avail/services/getBlockExtrinsicData.go +++ b/op-avail/internal/services/getBlockExtrinsicData.go @@ -5,15 +5,15 @@ import ( "fmt" gsrpc "github.com/centrifuge/go-substrate-rpc-client/v4" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" + gsrpc_types "github.com/centrifuge/go-substrate-rpc-client/v4/types" "github.com/centrifuge/go-substrate-rpc-client/v4/types/codec" "github.com/ethereum-optimism/optimism/op-avail/internal/config" - avail_types "github.com/ethereum-optimism/optimism/op-avail/types" + "github.com/ethereum-optimism/optimism/op-avail/internal/types" "github.com/vedhavyas/go-subkey" ) // GetBlock: To fetch the extrinsic Data from block's extrinsic by hash -func GetBlockExtrinsicData(avail_blk_ref avail_types.AvailBlockRef) ([]byte, error) { +func GetBlockExtrinsicData(avail_blk_ref types.AvailBlockRef) ([]byte, error) { var config config.Config err := config.GetConfig("../op-avail/config.json") @@ -33,7 +33,7 @@ func GetBlockExtrinsicData(avail_blk_ref avail_types.AvailBlockRef) ([]byte, err } // Converting this string type hash into types.hash type - blk_hash, err := types.NewHashFromHexString(Hash) + blk_hash, err := gsrpc_types.NewHashFromHexString(Hash) if err != nil { return []byte{}, fmt.Errorf("unable to convert string hash into types.hash, error:%v", err) } diff --git a/op-avail/services/submitDataAndWatch.go b/op-avail/internal/services/submitDataAndWatch.go similarity index 67% rename from op-avail/services/submitDataAndWatch.go rename to op-avail/internal/services/submitDataAndWatch.go index 50cdba44c81..d27a15a6357 100644 --- a/op-avail/services/submitDataAndWatch.go +++ b/op-avail/internal/services/submitDataAndWatch.go @@ -7,14 +7,14 @@ import ( gsrpc "github.com/centrifuge/go-substrate-rpc-client/v4" "github.com/centrifuge/go-substrate-rpc-client/v4/signature" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" + gsrpc_types "github.com/centrifuge/go-substrate-rpc-client/v4/types" "github.com/ethereum-optimism/optimism/op-avail/internal/config" + "github.com/ethereum-optimism/optimism/op-avail/internal/types" "github.com/ethereum-optimism/optimism/op-avail/internal/utils" - avail_types "github.com/ethereum-optimism/optimism/op-avail/types" ) // submitData creates a transaction and makes a Avail data submission -func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { +func SubmitDataAndWatch(data []byte) (types.AvailBlockRef, error) { var config config.Config err := config.GetConfig("../op-avail/config.json") @@ -30,13 +30,13 @@ func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { api, err := gsrpc.NewSubstrateAPI(ApiURL) if err != nil { fmt.Printf("cannot create api: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } meta, err := api.RPC.State.GetMetadataLatest() if err != nil { fmt.Printf("cannot get metadata: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } appID := 0 @@ -45,56 +45,56 @@ func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { appID = AppID } - c, err := types.NewCall(meta, "DataAvailability.submit_data", types.NewBytes([]byte(data))) + c, err := gsrpc_types.NewCall(meta, "DataAvailability.submit_data", gsrpc_types.NewBytes([]byte(data))) if err != nil { fmt.Printf("cannot create new call: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } // Create the extrinsic - ext := types.NewExtrinsic(c) + ext := gsrpc_types.NewExtrinsic(c) genesisHash, err := api.RPC.Chain.GetBlockHash(0) if err != nil { fmt.Printf("cannot get block hash: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } rv, err := api.RPC.State.GetRuntimeVersionLatest() if err != nil { fmt.Printf("cannot get runtime version: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } keyringPair, err := signature.KeyringPairFromSecret(Seed, 42) if err != nil { fmt.Printf("cannot create LeyPair: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } - key, err := types.CreateStorageKey(meta, "System", "Account", keyringPair.PublicKey) + key, err := gsrpc_types.CreateStorageKey(meta, "System", "Account", keyringPair.PublicKey) if err != nil { fmt.Printf("cannot create storage key: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } - var accountInfo types.AccountInfo + var accountInfo gsrpc_types.AccountInfo ok, err := api.RPC.State.GetStorageLatest(key, &accountInfo) if err != nil || !ok { fmt.Printf("cannot get latest storage: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } nonce := utils.GetAccountNonce(uint32(accountInfo.Nonce)) //fmt.Println("Nonce from localDatabase:", nonce, " :::::::: from acountInfo:", accountInfo.Nonce) - o := types.SignatureOptions{ + o := gsrpc_types.SignatureOptions{ BlockHash: genesisHash, - Era: types.ExtrinsicEra{IsMortalEra: false}, + Era: gsrpc_types.ExtrinsicEra{IsMortalEra: false}, GenesisHash: genesisHash, - Nonce: types.NewUCompactFromUInt(uint64(nonce)), + Nonce: gsrpc_types.NewUCompactFromUInt(uint64(nonce)), SpecVersion: rv.SpecVersion, - Tip: types.NewUCompactFromUInt(0), - AppID: types.NewUCompactFromUInt(uint64(appID)), + Tip: gsrpc_types.NewUCompactFromUInt(0), + AppID: gsrpc_types.NewUCompactFromUInt(uint64(appID)), TransactionVersion: rv.TransactionVersion, } @@ -102,14 +102,14 @@ func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { err = ext.Sign(keyringPair, o) if err != nil { fmt.Printf("cannot sign: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } // Send the extrinsic sub, err := api.RPC.Author.SubmitAndWatchExtrinsic(ext) if err != nil { fmt.Printf("cannot submit extrinsic: error:%v", err) - return avail_types.AvailBlockRef{}, err + return types.AvailBlockRef{}, err } fmt.Println("Data of lenght :", len(data), "submitted by op-stack with address ", keyringPair.Address, " using appID ", appID) @@ -121,11 +121,11 @@ func SubmitDataAndWatch(data []byte) (avail_types.AvailBlockRef, error) { case status := <-sub.Chan(): if status.IsFinalized { fmt.Printf("Txn inside finalized block %v\n", status.AsFinalized.Hex()) - return avail_types.AvailBlockRef{BlockHash: string(status.AsFinalized.Hex()), Sender: keyringPair.Address, Nonce: o.Nonce.Int64()}, nil + return types.AvailBlockRef{BlockHash: string(status.AsFinalized.Hex()), Sender: keyringPair.Address, Nonce: o.Nonce.Int64()}, nil } case <-timeout: fmt.Printf("timeout of 100 seconds reached without getting finalized status for extrinsic") - return avail_types.AvailBlockRef{}, errors.New("Timitout before getting finalized status") + return types.AvailBlockRef{}, errors.New("Timitout before getting finalized status") } } } diff --git a/op-avail/types/availBlockRef.go b/op-avail/internal/types/availBlockRef.go similarity index 97% rename from op-avail/types/availBlockRef.go rename to op-avail/internal/types/availBlockRef.go index 6fed9922567..20a30e7ca94 100644 --- a/op-avail/types/availBlockRef.go +++ b/op-avail/internal/types/availBlockRef.go @@ -1,4 +1,4 @@ -package avail_types +package types import ( "encoding/json" diff --git a/op-node/rollup/derive/calldata_source.go b/op-node/rollup/derive/calldata_source.go index 04d41449880..8985f9d264e 100644 --- a/op-node/rollup/derive/calldata_source.go +++ b/op-node/rollup/derive/calldata_source.go @@ -11,9 +11,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - avail "github.com/ethereum-optimism/optimism/op-avail/services" - - avail_types "github.com/ethereum-optimism/optimism/op-avail/types" + avail "github.com/ethereum-optimism/optimism/op-avail/avail" "github.com/ethereum-optimism/optimism/op-node/eth" "github.com/ethereum-optimism/optimism/op-node/rollup" @@ -124,20 +122,13 @@ func DataFromEVMTransactions(config *rollup.Config, batcherAddr common.Address, continue // not an authorized batch submitter, ignore } - //Getting Avail block reference from callData - avail_blk_ref := avail_types.AvailBlockRef{} - err = avail_blk_ref.UnmarshalFromBinary(tx.Data()) - if err != nil { - panic(fmt.Errorf("Failed to unmarshal the ethereum trxn data to avail block refrence, error:%v", err)) - } - fmt.Printf("Avail Block Reference: %+v", avail_blk_ref) - - trxn_data, err := avail.GetBlockExtrinsicData(avail_blk_ref) + // Get Transaction data from da reference + txData, err := avail.GetTxDataByDARef(tx.Data()) if err != nil { - panic(fmt.Errorf("Failed to get block extrinsic data, error:%v", err)) + panic(err) } - out = append(out, trxn_data) + out = append(out, txData) } } return out diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go index ba2c5fe095c..d01cadb2ca9 100644 --- a/op-service/txmgr/txmgr.go +++ b/op-service/txmgr/txmgr.go @@ -10,7 +10,7 @@ import ( "sync/atomic" "time" - avail "github.com/ethereum-optimism/optimism/op-avail/services" + avail "github.com/ethereum-optimism/optimism/op-avail/avail" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -159,23 +159,13 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ // To pass the data on avail for batcher if candidate.To.Hex() == "0xFf00000000000000000000000000000000042069" { - fmt.Println("Working on batch submission for avail") - - // Submitting data to Avail - avail_Blk_Ref, err := avail.SubmitDataAndWatch(candidate.TxData) - if err != nil { - panic(fmt.Sprintf("cannot submit data:%v", err)) - } - - fmt.Printf("Avail Block Reference: %+v", avail_Blk_Ref) - - ref_bytes_Data, err := avail_Blk_Ref.MarshalToBinary() + // Submit transaction data on Data and get reference to submit on ethereum layer + refData, err := avail.SubmitTxDataAndGetRef(candidate.TxData) if err != nil { - panic(fmt.Sprintf("cannot get the binary form of avail block reference:%v", err)) + panic(err) } - //To add reference on ethereum layer - candidate = TxCandidate{TxData: ref_bytes_Data, To: candidate.To, GasLimit: candidate.GasLimit} + candidate = TxCandidate{TxData: refData, To: candidate.To, GasLimit: candidate.GasLimit} } tx, err := m.craftTx(ctx, candidate) From 0d7277351d32ad899877c5b87cad166bcc6e8e36 Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Fri, 22 Sep 2023 19:22:17 +0530 Subject: [PATCH 05/13] Avail:4:Added DA config variable --- op-avail/avail/submitTxDataAndGetRef.go | 5 +++++ op-batcher/batcher/driver.go | 14 ++++++++++++++ op-chain-ops/genesis/config.go | 4 ++++ op-node/rollup/derive/calldata_source.go | 16 ++++++++++------ op-node/rollup/types.go | 3 +++ op-service/txmgr/txmgr.go | 12 ------------ 6 files changed, 36 insertions(+), 18 deletions(-) diff --git a/op-avail/avail/submitTxDataAndGetRef.go b/op-avail/avail/submitTxDataAndGetRef.go index ee768b08928..1e7cdc95e28 100644 --- a/op-avail/avail/submitTxDataAndGetRef.go +++ b/op-avail/avail/submitTxDataAndGetRef.go @@ -9,6 +9,11 @@ import ( func SubmitTxDataAndGetRef(TxData []byte) ([]byte, error) { fmt.Println("Working on batch submission for avail") + //Checking for the size of TxData + if len(TxData) >= 512000 { + return []byte{}, fmt.Errorf("size of TxData is more than 512KB, it is higher than a single data submit transaction supports on avail") + } + // Submitting data to Avail avail_Blk_Ref, err := service.SubmitDataAndWatch(TxData) if err != nil { diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 312c761163d..e8ec73a3308 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -10,6 +10,8 @@ import ( "sync" "time" + avail "github.com/ethereum-optimism/optimism/op-avail/avail" + "github.com/ethereum-optimism/optimism/op-batcher/metrics" "github.com/ethereum-optimism/optimism/op-node/eth" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" @@ -393,6 +395,18 @@ func (l *BatchSubmitter) sendTransaction(txdata txData, queue *txmgr.Queue[txDat TxData: data, GasLimit: intrinsicGas, } + + if l.Rollup.DAEnabled { + // Submit transaction data on Data and get reference to submit on ethereum layer + refData, err := avail.SubmitTxDataAndGetRef(data) + if err != nil { + l.log.Error("failed to submit txData on avail, error:", err) + return + } + //To add reference on ethereum layer + candidate.TxData = refData + } + queue.Send(txdata, candidate, receiptsCh) } diff --git a/op-chain-ops/genesis/config.go b/op-chain-ops/genesis/config.go index 6b4952ee9ec..2d6823ee184 100644 --- a/op-chain-ops/genesis/config.go +++ b/op-chain-ops/genesis/config.go @@ -128,6 +128,9 @@ type DeployConfig struct { EIP1559Denominator uint64 `json:"eip1559Denominator"` FundDevAccounts bool `json:"fundDevAccounts"` + + //Flag for check DA enabled + EnableDA bool `json:"enableDA"` } // Check will ensure that the config is sane and return an error when it is not @@ -373,6 +376,7 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas DepositContractAddress: d.OptimismPortalProxy, L1SystemConfigAddress: d.SystemConfigProxy, RegolithTime: d.RegolithTime(l1StartBlock.Time()), + DAEnabled: d.EnableDA, //flag to check DA enabled }, nil } diff --git a/op-node/rollup/derive/calldata_source.go b/op-node/rollup/derive/calldata_source.go index 8985f9d264e..6c674b51dad 100644 --- a/op-node/rollup/derive/calldata_source.go +++ b/op-node/rollup/derive/calldata_source.go @@ -122,13 +122,17 @@ func DataFromEVMTransactions(config *rollup.Config, batcherAddr common.Address, continue // not an authorized batch submitter, ignore } - // Get Transaction data from da reference - txData, err := avail.GetTxDataByDARef(tx.Data()) - if err != nil { - panic(err) + if config.DAEnabled { + // Get Transaction data from da reference + txData, err := avail.GetTxDataByDARef(tx.Data()) + if err != nil { + log.Error("unable to retrieve the data back from Avail , error:", err) + panic("Failed to get TxData from Avail block ref") + } + out = append(out, txData) + } else { + out = append(out, tx.Data()) } - - out = append(out, txData) } } return out diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go index 2f82a17296d..289402882d2 100644 --- a/op-node/rollup/types.go +++ b/op-node/rollup/types.go @@ -84,6 +84,9 @@ type Config struct { DepositContractAddress common.Address `json:"deposit_contract_address"` // L1 System Config Address L1SystemConfigAddress common.Address `json:"l1_system_config_address"` + + //Flag to define the DA property enabled + DAEnabled bool `json:"da_enabled"` } // ValidateL1Config checks L1 config variables for errors. diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go index d01cadb2ca9..ae6d5319177 100644 --- a/op-service/txmgr/txmgr.go +++ b/op-service/txmgr/txmgr.go @@ -10,7 +10,6 @@ import ( "sync/atomic" "time" - avail "github.com/ethereum-optimism/optimism/op-avail/avail" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -157,17 +156,6 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ defer cancel() } - // To pass the data on avail for batcher - if candidate.To.Hex() == "0xFf00000000000000000000000000000000042069" { - // Submit transaction data on Data and get reference to submit on ethereum layer - refData, err := avail.SubmitTxDataAndGetRef(candidate.TxData) - if err != nil { - panic(err) - } - //To add reference on ethereum layer - candidate = TxCandidate{TxData: refData, To: candidate.To, GasLimit: candidate.GasLimit} - } - tx, err := m.craftTx(ctx, candidate) if err != nil { return nil, fmt.Errorf("failed to create the tx: %w", err) From 378bb1182e53a8126aa083380e8a40eced9fb232 Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Mon, 25 Sep 2023 16:54:02 +0530 Subject: [PATCH 06/13] Avail:5:optimisation and clean up --- op-avail/avail/getTxDataByDARef.go | 7 ++++--- op-avail/avail/submitTxDataAndGetRef.go | 9 +++++---- op-avail/internal/config/config.go | 7 +++---- .../services/getBlockExtrinsicData.go | 19 ++++++++++++------- .../internal/services/submitDataAndWatch.go | 10 ++++++---- op-batcher/batcher/driver.go | 4 ++-- op-node/rollup/derive/calldata_source.go | 4 ++-- .../deploy-config/getting-started.json | 19 +++---------------- 8 files changed, 37 insertions(+), 42 deletions(-) diff --git a/op-avail/avail/getTxDataByDARef.go b/op-avail/avail/getTxDataByDARef.go index 6575c17670e..7edd74576f6 100644 --- a/op-avail/avail/getTxDataByDARef.go +++ b/op-avail/avail/getTxDataByDARef.go @@ -5,18 +5,19 @@ import ( service "github.com/ethereum-optimism/optimism/op-avail/internal/services" types "github.com/ethereum-optimism/optimism/op-avail/internal/types" + "github.com/ethereum/go-ethereum/log" ) -func GetTxDataByDARef(RefData []byte) ([]byte, error) { +func GetTxDataByDARef(RefData []byte, l log.Logger) ([]byte, error) { //Getting Avail block reference from callData avail_blk_ref := types.AvailBlockRef{} err := avail_blk_ref.UnmarshalFromBinary(RefData) if err != nil { return []byte{}, fmt.Errorf("Failed to unmarshal the ethereum trxn data to avail block refrence, error:%v", err) } - fmt.Printf("Avail Block Reference: %+v", avail_blk_ref) + l.Info("Avail Block Reference:", "Ref", avail_blk_ref) - txData, err := service.GetBlockExtrinsicData(avail_blk_ref) + txData, err := service.GetBlockExtrinsicData(avail_blk_ref, l) if err != nil { return []byte{}, fmt.Errorf("Failed to get block extrinsic data, error:%v", err) } diff --git a/op-avail/avail/submitTxDataAndGetRef.go b/op-avail/avail/submitTxDataAndGetRef.go index 1e7cdc95e28..915d47fbfc0 100644 --- a/op-avail/avail/submitTxDataAndGetRef.go +++ b/op-avail/avail/submitTxDataAndGetRef.go @@ -4,10 +4,11 @@ import ( "fmt" service "github.com/ethereum-optimism/optimism/op-avail/internal/services" + "github.com/ethereum/go-ethereum/log" ) -func SubmitTxDataAndGetRef(TxData []byte) ([]byte, error) { - fmt.Println("Working on batch submission for avail") +func SubmitTxDataAndGetRef(TxData []byte, l log.Logger) ([]byte, error) { + l.Info("Working on batch submission for avail") //Checking for the size of TxData if len(TxData) >= 512000 { @@ -15,12 +16,12 @@ func SubmitTxDataAndGetRef(TxData []byte) ([]byte, error) { } // Submitting data to Avail - avail_Blk_Ref, err := service.SubmitDataAndWatch(TxData) + avail_Blk_Ref, err := service.SubmitDataAndWatch(TxData, l) if err != nil { return []byte{}, fmt.Errorf("cannot submit data:%v", err) } - fmt.Printf("Avail Block Reference: %+v", avail_Blk_Ref) + l.Info("Avail Block Reference:", "Ref", avail_Blk_Ref) ref_bytes_Data, err := avail_Blk_Ref.MarshalToBinary() if err != nil { diff --git a/op-avail/internal/config/config.go b/op-avail/internal/config/config.go index bc6892839c1..7f6f0804408 100644 --- a/op-avail/internal/config/config.go +++ b/op-avail/internal/config/config.go @@ -7,10 +7,9 @@ import ( ) type Config struct { - Seed string `json:"seed"` - ApiURL string `json:"api_url"` - AppID int `json:"app_id"` - Address string `json:"address"` + Seed string `json:"seed"` + ApiURL string `json:"api_url"` + AppID int `json:"app_id"` } func (c *Config) GetConfig(configFileName string) error { diff --git a/op-avail/internal/services/getBlockExtrinsicData.go b/op-avail/internal/services/getBlockExtrinsicData.go index 95f9161c25e..3b8b69b324b 100644 --- a/op-avail/internal/services/getBlockExtrinsicData.go +++ b/op-avail/internal/services/getBlockExtrinsicData.go @@ -9,15 +9,18 @@ import ( "github.com/centrifuge/go-substrate-rpc-client/v4/types/codec" "github.com/ethereum-optimism/optimism/op-avail/internal/config" "github.com/ethereum-optimism/optimism/op-avail/internal/types" + "github.com/ethereum/go-ethereum/log" "github.com/vedhavyas/go-subkey" ) // GetBlock: To fetch the extrinsic Data from block's extrinsic by hash -func GetBlockExtrinsicData(avail_blk_ref types.AvailBlockRef) ([]byte, error) { +func GetBlockExtrinsicData(avail_blk_ref types.AvailBlockRef, l log.Logger) ([]byte, error) { + // Load config var config config.Config err := config.GetConfig("../op-avail/config.json") if err != nil { + l.Error("Unable to create config variable for op-avail") panic(fmt.Sprintf("cannot get config:%v", err)) } @@ -27,35 +30,37 @@ func GetBlockExtrinsicData(avail_blk_ref types.AvailBlockRef) ([]byte, error) { Address := avail_blk_ref.Sender Nonce := avail_blk_ref.Nonce + //Creating new substrate api api, err := gsrpc.NewSubstrateAPI(ApiURL) if err != nil { return []byte{}, fmt.Errorf("cannot create api:%w", err) } - // Converting this string type hash into types.hash type + // Converting this string type into gsrpc_types.hash type blk_hash, err := gsrpc_types.NewHashFromHexString(Hash) if err != nil { return []byte{}, fmt.Errorf("unable to convert string hash into types.hash, error:%v", err) } + // Fetching block based on block hash avail_blk, err := api.RPC.Chain.GetBlock(blk_hash) if err != nil { return []byte{}, fmt.Errorf("cannot get block for hash:%v and getting error:%v", Hash, err) } + //Extracting the required extrinsic according to the reference for _, ext := range avail_blk.Block.Extrinsics { - // these values below are specific indexes only for data submission, differs with each extrinsic + //Extracting sender address for extrinsic ext_Addr, err := subkey.SS58Address(ext.Signature.Signer.AsID.ToBytes(), 42) if err != nil { - fmt.Printf("error in creating address from accountId, error:%v", err) + l.Error("unable to get sender address from extrinsic", "err", err) } - fmt.Println("ext_Addr=", ext_Addr, " Address=", Address, " ext_Nonce=", ext.Signature.Nonce.Int64(), " Nonce=", Nonce) - if ext_Addr == Address && ext.Signature.Nonce.Int64() == Nonce && ext.Signature.AppID.Int64() == 1 && ext.Method.CallIndex.SectionIndex == 29 && ext.Method.CallIndex.MethodIndex == 1 { + if ext_Addr == Address && ext.Signature.Nonce.Int64() == Nonce { args := ext.Method.Args var data []byte err = codec.Decode(args, &data) if err != nil { - fmt.Printf("Error in decoding args :%v", err) + return []byte{}, fmt.Errorf("Unable to decode the extrinsic data by address: %v with nonce: %v", Address, Nonce) } return data, nil } diff --git a/op-avail/internal/services/submitDataAndWatch.go b/op-avail/internal/services/submitDataAndWatch.go index d27a15a6357..5ad068ecffd 100644 --- a/op-avail/internal/services/submitDataAndWatch.go +++ b/op-avail/internal/services/submitDataAndWatch.go @@ -11,14 +11,17 @@ import ( "github.com/ethereum-optimism/optimism/op-avail/internal/config" "github.com/ethereum-optimism/optimism/op-avail/internal/types" "github.com/ethereum-optimism/optimism/op-avail/internal/utils" + "github.com/ethereum/go-ethereum/log" ) // submitData creates a transaction and makes a Avail data submission -func SubmitDataAndWatch(data []byte) (types.AvailBlockRef, error) { +func SubmitDataAndWatch(data []byte, l log.Logger) (types.AvailBlockRef, error) { + //Load variables var config config.Config err := config.GetConfig("../op-avail/config.json") if err != nil { + l.Error("Unable to create config variable for op-avail") panic(fmt.Sprintf("cannot get config:%v", err)) } @@ -27,6 +30,7 @@ func SubmitDataAndWatch(data []byte) (types.AvailBlockRef, error) { Seed := config.Seed AppID := config.AppID + //Creating new substrate api api, err := gsrpc.NewSubstrateAPI(ApiURL) if err != nil { fmt.Printf("cannot create api: error:%v", err) @@ -112,7 +116,7 @@ func SubmitDataAndWatch(data []byte) (types.AvailBlockRef, error) { return types.AvailBlockRef{}, err } - fmt.Println("Data of lenght :", len(data), "submitted by op-stack with address ", keyringPair.Address, " using appID ", appID) + l.Info("Tx batch is submitted to Avail", "length", len(data), "address", keyringPair.Address, "appID", appID) defer sub.Unsubscribe() timeout := time.After(100 * time.Second) @@ -120,11 +124,9 @@ func SubmitDataAndWatch(data []byte) (types.AvailBlockRef, error) { select { case status := <-sub.Chan(): if status.IsFinalized { - fmt.Printf("Txn inside finalized block %v\n", status.AsFinalized.Hex()) return types.AvailBlockRef{BlockHash: string(status.AsFinalized.Hex()), Sender: keyringPair.Address, Nonce: o.Nonce.Int64()}, nil } case <-timeout: - fmt.Printf("timeout of 100 seconds reached without getting finalized status for extrinsic") return types.AvailBlockRef{}, errors.New("Timitout before getting finalized status") } } diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index e8ec73a3308..3539d5d83ae 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -398,9 +398,9 @@ func (l *BatchSubmitter) sendTransaction(txdata txData, queue *txmgr.Queue[txDat if l.Rollup.DAEnabled { // Submit transaction data on Data and get reference to submit on ethereum layer - refData, err := avail.SubmitTxDataAndGetRef(data) + refData, err := avail.SubmitTxDataAndGetRef(data, l.log) if err != nil { - l.log.Error("failed to submit txData on avail, error:", err) + l.log.Error("failed to submit txData on avail", "err", err) return } //To add reference on ethereum layer diff --git a/op-node/rollup/derive/calldata_source.go b/op-node/rollup/derive/calldata_source.go index 6c674b51dad..c297ac4eba1 100644 --- a/op-node/rollup/derive/calldata_source.go +++ b/op-node/rollup/derive/calldata_source.go @@ -124,9 +124,9 @@ func DataFromEVMTransactions(config *rollup.Config, batcherAddr common.Address, if config.DAEnabled { // Get Transaction data from da reference - txData, err := avail.GetTxDataByDARef(tx.Data()) + txData, err := avail.GetTxDataByDARef(tx.Data(), log) if err != nil { - log.Error("unable to retrieve the data back from Avail , error:", err) + log.Error("unable to retrieve the data back from Avail", "index", j, "err", err) panic("Failed to get TxData from Avail block ref") } out = append(out, txData) diff --git a/packages/contracts-bedrock/deploy-config/getting-started.json b/packages/contracts-bedrock/deploy-config/getting-started.json index 967b35f7cf9..6702e88cb00 100644 --- a/packages/contracts-bedrock/deploy-config/getting-started.json +++ b/packages/contracts-bedrock/deploy-config/getting-started.json @@ -1,57 +1,44 @@ { "numDeployConfirmations": 1, - "finalSystemOwner": "ADMIN", "portalGuardian": "ADMIN", "controller": "ADMIN", - "l1StartingBlockTag": "BLOCKHASH", - "l1ChainID": 5, "l2ChainID": 42069, "l2BlockTime": 2, - "maxSequencerDrift": 600, "sequencerWindowSize": 3600, "channelTimeout": 300, - "p2pSequencerAddress": "SEQUENCER", "batchInboxAddress": "0xff00000000000000000000000000000000042069", "batchSenderAddress": "BATCHER", - "l2OutputOracleSubmissionInterval": 120, "l2OutputOracleStartingBlockNumber": 0, "l2OutputOracleStartingTimestamp": TIMESTAMP, - "l2OutputOracleProposer": "PROPOSER", "l2OutputOracleChallenger": "ADMIN", - "finalizationPeriodSeconds": 12, - "proxyAdminOwner": "ADMIN", "baseFeeVaultRecipient": "ADMIN", "l1FeeVaultRecipient": "ADMIN", "sequencerFeeVaultRecipient": "ADMIN", - "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "baseFeeVaultWithdrawalNetwork": 0, "l1FeeVaultWithdrawalNetwork": 0, "sequencerFeeVaultWithdrawalNetwork": 0, - "gasPriceOracleOverhead": 2100, "gasPriceOracleScalar": 1000000, - "enableGovernance": true, "governanceTokenSymbol": "OP", "governanceTokenName": "Optimism", "governanceTokenOwner": "ADMIN", - "l2GenesisBlockGasLimit": "0x1c9c380", "l2GenesisBlockBaseFeePerGas": "0x3b9aca00", "l2GenesisRegolithTimeOffset": "0x0", - "eip1559Denominator": 50, - "eip1559Elasticity": 10 -} + "eip1559Elasticity": 10, + "enableDA": "true" +} \ No newline at end of file From bbb4edb2c27f0e9b23fe08933911e2d6b9dd9d65 Mon Sep 17 00:00:00 2001 From: Rishabh Agrawal Date: Tue, 7 Nov 2023 15:34:05 +0530 Subject: [PATCH 07/13] Add the getting started document Guide to start with op-stack with avail as DA --- ...mism chain using avail-op-stack-adapter.md | 531 ++++++++++++++++++ 1 file changed, 531 insertions(+) create mode 100644 op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md diff --git a/op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md b/op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md new file mode 100644 index 00000000000..3dbfa990461 --- /dev/null +++ b/op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md @@ -0,0 +1,531 @@ +# Steps to run your own avail-optimism chain using avail-op-stack-adapter + +# Overview + +Hello! This guide is meant to help you kick off your Avail-OP Stack journey by taking you through the process of spinning up your very own avail-optimism chain on the Ethereum Goerli testnet as settlement layer and Avail kate testnet as Data Avalibility layer. + +# **[#](https://stack.optimism.io/docs/build/getting-started/#know-before-you-go)**Know before you go + +Before we kick off, note that this is a relatively long tutorial! You should prepare to set aside an hour or two to get everything running. Here’s an itemized list of what we’re about to do: + +1. Install dependencies +2. Build the source code +3. Generate and fund accounts and private keys +4. Configure your network +5. Deploy the L1 contracts +6. Initialize op-geth +7. Run op-geth +8. Run op-node +9. Get some Goerli ETH on your L2 +10. Send some test transactions +11. Celebrate! + +# **[#](https://stack.optimism.io/docs/build/getting-started/#prerequisites)**Prerequisites + +You’ll need the following software installed to follow this tutorial: + +- **[Git](https://git-scm.com/)** +- **[Go](https://go.dev/)** +- **[Node](https://nodejs.org/en/)** +- **[Pnpm](https://classic.yarnpkg.com/lang/en/docs/install/)** +- **[Foundry](https://github.com/foundry-rs/foundry#installation)** +- **[Make](https://linux.die.net/man/1/make)** +- **[jq](https://github.com/jqlang/jq)** +- **[direnv](https://direnv.net/)** + +This tutorial was checked on: + +| Software | Version | Installation command(s) | +| --- | --- | --- | +| Ubuntu | 20.04 LTS | | +| git, curl, jq, and make | OS default | sudo apt install -y git curl make jq | +| Go | 1.20 | sudo apt updatewget https://go.dev/dl/go1.20.linux-amd64.tar.gztar xvzf go1.20.linux-amd64.tar.gzsudo cp go/bin/go /usr/bin/gosudo mv go /usr/libecho export GOROOT=/usr/lib/go >> ~/.bashrc | +| Node | 16.19.0 | curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -sudo apt-get install -y nodejs npm | +| pnpm | 8.5.6 | sudo npm install -g pnpm | +| Foundry | 0.2.0 | yarn install:foundry | + +# **[#](https://stack.optimism.io/docs/build/getting-started/#build-the-source-code)**Build the Source Code + +We’re going to be spinning up an EVM Rollup from the Avail-OP Stack source code. The OP Stack source code is split between two repositories, the **[Avail-OP-Stack Adapter](https://github.com/availproject/avail-op-stack-adapter) monorepo** and the **`[op-geth`](https://github.com/ethereum-optimism/op-geth)** repository. + +# **[#](https://stack.optimism.io/docs/build/getting-started/#build-the-optimism-monorepo)**Build the Optimism Monorepo + +1. Clone the [Avail-OP-Stack Adapter](https://github.com/availproject/avail-optimism). + + ```bash + cd ~ + git clone https://github.com/availproject/avail-op-stack-adapter.git + ``` + +2. Enter the Avail-OP-Stack Monorepo. + + ```bash + cd avail-op-stack-adapter + ``` + +3. Install required modules. This is a slow process, while it is running you can already start building `op-geth`, as shown below. + + ```bash + pnpm install + ``` + +4. Build the various packages inside of the Optimism Monorepo. + + ```bash + make op-node op-batcher op-proposer + pnpm build + ``` + + +# **[#](https://stack.optimism.io/docs/build/getting-started/#build-op-geth)**Build op-geth + +1. Clone **`[op-geth`](https://github.com/ethereum-optimism/op-geth)** : + + ```bash + cd ~ + git clone https://github.com/ethereum-optimism/op-geth.git + ``` + +2. Enter `op-geth`: + + ```bash + cd op-geth + ``` + +3. Build `op-geth`: + + ```bash + make geth + ``` + + +# **[#](https://stack.optimism.io/docs/build/getting-started/#get-access-to-a-goerli-node)**Get access to a Goerli node + +Since we’re deploying our OP Stack chain to Goerli, you’ll need to have access to a Goerli L1 node. You can either use a node provider like **[Alchemy](https://www.alchemy.com/)** (easier) or **[run your own Goerli node](https://notes.ethereum.org/@launchpad/goerli)** (harder). + +# **[#](https://stack.optimism.io/docs/build/getting-started/#generate-some-keys)**Generate some keys + +You’ll need four accounts and their private keys when setting up the chain: + +- The `Admin` account which has the ability to upgrade contracts. +- The `Batcher` account which publishes Sequencer transaction data to L1. +- The `Proposer` account which publishes L2 transaction results to L1. +- The `Sequencer` account which signs blocks on the p2p network. + +You can generate all of these keys with the `rekey` tool in the `contracts-bedrock` package. + +1. Enter the Avail-Optimism Monorepo: + + ```bash + cd avail-op-stack-adapter + ``` + +2. Move into the `contracts-bedrock` package: + + ```bash + cd packages/contracts-bedrock + ``` + +3. Use `cast wallet` to generate new accounts + + ```bash + echo "Admin:" + cast wallet new + echo "Proposer:" + cast wallet new + echo "Batcher:" + cast wallet new + echo "Sequencer:" + cast wallet new + ``` + + +You should get an output like the following: + +``` +Admin: +Successfully created new keypair. +Address: 0x9f92bdF0db69264462FC305913960Edfcc7a7c7F +Private key: 0x30e66956e1a12b81f0f2cfb982286b2f566eb73649833831d9f80b12f8fa183c +Proposer: +Successfully created new keypair. +Address: 0x31dE9B6473fc47af36ec23878bA34824B9F4AB30 +Private key: 0x8bd1c8dfffef880f8f9ab8162f97ccd119c1aac28fe00dacf919459f88e0f37d +Batcher: +Successfully created new keypair. +Address: 0x6A3DC843843139f17Fcf04C057bb536A421DC9c6 +Private key: 0x3ce44144b7fde797a28f4e47b210a4d42c3a3b642e538b54458cba2740db5ac2 +Sequencer: +Successfully created new keypair. +Address: 0x98C6cadB1fe77aBB7bD968fC3E9b206111e72848 +Private key: 0x3f4241229bb6f155140d98e0f5dd2aad7ae983f5af5d61555d05eb8e5d9514db +``` + +Save these accounts and their respective private keys somewhere, you’ll need them later. Fund the `Admin` address with a small amount of Goerli ETH as we’ll use that account to deploy our smart contracts. You’ll also need to fund the `Proposer` and `Batcher` address — note that the `Batcher` burns through the most ETH because it publishes transaction data to L1. + +Recommended funding amounts are as follows: + +- `Admin` — 2 ETH +- `Proposer` — 5 ETH +- `Batcher` — 10 ETH + +**Not for production deployments** + +The `cast wallet new` tool is *not* designed for production deployments. If you are deploying an Avail-Optimism Stack based chain into production, you should likely be using a combination of hardware security modules and hardware wallets. + +# **[#](https://stack.optimism.io/docs/build/getting-started/#configure-your-network)**Configure your network + +Once you’ve built both repositories, you’ll need head back to the Optimism Monorepo to set up the configuration for your chain. Currently, chain configuration lives inside of the **`[contracts-bedrock](https://github.com/availproject/avail-optimism/tree/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock)` [](https://github.com/ethereum-optimism/optimism/tree/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock)**package. + +1. Enter the Avail-OP-Stack Monorepo: + + ```bash + cd ~/avail-op-stack-adapter + ``` + +2. Move into the `contracts-bedrock` package: + + ```bash + cd packages/contracts-bedrock + ``` + +3. Inside of `contracts-bedrock`, copy the environment file + + ``` + cp .envrc.example .envrc + ``` + +4. Fill out the environment variables inside of that file: + - `ETH_RPC_URL` — URL for your L1 node. + - `PRIVATE_KEY` — Private key of the `Admin` account. + - `DEPLOYMENT_CONTEXT` - Name of the network, should be "avail-optimism" +5. Pull the environment variables into context using `direnv` + + ```bash + direnv allow . + ``` + + If you need to install `direnv`, **[make sure you also modify the shell configuration](https://direnv.net/docs/hook.html)**. + +6. Before we can create our configuration file, we’ll need to pick an L1 block to serve as the starting point for our Rollup. It’s best to use a finalized L1 block as our starting block. You can use the `cast` command provided by Foundry to grab all of the necessary information: + + ```bash + cast block finalized --rpc-url $ETH_RPC_URL | grep -E "(timestamp|hash|number)" + ``` + + You’ll get back something that looks like the following: + + ``` + hash 0x784d8e7f0e90969e375c7d12dac7a3df6879450d41b4cb04d4f8f209ff0c4cd9 + number 8482289 + timestamp 1676253324 + ``` + +7. Create a copy of file `deploy-config/getting-started.json` at `deploy-config` named `avail-optimism.json` +8. Fill out the remainder of the pre-populated config file **`deploy-config/avail-optimism.json`**. Use the default values in the config file and make following modifications: + - Replace `"ADMIN"` with the address of the Admin account you generated earlier. + - Replace `"PROPOSER"` with the address of the Proposer account you generated earlier. + - Replace `"BATCHER"` with the address of the Batcher account you generated earlier. + - Replace `"SEQUENCER"` with the address of the Sequencer account you generated earlier. + - Replace `"BLOCKHASH"` with the blockhash you got from the `cast` command. + - Replace `TIMESTAMP` with the timestamp you got from the `cast` command. Note that although all the other fields are strings, this field is a number! Don’t include the quotation marks. +9. Check the value of `enableDA` config variable should be `true` to use Avail chain as DA or you can set it to `false` for using ethereum as DA +10. Move into `op-avail` module + + ```bash + cd ~/avail-op-stack-adapter/op-avail + ``` + +11. Add a `config.json` file to this directory with these variables and change the `seed` and `app_id` according to your avail account + + ``` + { + "seed": "test test test test test test test test test test test avail", + "api_url": "wss://kate.avail.tools:443/ws", + "app_id": 1 + } + ``` + + +# **[#](https://stack.optimism.io/docs/build/getting-started/#deploy-the-l1-contracts)**Deploy the L1 contracts + +Once you’ve configured your network, it’s time to deploy the L1 smart contracts necessary for the functionality of the chain. + +1. Create a `avail-optimism` deployment directory. + + ```bash + mkdir deployments/avail-optimism + ``` + +2. Once you’re ready, deploy the L1 smart contracts. + + ```bash + forge script scripts/Deploy.s.sol:Deploy --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL + forge script scripts/Deploy.s.sol:Deploy --sig 'sync()' --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL + + ``` + + +Contract deployment can take up to 15 minutes. Please wait for all smart contracts to be fully deployed before continuing to the next step. + +# **[#](https://stack.optimism.io/docs/build/getting-started/#generate-the-l2-config-files)**Generate the L2 config files + +We’ve set up the L1 side of things, but now we need to set up the L2 side of things. We do this by generating three important files, a `genesis.json` file, a `rollup.json` configuration file, and a `jwt.txt` **[JSON Web Token](https://jwt.io/introduction)** that allows the `op-node` and `op-geth` to communicate securely. + +1. Head over to the `op-node` package. + + ```bash + cd ~/avail-op-stack-adapter/op-node + ``` + +2. Run the following command, and make sure to replace `` with your L1 RPC URL: + + ```bash + go run cmd/main.go genesis l2 \ + --deploy-config ../packages/contracts-bedrock/deploy-config/avail-optimism.json \ + --deployment-dir ../packages/contracts-bedrock/deployments/avail-optimism/ \ + --outfile.l2 genesis.json \ + --outfile.rollup rollup.json \ + --l1-rpc=$L1_RPC + ``` + + You should then see the `genesis.json` and `rollup.json` files inside the `op-node` package. + +3. Next, generate the `jwt.txt` file with the following command: + + ```bash + openssl rand -hex 32 > jwt.txt + ``` + +4. Finally, we’ll need to copy the `genesis.json` file and `jwt.txt` file into `op-geth` so we can use it to initialize and run `op-geth` in just a minute: + + ```bash + cp genesis.json ~/op-geth + cp jwt.txt ~/op-geth + ``` + + +# **[#](https://stack.optimism.io/docs/build/getting-started/#initialize-op-geth)**Initialize op-geth + +We’re almost ready to run our chain! Now we just need to run a few commands to initialize `op-geth`. We’re going to be running a Sequencer node, so we’ll need to import the `Sequencer` private key that we generated earlier. This private key is what our Sequencer will use to sign new blocks. + +1. Head over to the `op-geth` repository: + + ```bash + cd ~/op-geth + ``` + +2. Create a data directory folder: + + ```bash + mkdir datadir + ``` + +3. Next we need to initialize `op-geth` with the genesis file we generated and copied earlier: + + ```bash + build/bin/geth init --datadir=datadir genesis.json + ``` + + +Everything is now initialized and ready to go! + +# **[#](https://stack.optimism.io/docs/build/getting-started/#run-the-node-software)**Run the node software + +There are four components that need to run for a rollup. The first two, `op-geth` and `op-node`, have to run on every node. The other two, `op-batcher` and `op-proposer`, run only in one place, the sequencer that accepts transactions. + +Set these environment variables for the configuration + +| Variable | Value | +| --- | --- | +| SEQ_KEY | Private key of the Sequencer account | +| BATCHER_KEY | Private key of the Batcher accounts, which should have at least 1 ETH | +| PROPOSER_KEY | Private key of the Proposer account | +| L1_RPC | URL for the L1 (such as Goerli) you're using | +| RPC_KIND | The type of L1 server to which you connect, which can optimize requests. Available options are alchemy, quicknode, parity, nethermind, debug_geth, erigon, basic, and any | +| L2OO_ADDR | The address of the L2OutputOracleProxy, available at ~/optimism/packages/contracts-bedrock/deployments/getting-started/L2OutputOracleProxy.json | + +# **[#](https://stack.optimism.io/docs/build/getting-started/#op-geth)**`op-geth` + +Run `op-geth` with the following commands. + +```bash +cd ~/op-geth + +./build/bin/geth \ + --datadir ./datadir \ + --http \ + --http.corsdomain="*" \ + --http.vhosts="*" \ + --http.addr=0.0.0.0 \ + --http.port=9545 \ + --http.api=web3,debug,eth,txpool,net,engine \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=9546 \ + --ws.origins="*" \ + --ws.api=debug,eth,txpool,net,engine \ + --syncmode=full \ + --gcmode=archive \ + --nodiscover \ + --maxpeers=0 \ + --networkid=42069 \ + --authrpc.vhosts="*" \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=9551 \ + --authrpc.jwtsecret=./jwt.txt \ + --rollup.disabletxpoolgossip=true +``` + +And `op-geth` should be running! You should see some output, but you won’t see any blocks being created yet because `op-geth` is driven by the `op-node`. We’ll need to get that running next. + +**Why archive mode?** + +Archive mode takes more disk storage than full mode. However, using it is important for two reasons: + +- The `op-proposer` requires access to the full state. If at some point `op-proposer` needs to look beyond 256 blocks in the past (8.5 minutes in the default configuration), for example because it was down for that long, we need archive mode. +- The **explorer** requires archive mode. + +### **[#](https://stack.optimism.io/docs/build/getting-started/#reinitializing-op-geth)**Reinitializing op-geth + +There are several situations are indicate database corruption and require you to reset the `op-geth` component: + +- When `op-node` errors out when first started and exits. +- When `op-node` emits this error: + + ``` + stage 0 failed resetting: temp: failed to find the L2 Heads to start from: failed to fetch L2 block by hash 0x0000000000000000000000000000000000000000000000000000000000000000 + ``` + + +This is the reinitialization procedure: + +1. Stop the `op-geth` process. +2. Delete the geth data. + + ```bash + cd ~/op-geth + rm -rf datadir/geth + ``` + +3. Rerun init. + + ```bash + build/bin/geth init --datadir=datadir genesis.json + ``` + +4. Start `op-geth` +5. Start `op-node` + +# **[#](https://stack.optimism.io/docs/build/getting-started/#op-node)**`op-node` + +Once we’ve got `op-geth` running we’ll need to run `op-node`. Like Ethereum, the OP Stack has a consensus client (the `op-node`) and an execution client (`op-geth`). The consensus client drives the execution client over the Engine API. + +```bash +cd ~/optimism/op-node + +./bin/op-node \ + --l2=http://localhost:9551 \ + --l2.jwt-secret=./jwt.txt \ + --sequencer.enabled \ + --sequencer.l1-confs=3 \ + --verifier.l1-confs=3 \ + --rollup.config=./rollup.json \ + --rpc.addr=0.0.0.0 \ + --rpc.port=9547 \ + --p2p.disable \ + --rpc.enable-admin \ + --p2p.sequencer.key=$SEQ_KEY \ + --l1=$L1_RPC \ + --l1.rpckind=$RPC_KIND +``` + +Once you run this command, you should start seeing the `op-node` begin to process all of the L1 information after the starting block number that you picked earlier. Once the `op-node` has enough information, it’ll begin sending Engine API payloads to `op-geth`. At that point, you’ll start to see blocks being created inside of `op-geth`. We’re live! + +**Peer to peer synchronization** + +If you use a chain ID that is also used by others, for example the default (42069), your `op-node` will try to use peer to peer to speed up synchronization. These attempts will fail, because they will be signed with the wrong key, but they will waste time and network resources. + +To avoid this , we start with peer to peer synchronization disabled (`--p2p.disable`). Once you have multiple nodes, it makes sense to use these command line parameters to synchronize between them without getting confused by other blockchains. + +``` + --p2p.static= \ + --p2p.listen.ip=0.0.0.0 \ + --p2p.listen.tcp=9003 \ + --p2p.listen.udp=9003 \ +``` + +# **[#](https://stack.optimism.io/docs/build/getting-started/#op-batcher)**`op-batcher` + +The `op-batcher` takes transactions from the Sequencer and publishes those transactions to L1. Once transactions are on L1, they’re officially part of the Rollup. Without the `op-batcher`, transactions sent to the Sequencer would never make it to L1 and wouldn’t become part of the canonical chain. The `op-batcher` is critical! + +It is best to give the `Batcher` at least 1 Goerli ETH to ensure that it can continue operating without running out of ETH for gas. + +```bash +cd ~/optimism/op-batcher + +./bin/op-batcher \ + --l2-eth-rpc=http://localhost:9545 \ + --rollup-rpc=http://localhost:9547 \ + --poll-interval=10s \ + --sub-safety-margin=6 \ + --num-confirmations=1 \ + --safe-abort-nonce-too-low-count=3 \ + --resubmission-timeout=30s \ + --rpc.addr=0.0.0.0 \ + --rpc.port=9548 \ + --rpc.enable-admin \ + --max-channel-duration=1 \ + --l1-eth-rpc=$L1_RPC \ + --private-key=$BATCHER_KEY +``` + +**Controlling batcher costs** + +The `--max-channel-duration=n` setting tells the batcher to write all the data to L1 every `n` L1 blocks. When it is low, transactions are written to L1 frequently, withdrawals are quick, and other nodes can synchronize from L1 fast. When it is high, transactions are written to L1 less frequently, and the batcher spends less ETH. + +# **[#](https://stack.optimism.io/docs/build/getting-started/#op-proposer)**`op-proposer` + +Now start `op-proposer`, which proposes new state roots. + +```bash +cd ~/optimism/op-proposer + +./bin/op-proposer \ + --poll-interval=12s \ + --rpc.port=9560 \ + --rollup-rpc=http://localhost:9547 \ + --l2oo-address=$L2OO_ADDR \ + --private-key=$PROPOSER_KEY \ + --l1-eth-rpc=$L1_RPC +``` + +# **[#](https://stack.optimism.io/docs/build/getting-started/#get-some-eth-on-your-rollup)**Get some ETH on your Rollup + +Once you’ve connected your wallet, you’ll probably notice that you don’t have any ETH on your Rollup. You’ll need some ETH to pay for gas on your Rollup. The easiest way to deposit Goerli ETH into your chain is to send funds directly to the `L1StandardBridge` contract. You can find the address of the `L1StandardBridge` contract for your chain by looking inside the `deployments` folder in the `contracts-bedrock` package. + +1. First, head over to the `contracts-bedrock` package: + + ```bash + cd ~/optimism/packages/contracts-bedrock + + ``` + + 1 + +2. Grab the address of the proxy to the L1 standard bridge contract: + + ```bash + cat deployments/avail-optimism/L1StandardBridgeProxy.json | jq -r .address + + ``` + + 1 + +3. Grab the L1 bridge proxy contract address and, using the wallet that you want to have ETH on your Rollup, send that address a small amount of ETH on Goerli (0.1 or less is fine). It may take up to 5 minutes for that ETH to appear in your wallet on L2. + +# Hurray! + +**Congratulations, you made it! You now have a complete Avail-OP-Stack based EVM Rollup.** + +You can use this rollup the same way you’d use any other test blockchain. \ No newline at end of file From 17da60bababcb41a69a491ee061758995483bfd5 Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Tue, 28 Nov 2023 12:12:30 +0530 Subject: [PATCH 08/13] fix:enableDA boolean issue --- packages/contracts-bedrock/deploy-config/getting-started.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/deploy-config/getting-started.json b/packages/contracts-bedrock/deploy-config/getting-started.json index 6702e88cb00..39188a12501 100644 --- a/packages/contracts-bedrock/deploy-config/getting-started.json +++ b/packages/contracts-bedrock/deploy-config/getting-started.json @@ -40,5 +40,5 @@ "l2GenesisRegolithTimeOffset": "0x0", "eip1559Denominator": 50, "eip1559Elasticity": 10, - "enableDA": "true" + "enableDA": true } \ No newline at end of file From e72867b06503d80a9b8838e21014b3afbc6baec0 Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Tue, 28 Nov 2023 12:19:11 +0530 Subject: [PATCH 09/13] fix:change in defualt base branch --- nx.json | 58 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/nx.json b/nx.json index 8cafe0ab0e7..886d4006b7a 100644 --- a/nx.json +++ b/nx.json @@ -1,7 +1,7 @@ { - "defaultBase": "develop", + "defaultBase": "avail-develop", "affected": { - "defaultBase": "develop" + "defaultBase": "avail-develop" }, "implicitDependencies": { "nx.json": "*" @@ -30,7 +30,10 @@ "{projectRoot}/tsconfig.json", "{projectRoot}/package.json" ], - "default": ["{projectRoot}/**/*", "configsWorkspace"], + "default": [ + "{projectRoot}/**/*", + "configsWorkspace" + ], "srcGenerated": [ "{projectRoot}/src/contract-artifacts.ts", "{projectRoot}/src/contract-deployed-artifacts.ts" @@ -39,17 +42,34 @@ "{projectRoot}/src/**/*", "!{projectRoot}/src/**/*.spec.ts" ], - "productionContracts": ["{projectRoot}/contracts/**/*"], - "production": ["productionSrc", "productionContracts"], - "testing": ["configsWorkspace", "default"] + "productionContracts": [ + "{projectRoot}/contracts/**/*" + ], + "production": [ + "productionSrc", + "productionContracts" + ], + "testing": [ + "configsWorkspace", + "default" + ] }, "targetDefaults": { "lint": { - "inputs": ["{workspaceRoot}/.markdownlint.json", "default"] + "inputs": [ + "{workspaceRoot}/.markdownlint.json", + "default" + ] }, "test": { - "inputs": ["default", "testing", "^production"], - "dependsOn": ["^build"] + "inputs": [ + "default", + "testing", + "^production" + ], + "dependsOn": [ + "^build" + ] }, "build:contracts": { "inputs": [ @@ -57,8 +77,13 @@ "productionContracts", "^productionContracts" ], - "dependsOn": ["^build"], - "outputs": ["{projectRoot}/artifacts", "{projectRoot}/forge-artifacts"] + "dependsOn": [ + "^build" + ], + "outputs": [ + "{projectRoot}/artifacts", + "{projectRoot}/forge-artifacts" + ] }, "build": { "inputs": [ @@ -67,8 +92,13 @@ "production", "^production" ], - "dependsOn": ["^build", "build:contracts"], - "outputs": ["{projectRoot}/dist"] + "dependsOn": [ + "^build", + "build:contracts" + ], + "outputs": [ + "{projectRoot}/dist" + ] } } -} +} \ No newline at end of file From 788a61a7d1ccee0798e46f1a6fc53f6505015f2a Mon Sep 17 00:00:00 2001 From: clabby Date: Tue, 14 Nov 2023 15:27:03 -0500 Subject: [PATCH 10/13] Correct `Deployment` type Add custom `Deployment` unmarshaller --- op-bindings/hardhat/types.go | 58 +++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/op-bindings/hardhat/types.go b/op-bindings/hardhat/types.go index 8e8e86fca16..9dd3a362982 100644 --- a/op-bindings/hardhat/types.go +++ b/op-bindings/hardhat/types.go @@ -2,6 +2,7 @@ package hardhat import ( "encoding/json" + "strings" "github.com/ethereum-optimism/optimism/op-bindings/solc" "github.com/ethereum/go-ethereum/accounts/abi" @@ -14,7 +15,7 @@ type Deployment struct { Name string Abi abi.ABI `json:"abi"` Address common.Address `json:"address"` - Args []any `json:"args"` + Args []interface{} `json:"-"` Bytecode hexutil.Bytes `json:"bytecode"` DeployedBytecode hexutil.Bytes `json:"deployedBytecode"` Devdoc json.RawMessage `json:"devdoc"` @@ -26,6 +27,61 @@ type Deployment struct { Userdoc json.RawMessage `json:"userdoc"` } +// UnmarshalJSON is a custom unmarshaler for Deployment, handling the Args field. This changed recently +// when `foundry` migrated to `alloy` types, and now the Args field within the contract artifact has +// a different serialization format. +// +// This custom unmarshaller should be removed when this is fixed upstream. +// +// Old Example: +// ``` +// "args": [ +// +// "0xCE9FeE676767A25feb9722986148Fcd87085a14e", +// "OVM_L1CrossDomainMessenger" +// +// ], +// ``` +// +// New Example: +// ``` +// "args": "[\"0x45ce2021212883d655348778aC99707d63D49aBc\",\"\\OVM_L1CrossDomainMessenger\\\"]" +// ``` +func (d *Deployment) UnmarshalJSON(data []byte) error { + // Create a type alias to prevent recursion + type DeploymentAlias Deployment + + // Unmarshal all fields except for `Args` + var alias DeploymentAlias + if err := json.Unmarshal(data, &alias); err != nil { + return err + } + + // Unmarshal `Args` manually. + tmp := struct { + Args json.RawMessage `json:"args"` + }{} + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + // Strip the `args` string of escapes and quotes. + stripped := strings.ReplaceAll(strings.Trim(string(tmp.Args), "\""), "\\", "") + + // Unmarshal the stripped version of the `args` field. + var args []interface{} + if err := json.Unmarshal([]byte(stripped), &args); err != nil { + return err + } + + // Set the `Args` field in the `Deployment` to the correctly unmarshaled value + alias.Args = args + + // Assign the unmarshaled alias back to the original struct + *d = Deployment(alias) + return nil +} + // Receipt represents the receipt held in a hardhat-deploy // artifact file type Receipt struct { From 012a0d31178e99d0093c645ce834b64202de44af Mon Sep 17 00:00:00 2001 From: rishabhagrawalzra Date: Wed, 13 Dec 2023 02:06:08 +0530 Subject: [PATCH 11/13] fix: updated docs and readme --- README.md | 173 +++++++------- ...mism chain using avail-op-stack-adapter.md | 224 ++++++++---------- op-avail/specs/assets/avail-optimism-logo.gif | Bin 0 -> 38485 bytes .../specs/assets/avail-optimism-model.png | Bin 0 -> 290628 bytes 4 files changed, 190 insertions(+), 207 deletions(-) rename op-avail/{ => specs}/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md (80%) create mode 100644 op-avail/specs/assets/avail-optimism-logo.gif create mode 100644 op-avail/specs/assets/avail-optimism-model.png diff --git a/README.md b/README.md index 5f5cebf1658..abae57ee9be 100644 --- a/README.md +++ b/README.md @@ -2,62 +2,113 @@


- Optimism + Avail X Optimism
-

Optimism is Ethereum, scaled.

+

Avail: Data availability focused blockchain X Low-cost and lightning-fast Ethereum L2 blockchain: Optimism


+# Avail-OP-Stack-Adapter + +### Avail-OP-Stack Adapter integrates the Avail Data Availability layer in Optimism’s OP Stack to create a more optimised and efficient Optimistic Rollup architecture. It is designed to minimise the cost of posting L2 transactions over the DA layer with a better data availability guarantee + +## What is Avail? + +[Avail](https://www.availproject.org/) is a data availability focused blockchain. Its blocks are designed to provide secure, decentralized and low-cost blockspace for the data availability needs of other blockchains. It is built to meet the needs of next-generation, trust-minimized applications and sovereign rollups. Avail's strengths lie in its innovative security approach, which allows light clients to easily verify data availability through sampling over a peer-to-peer network. Avail’s modular approach simplifies blockchain integration for developers, as they no longer need to worry about validator sets or tokenomics. With Avail's unparalleled data availability interface and powerful security capabilities, developers can create zero-knowledge or fraud-proof-based blockchain applications with greater efficiency and ease. + +At its core, Avail prioritizes ordering and publishing transactions while enabling users to verify the availability of block data without needing to download entire blocks. Avail's data-agnostic nature is one of its defining features. It supports various execution environments, including EVM, WASM, and custom new runtimes, offering a versatile foundation for diverse blockchain applications. + ## What is Optimism? [Optimism](https://www.optimism.io/) is a project dedicated to scaling Ethereum's technology and expanding its ability to coordinate people from across the world to build effective decentralized economies and governance systems. The [Optimism Collective](https://app.optimism.io/announcement) builds open-source software for running L2 blockchains and aims to address key governance and economic challenges in the wider cryptocurrency ecosystem. Optimism operates on the principle of **impact=profit**, the idea that individuals who positively impact the Collective should be proportionally rewarded with profit. **Change the incentives and you change the world.** In this repository, you'll find numerous core components of the OP Stack, the decentralized software stack maintained by the Optimism Collective that powers Optimism and forms the backbone of blockchains like [OP Mainnet](https://explorer.optimism.io/) and [Base](https://base.org). Designed to be "aggressively open source," the OP Stack encourages you to explore, modify, extend, and test the code as needed. Although not all elements of the OP Stack are contained here, many of its essential components can be found within this repository. By collaborating on free, open software and shared standards, the Optimism Collective aims to prevent siloed software development and rapidly accelerate the development of the Ethereum ecosystem. Come contribute, build the future, and redefine power, together. +## Integration of Avail DA layer in OP-Stack + +OP Stack chain is derived from the Data Availability Layer, the Data Availability module(s) used have a significant impact on the security model of a system. For example, if a certain piece of data can no longer be retrieved from the Data Availability Layer, it may not be possible to sync the chain. + +In ORUs, **Sequencer** has the responsibility to submit L2 transactions to a **data availability provider**. Ethereum DA is currently the used Data Availability module for the OP Stack. + +In `Avail-OP-Stack-Adapter`, the Data Availability layer is switched from Ethereum to Avail in OP Stack modular blockchain architecture to create the optimistic rollup. + +1. **Sequencer** posts L2 transaction data on Avail DA and submits the data commitment to Ethereum as `callData`. +2. **Verifier and Rollup nodes** can derive the chain using the data commitment from `callData` to read the L2 transaction data from Avail. + +## Working of Avail-OP-Stack-Adapter + +There are few changes being made in the workflow compared to **`op-stack`** with Ethereum as Data Availability Layer + +1. **`op-avail`** is the module added to integrate the Avail DA with **`op-stack`**. +2. Here, **`op-batcher`** submits the batch of transactions on Avail DA using the **`op-avail`** and gets the data commitment in the return, which is again submitted over Ethereum as `callData` on BatchInbox address. +3. To derive the chain **`op-node`**, first query the data commitment from Ethereum `callData` and then fetch the L2 transaction data through **`op-avail`**. + +Here **`op-node`**, **`op-geth`**, **`op-batcher`** and **`op-proposer`** are the software components of op-stack to learn more about it, follow [**op-stack**](https://github.com/ethereum-optimism/optimism/tree/develop) + +
+
+
+ Avail X Optimism +
+
+ +## Benefits + +ORUs faced with growth challenges due to constrained blockspace and prohibitive costs, have now come to recognize that a scalable [data availability](https://availproject.github.io/?ref=blog.availproject.org) layer is crucial for effectively scaling blockchains. They have come to realize the need for a cost-effective base layer with expandable block space + +Avail is a highly tuned data availability base layer which can provide raw blockspace for next-generation, trust minimized applications and blockchains. it ensures the modular blockchain ecosystem can access secure, affordable and highly available block space for transaction data unlocking significant scaling potential for the industry. + +### Cost + +When inspecting L1 transactions for Ethereum Rollups, we can see the major bottleneck which represents up to 90% of their costs is transaction data. In fact, this is the largest cost item for Ethereum Rollups as [most of their revenues](https://twitter.com/0xKofi/status/1666844191194853383?ref=blog.availproject.org) go towards paying an L1 to publish transaction data. + +Ethereum is the most expensive solution in relation to congestion and demand. Even with EIP-4844 Ethereum will still be costly as it provides only a one-time increase in blockspace. DACs are the cheapest, but this comes at the cost of adopting a more centralized approach. + +Avail is a Data Availablity Sampling based DA provider with no congestion, Using Avail as DA layer will reduce the cost of posting L2 transactional data over L1 layer. + +### High Data Availability + +pre EIP 4844 ethereum has no support of DAS and fraud proof and with low calldata space, where as in Avail + +Avail’s light client network ensures high availability of data through Data Availability Sampling. with validity proof mechanism and high space compared to ethereum’s calldata + ## Documentation -- If you want to build on top of OP Mainnet, refer to the [Optimism Community Hub](https://community.optimism.io) -- If you want to build your own OP Stack based blockchain, refer to the [OP Stack docs](https://stack.optimism.io) -- If you want to contribute to the OP Stack, check out the [Protocol Specs](./specs) +- If you want to build on top of Avail, refer to the [Avail developers](https://www.availproject.org/developer) +- If you want to build your own avail-optimism blockchain, refer to the [Avail Optimism(Optimium)](https://docs.availproject.org/category/optimium/) +- If you want to learn more about OP-Stack and Optimsim, check out the [OP Stack](https://stack.optimism.io/) and [Optimism](https://www.optimism.io/) ## Community +### Optimism + General discussion happens most frequently on the [Optimism discord](https://discord.gg/optimism). Governance discussion can also be found on the [Optimism Governance Forum](https://gov.optimism.io/). -## Contributing - -Read through [CONTRIBUTING.md](./CONTRIBUTING.md) for a general overview of the contributing process for this repository. -Use the [Developer Quick Start](./CONTRIBUTING.md#development-quick-start) to get your development environment set up to start working on the Optimism Monorepo. -Then check out the list of [Good First Issues](https://github.com/ethereum-optimism/optimism/contribute) to find something fun to work on! - -## Security Policy and Vulnerability Reporting - -Please refer to the canonical [Security Policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md) document for detailed information about how to report vulnerabilities in this codebase. -Bounty hunters are encouraged to check out [the Optimism Immunefi bug bounty program](https://immunefi.com/bounty/optimism/). -The Optimism Immunefi program offers up to $2,000,042 for in-scope critical vulnerabilities. +### Avail -## The Bedrock Upgrade +General discussion happens most frequently on the [Avail discord](https://discord.gg/y6fHnxZQX8). +Other discussion can also be found on the [Avail Forum](https://forum.availproject.org/). -OP Mainnet is currently preparing for [its next major upgrade, Bedrock](https://dev.optimism.io/introducing-optimism-bedrock/). -You can find detailed specifications for the Bedrock upgrade within the [specs folder](./specs) in this repository. +## Contributing -Please note that a significant number of packages and folders within this repository are part of the Bedrock upgrade and are NOT currently running in production. -Refer to the Directory Structure section below to understand which packages are currently running in production and which are intended for use as part of the Bedrock upgrade. +Read through [CONTRIBUTING.md](./CONTRIBUTING.md) for a general overview of the contributing process for this repository. +Use the [Developer Quick Start](./CONTRIBUTING.md#development-quick-start) to get your development environment set up to start working on the avail-op-stack-adapter Monorepo. +Then check out the list of [Good First Issues](https://github.com/availproject/avail-op-stack-adapter/contribute) to find something fun to work on! ## Directory Structure
-~~ Production ~~
 ├── packages
 │   ├── common-ts: Common tools for building apps in TypeScript
 │   ├── contracts-bedrock: Bedrock smart contracts.
-│   ├── contracts-periphery: Peripheral contracts for Optimism
-│   ├── core-utils: Low-level utilities that make building Optimism easier
+│   ├── contracts-periphery: Peripheral contracts for avail-op-stack-adapter
+│   ├── core-utils: Low-level utilities that make building avail-op-stack-adapter easier
 │   ├── chain-mon: Chain monitoring services
 │   ├── fault-detector: Service for detecting Sequencer faults
 │   ├── replica-healthcheck: Service for monitoring the health of a replica node
-│   └── sdk: provides a set of tools for interacting with Optimism
+│   └── sdk: provides a set of tools for interacting with avail-op-stack-adapter
+├── op-avail: Avail module to interact with Avail DA
 ├── op-bindings: Go bindings for Bedrock smart contracts.
 ├── op-batcher: L2-Batch Submitter, submits bundles of batches to L1
 ├── op-bootnode: Standalone op-node discovery bootnode
@@ -75,20 +126,6 @@ Refer to the Directory Structure section below to understand which packages are
 ├── ops-bedrock: Bedrock devnet work
 ├── proxyd: Configurable RPC request router and proxy
 └── specs: Specs of the rollup starting at the Bedrock upgrade
-
-~~ Pre-BEDROCK ~~
-├── packages
-│   ├── common-ts: Common tools for building apps in TypeScript
-│   ├── contracts-periphery: Peripheral contracts for Optimism
-│   ├── core-utils: Low-level utilities that make building Optimism easier
-│   ├── chain-mon: Chain monitoring services
-│   ├── fault-detector: Service for detecting Sequencer faults
-│   ├── replica-healthcheck: Service for monitoring the health of a replica node
-│   └── sdk: provides a set of tools for interacting with Optimism
-├── indexer: indexes and syncs transactions
-├── op-exporter: A prometheus exporter to collect/serve metrics from an Optimism node
-├── proxyd: Configurable RPC request router and proxy
-└── technical-documents: audits and post-mortem documents
 
## Branching Model @@ -97,9 +134,8 @@ Refer to the Directory Structure section below to understand which packages are | Branch | Status | | --------------- | -------------------------------------------------------------------------------- | -| [master](https://github.com/ethereum-optimism/optimism/tree/master/) | Accepts PRs from `develop` when intending to deploy to production. | -| [develop](https://github.com/ethereum-optimism/optimism/tree/develop/) | Accepts PRs that are compatible with `master` OR from `release/X.X.X` branches. | -| release/X.X.X | Accepts PRs for all changes, particularly those not backwards compatible with `develop` and `master`. | +| [avail-master](hhttps://github.com/availproject/avail-op-stack-adapter/tree/avail-master/) | Accepts PRs from `avail-develop` when intending to deploy to production. | +| [avail-develop](https://github.com/availproject/avail-op-stack-adapter/tree/avail-develop/) | Accepts PRs that are successfully running without fails. | ### Overview @@ -108,55 +144,16 @@ Please read the linked post if you're planning to make frequent PRs into this re ### Production branch -The production branch is `master`. -The `master` branch contains the code for latest "stable" releases. -Updates from `master` **always** come from the `develop` branch. +The production branch is `avail-master`. +The `avail-master` branch contains the code for latest "stable" releases. +Updates from `avail-master` **always** come from the `avail-develop` branch. ### Development branch -The primary development branch is [`develop`](https://github.com/ethereum-optimism/optimism/tree/develop/). -`develop` contains the most up-to-date software that remains backwards compatible with the latest experimental [network deployments](https://community.optimism.io/docs/useful-tools/networks/). -If you're making a backwards compatible change, please direct your pull request towards `develop`. - -**Changes to contracts within `packages/contracts-bedrock/contracts` are usually NOT considered backwards compatible and SHOULD be made against a release candidate branch**. -Some exceptions to this rule exist for cases in which we absolutely must deploy some new contract after a release candidate branch has already been fully deployed. -If you're changing or adding a contract and you're unsure about which branch to make a PR into, default to using the latest release candidate branch. -See below for info about release candidate branches. - -### Release candidate branches - -Branches marked `release/X.X.X` are **release candidate branches**. -Changes that are not backwards compatible and all changes to contracts within `packages/contracts-bedrock/contracts` MUST be directed towards a release candidate branch. -Release candidates are merged into `develop` and then into `master` once they've been fully deployed. -We may sometimes have more than one active `release/X.X.X` branch if we're in the middle of a deployment. -See table in the **Active Branches** section above to find the right branch to target. - -## Releases - -### Changesets - -We use [changesets](https://github.com/changesets/changesets) to mark packages for new releases. -When merging commits to the `develop` branch you MUST include a changeset file if your change would require that a new version of a package be released. - -To add a changeset, run the command `pnpm changeset` in the root of this monorepo. -You will be presented with a small prompt to select the packages to be released, the scope of the release (major, minor, or patch), and the reason for the release. -Comments within changeset files will be automatically included in the changelog of the package. - -### Triggering Releases - -Releases can be triggered using the following process: - -1. Create a PR that merges the `develop` branch into the `master` branch. -2. Wait for the auto-generated `Version Packages` PR to be opened (may take several minutes). -3. Change the base branch of the auto-generated `Version Packages` PR from `master` to `develop` and merge into `develop`. -4. Create a second PR to merge the `develop` branch into the `master` branch. - -After merging the second PR into the `master` branch, packages will be automatically released to their respective locations according to the set of changeset files in the `develop` branch at the start of the process. -Please carry this process out exactly as listed to avoid `develop` and `master` falling out of sync. - -**NOTE**: PRs containing changeset files merged into `develop` during the release process can cause issues with changesets that can require manual intervention to fix. -It's strongly recommended to avoid merging PRs into develop during an active release. +The primary development branch is [`avail-develop`](https://github.com/availproject/avail-op-stack-adapter/tree/avail-develop/). +`avail-develop` contains the most up-to-date software that remains backwards compatible with the latest experimental. +If you're making a backwards compatible change, please direct your pull request towards `avail-develop`. ## License -All other files within this repository are licensed under the [MIT License](https://github.com/ethereum-optimism/optimism/blob/master/LICENSE) unless stated otherwise. +All other files within this repository are licensed under the [MIT License](https://github.com/availproject/avail-op-stack-adapter/blob/avail-master/LICENSE) unless stated otherwise. diff --git a/op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md b/op-avail/specs/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md similarity index 80% rename from op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md rename to op-avail/specs/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md index 3dbfa990461..f9c7d259847 100644 --- a/op-avail/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md +++ b/op-avail/specs/Steps to run your own avail-optimism chain using avail-op-stack-adapter.md @@ -4,7 +4,7 @@ Hello! This guide is meant to help you kick off your Avail-OP Stack journey by taking you through the process of spinning up your very own avail-optimism chain on the Ethereum Goerli testnet as settlement layer and Avail kate testnet as Data Avalibility layer. -# **[#](https://stack.optimism.io/docs/build/getting-started/#know-before-you-go)**Know before you go +# Know before you go Before we kick off, note that this is a relatively long tutorial! You should prepare to set aside an hour or two to get everything running. Here’s an itemized list of what we’re about to do: @@ -20,7 +20,7 @@ Before we kick off, note that this is a relatively long tutorial! You should pre 10. Send some test transactions 11. Celebrate! -# **[#](https://stack.optimism.io/docs/build/getting-started/#prerequisites)**Prerequisites +# Prerequisites You’ll need the following software installed to follow this tutorial: @@ -39,71 +39,69 @@ This tutorial was checked on: | --- | --- | --- | | Ubuntu | 20.04 LTS | | | git, curl, jq, and make | OS default | sudo apt install -y git curl make jq | -| Go | 1.20 | sudo apt updatewget https://go.dev/dl/go1.20.linux-amd64.tar.gztar xvzf go1.20.linux-amd64.tar.gzsudo cp go/bin/go /usr/bin/gosudo mv go /usr/libecho export GOROOT=/usr/lib/go >> ~/.bashrc | -| Node | 16.19.0 | curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -sudo apt-get install -y nodejs npm | +| Go | 1.20 | sudo apt updatewget xvzf go1.20.linux-amd64.tar.gzsudo cp go/bin/go /usr/bin/gosudo mv go /usr/libecho export GOROOT=/usr/lib/go >> ~/.bashrc | +| Node | 16.19.0 | curl -fsSL | sudo -E bash -sudo apt-get install -y nodejs npm | | pnpm | 8.5.6 | sudo npm install -g pnpm | | Foundry | 0.2.0 | yarn install:foundry | -# **[#](https://stack.optimism.io/docs/build/getting-started/#build-the-source-code)**Build the Source Code +# Build the Source Code -We’re going to be spinning up an EVM Rollup from the Avail-OP Stack source code. The OP Stack source code is split between two repositories, the **[Avail-OP-Stack Adapter](https://github.com/availproject/avail-op-stack-adapter) monorepo** and the **`[op-geth`](https://github.com/ethereum-optimism/op-geth)** repository. +We’re going to be spinning up an EVM Rollup from the Avail-OP-Stack-Adapter source code. The Avail-Optimism is split between two repositories, the **[Avail-OP-Stack Adapter](https://github.com/availproject/avail-op-stack-adapter) monorepo** and the **[op-geth](https://github.com/ethereum-optimism/op-geth)** repository. -# **[#](https://stack.optimism.io/docs/build/getting-started/#build-the-optimism-monorepo)**Build the Optimism Monorepo +# Build the Optimism Monorepo 1. Clone the [Avail-OP-Stack Adapter](https://github.com/availproject/avail-optimism). - + ```bash cd ~ git clone https://github.com/availproject/avail-op-stack-adapter.git ``` - + 2. Enter the Avail-OP-Stack Monorepo. - + ```bash cd avail-op-stack-adapter ``` - + 3. Install required modules. This is a slow process, while it is running you can already start building `op-geth`, as shown below. - + ```bash pnpm install ``` - + 4. Build the various packages inside of the Optimism Monorepo. - + ```bash make op-node op-batcher op-proposer pnpm build ``` - -# **[#](https://stack.optimism.io/docs/build/getting-started/#build-op-geth)**Build op-geth +# Build op-geth + +1. Clone **[op-geth](https://github.com/ethereum-optimism/op-geth)** : -1. Clone **`[op-geth`](https://github.com/ethereum-optimism/op-geth)** : - ```bash cd ~ git clone https://github.com/ethereum-optimism/op-geth.git ``` - + 2. Enter `op-geth`: - + ```bash cd op-geth ``` - + 3. Build `op-geth`: - + ```bash make geth ``` - -# **[#](https://stack.optimism.io/docs/build/getting-started/#get-access-to-a-goerli-node)**Get access to a Goerli node +# Get access to a Goerli node -Since we’re deploying our OP Stack chain to Goerli, you’ll need to have access to a Goerli L1 node. You can either use a node provider like **[Alchemy](https://www.alchemy.com/)** (easier) or **[run your own Goerli node](https://notes.ethereum.org/@launchpad/goerli)** (harder). +Since we’re deploying our Avail-Optimism chain to Goerli, you’ll need to have access to a Goerli L1 node. You can either use a node provider like **[Alchemy](https://www.alchemy.com/)** (easier) or **[run your own Goerli node](https://notes.ethereum.org/@launchpad/goerli)** (harder). -# **[#](https://stack.optimism.io/docs/build/getting-started/#generate-some-keys)**Generate some keys +# Generate some keys You’ll need four accounts and their private keys when setting up the chain: @@ -115,19 +113,19 @@ You’ll need four accounts and their private keys when setting up the chain: You can generate all of these keys with the `rekey` tool in the `contracts-bedrock` package. 1. Enter the Avail-Optimism Monorepo: - + ```bash cd avail-op-stack-adapter ``` - + 2. Move into the `contracts-bedrock` package: - + ```bash cd packages/contracts-bedrock ``` - + 3. Use `cast wallet` to generate new accounts - + ```bash echo "Admin:" cast wallet new @@ -138,7 +136,6 @@ You can generate all of these keys with the `rekey` tool in the `contracts-be echo "Sequencer:" cast wallet new ``` - You should get an output like the following: @@ -173,55 +170,55 @@ Recommended funding amounts are as follows: The `cast wallet new` tool is *not* designed for production deployments. If you are deploying an Avail-Optimism Stack based chain into production, you should likely be using a combination of hardware security modules and hardware wallets. -# **[#](https://stack.optimism.io/docs/build/getting-started/#configure-your-network)**Configure your network +# Configure your network -Once you’ve built both repositories, you’ll need head back to the Optimism Monorepo to set up the configuration for your chain. Currently, chain configuration lives inside of the **`[contracts-bedrock](https://github.com/availproject/avail-optimism/tree/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock)` [](https://github.com/ethereum-optimism/optimism/tree/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock)**package. +Once you’ve built both repositories, you’ll need head back to the Avail-Op-Stack-Adapter Monorepo to set up the configuration for your chain. Currently, chain configuration lives inside of the **[contracts-bedrock](https://github.com/availproject/avail-optimism/tree/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock)** package. 1. Enter the Avail-OP-Stack Monorepo: - + ```bash cd ~/avail-op-stack-adapter ``` - + 2. Move into the `contracts-bedrock` package: - + ```bash cd packages/contracts-bedrock ``` - + 3. Inside of `contracts-bedrock`, copy the environment file - + ``` cp .envrc.example .envrc ``` - + 4. Fill out the environment variables inside of that file: - `ETH_RPC_URL` — URL for your L1 node. - `PRIVATE_KEY` — Private key of the `Admin` account. - `DEPLOYMENT_CONTEXT` - Name of the network, should be "avail-optimism" 5. Pull the environment variables into context using `direnv` - + ```bash direnv allow . ``` - + If you need to install `direnv`, **[make sure you also modify the shell configuration](https://direnv.net/docs/hook.html)**. - + 6. Before we can create our configuration file, we’ll need to pick an L1 block to serve as the starting point for our Rollup. It’s best to use a finalized L1 block as our starting block. You can use the `cast` command provided by Foundry to grab all of the necessary information: - + ```bash cast block finalized --rpc-url $ETH_RPC_URL | grep -E "(timestamp|hash|number)" ``` - + You’ll get back something that looks like the following: - + ``` hash 0x784d8e7f0e90969e375c7d12dac7a3df6879450d41b4cb04d4f8f209ff0c4cd9 number 8482289 timestamp 1676253324 ``` - -7. Create a copy of file `deploy-config/getting-started.json` at `deploy-config` named `avail-optimism.json` + +7. Create a copy of file `deploy-config/getting-started.json` at `deploy-config` named `avail-optimism.json` 8. Fill out the remainder of the pre-populated config file **`deploy-config/avail-optimism.json`**. Use the default values in the config file and make following modifications: - Replace `"ADMIN"` with the address of the Admin account you generated earlier. - Replace `"PROPOSER"` with the address of the Proposer account you generated earlier. @@ -231,13 +228,13 @@ Once you’ve built both repositories, you’ll need head back to the Optimism M - Replace `TIMESTAMP` with the timestamp you got from the `cast` command. Note that although all the other fields are strings, this field is a number! Don’t include the quotation marks. 9. Check the value of `enableDA` config variable should be `true` to use Avail chain as DA or you can set it to `false` for using ethereum as DA 10. Move into `op-avail` module - + ```bash cd ~/avail-op-stack-adapter/op-avail ``` - + 11. Add a `config.json` file to this directory with these variables and change the `seed` and `app_id` according to your avail account - + ``` { "seed": "test test test test test test test test test test test avail", @@ -245,41 +242,39 @@ Once you’ve built both repositories, you’ll need head back to the Optimism M "app_id": 1 } ``` - -# **[#](https://stack.optimism.io/docs/build/getting-started/#deploy-the-l1-contracts)**Deploy the L1 contracts +# Deploy the L1 contracts Once you’ve configured your network, it’s time to deploy the L1 smart contracts necessary for the functionality of the chain. 1. Create a `avail-optimism` deployment directory. - + ```bash mkdir deployments/avail-optimism ``` - + 2. Once you’re ready, deploy the L1 smart contracts. - + ```bash forge script scripts/Deploy.s.sol:Deploy --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL forge script scripts/Deploy.s.sol:Deploy --sig 'sync()' --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL - + ``` - Contract deployment can take up to 15 minutes. Please wait for all smart contracts to be fully deployed before continuing to the next step. -# **[#](https://stack.optimism.io/docs/build/getting-started/#generate-the-l2-config-files)**Generate the L2 config files +# Generate the L2 config files We’ve set up the L1 side of things, but now we need to set up the L2 side of things. We do this by generating three important files, a `genesis.json` file, a `rollup.json` configuration file, and a `jwt.txt` **[JSON Web Token](https://jwt.io/introduction)** that allows the `op-node` and `op-geth` to communicate securely. 1. Head over to the `op-node` package. - + ```bash cd ~/avail-op-stack-adapter/op-node ``` - + 2. Run the following command, and make sure to replace `` with your L1 RPC URL: - + ```bash go run cmd/main.go genesis l2 \ --deploy-config ../packages/contracts-bedrock/deploy-config/avail-optimism.json \ @@ -288,49 +283,47 @@ We’ve set up the L1 side of things, but now we need to set up the L2 side of t --outfile.rollup rollup.json \ --l1-rpc=$L1_RPC ``` - + You should then see the `genesis.json` and `rollup.json` files inside the `op-node` package. - + 3. Next, generate the `jwt.txt` file with the following command: - + ```bash openssl rand -hex 32 > jwt.txt ``` - + 4. Finally, we’ll need to copy the `genesis.json` file and `jwt.txt` file into `op-geth` so we can use it to initialize and run `op-geth` in just a minute: - + ```bash cp genesis.json ~/op-geth cp jwt.txt ~/op-geth ``` - -# **[#](https://stack.optimism.io/docs/build/getting-started/#initialize-op-geth)**Initialize op-geth +# Initialize op-geth We’re almost ready to run our chain! Now we just need to run a few commands to initialize `op-geth`. We’re going to be running a Sequencer node, so we’ll need to import the `Sequencer` private key that we generated earlier. This private key is what our Sequencer will use to sign new blocks. 1. Head over to the `op-geth` repository: - + ```bash cd ~/op-geth ``` - + 2. Create a data directory folder: - + ```bash mkdir datadir ``` - + 3. Next we need to initialize `op-geth` with the genesis file we generated and copied earlier: - + ```bash build/bin/geth init --datadir=datadir genesis.json ``` - Everything is now initialized and ready to go! -# **[#](https://stack.optimism.io/docs/build/getting-started/#run-the-node-software)**Run the node software +# Run the node software There are four components that need to run for a rollup. The first two, `op-geth` and `op-node`, have to run on every node. The other two, `op-batcher` and `op-proposer`, run only in one place, the sequencer that accepts transactions. @@ -345,7 +338,7 @@ Set these environment variables for the configuration | RPC_KIND | The type of L1 server to which you connect, which can optimize requests. Available options are alchemy, quicknode, parity, nethermind, debug_geth, erigon, basic, and any | | L2OO_ADDR | The address of the L2OutputOracleProxy, available at ~/optimism/packages/contracts-bedrock/deployments/getting-started/L2OutputOracleProxy.json | -# **[#](https://stack.optimism.io/docs/build/getting-started/#op-geth)**`op-geth` +# `op-geth` Run `op-geth` with the following commands. @@ -358,7 +351,7 @@ cd ~/op-geth --http.corsdomain="*" \ --http.vhosts="*" \ --http.addr=0.0.0.0 \ - --http.port=9545 \ + --http.port=9545 \ --http.api=web3,debug,eth,txpool,net,engine \ --ws \ --ws.addr=0.0.0.0 \ @@ -386,38 +379,37 @@ Archive mode takes more disk storage than full mode. However, using it is import - The `op-proposer` requires access to the full state. If at some point `op-proposer` needs to look beyond 256 blocks in the past (8.5 minutes in the default configuration), for example because it was down for that long, we need archive mode. - The **explorer** requires archive mode. -### **[#](https://stack.optimism.io/docs/build/getting-started/#reinitializing-op-geth)**Reinitializing op-geth +### Reinitializing op-geth There are several situations are indicate database corruption and require you to reset the `op-geth` component: - When `op-node` errors out when first started and exits. - When `op-node` emits this error: - + ``` stage 0 failed resetting: temp: failed to find the L2 Heads to start from: failed to fetch L2 block by hash 0x0000000000000000000000000000000000000000000000000000000000000000 ``` - This is the reinitialization procedure: 1. Stop the `op-geth` process. 2. Delete the geth data. - + ```bash cd ~/op-geth rm -rf datadir/geth ``` - + 3. Rerun init. - + ```bash build/bin/geth init --datadir=datadir genesis.json ``` - + 4. Start `op-geth` 5. Start `op-node` -# **[#](https://stack.optimism.io/docs/build/getting-started/#op-node)**`op-node` +# `op-node` Once we’ve got `op-geth` running we’ll need to run `op-node`. Like Ethereum, the OP Stack has a consensus client (the `op-node`) and an execution client (`op-geth`). The consensus client drives the execution client over the Engine API. @@ -425,19 +417,19 @@ Once we’ve got `op-geth` running we’ll need to run `op-node`. Like Ethere cd ~/optimism/op-node ./bin/op-node \ - --l2=http://localhost:9551 \ - --l2.jwt-secret=./jwt.txt \ - --sequencer.enabled \ - --sequencer.l1-confs=3 \ - --verifier.l1-confs=3 \ - --rollup.config=./rollup.json \ - --rpc.addr=0.0.0.0 \ - --rpc.port=9547 \ - --p2p.disable \ - --rpc.enable-admin \ - --p2p.sequencer.key=$SEQ_KEY \ - --l1=$L1_RPC \ - --l1.rpckind=$RPC_KIND + --l2=http://localhost:9551 \ + --l2.jwt-secret=./jwt.txt \ + --sequencer.enabled \ + --sequencer.l1-confs=3 \ + --verifier.l1-confs=3 \ + --rollup.config=./rollup.json \ + --rpc.addr=0.0.0.0 \ + --rpc.port=9547 \ + --p2p.disable \ + --rpc.enable-admin \ + --p2p.sequencer.key=$SEQ_KEY \ + --l1=$L1_RPC \ + --l1.rpckind=$RPC_KIND ``` Once you run this command, you should start seeing the `op-node` begin to process all of the L1 information after the starting block number that you picked earlier. Once the `op-node` has enough information, it’ll begin sending Engine API payloads to `op-geth`. At that point, you’ll start to see blocks being created inside of `op-geth`. We’re live! @@ -449,13 +441,13 @@ If you use a chain ID that is also used by others, for example the default (4206 To avoid this , we start with peer to peer synchronization disabled (`--p2p.disable`). Once you have multiple nodes, it makes sense to use these command line parameters to synchronize between them without getting confused by other blockchains. ``` - --p2p.static= \ - --p2p.listen.ip=0.0.0.0 \ - --p2p.listen.tcp=9003 \ - --p2p.listen.udp=9003 \ + --p2p.static= \ + --p2p.listen.ip=0.0.0.0 \ + --p2p.listen.tcp=9003 \ + --p2p.listen.udp=9003 \ ``` -# **[#](https://stack.optimism.io/docs/build/getting-started/#op-batcher)**`op-batcher` +# `op-batcher` The `op-batcher` takes transactions from the Sequencer and publishes those transactions to L1. Once transactions are on L1, they’re officially part of the Rollup. Without the `op-batcher`, transactions sent to the Sequencer would never make it to L1 and wouldn’t become part of the canonical chain. The `op-batcher` is critical! @@ -484,7 +476,7 @@ cd ~/optimism/op-batcher The `--max-channel-duration=n` setting tells the batcher to write all the data to L1 every `n` L1 blocks. When it is low, transactions are written to L1 frequently, withdrawals are quick, and other nodes can synchronize from L1 fast. When it is high, transactions are written to L1 less frequently, and the batcher spends less ETH. -# **[#](https://stack.optimism.io/docs/build/getting-started/#op-proposer)**`op-proposer` +# `op-proposer` Now start `op-proposer`, which proposes new state roots. @@ -500,32 +492,26 @@ cd ~/optimism/op-proposer --l1-eth-rpc=$L1_RPC ``` -# **[#](https://stack.optimism.io/docs/build/getting-started/#get-some-eth-on-your-rollup)**Get some ETH on your Rollup +# Get some ETH on your Rollup Once you’ve connected your wallet, you’ll probably notice that you don’t have any ETH on your Rollup. You’ll need some ETH to pay for gas on your Rollup. The easiest way to deposit Goerli ETH into your chain is to send funds directly to the `L1StandardBridge` contract. You can find the address of the `L1StandardBridge` contract for your chain by looking inside the `deployments` folder in the `contracts-bedrock` package. 1. First, head over to the `contracts-bedrock` package: - + ```bash cd ~/optimism/packages/contracts-bedrock - ``` - - 1 - + 2. Grab the address of the proxy to the L1 standard bridge contract: - + ```bash cat deployments/avail-optimism/L1StandardBridgeProxy.json | jq -r .address - ``` - - 1 - + 3. Grab the L1 bridge proxy contract address and, using the wallet that you want to have ETH on your Rollup, send that address a small amount of ETH on Goerli (0.1 or less is fine). It may take up to 5 minutes for that ETH to appear in your wallet on L2. -# Hurray! +# Hurray -**Congratulations, you made it! You now have a complete Avail-OP-Stack based EVM Rollup.** +**Congratulations, you made it! You now have a complete Avail-OP-Stack-Adapter based EVM Rollup.** -You can use this rollup the same way you’d use any other test blockchain. \ No newline at end of file +You can use this rollup the same way you’d use any other test blockchain. diff --git a/op-avail/specs/assets/avail-optimism-logo.gif b/op-avail/specs/assets/avail-optimism-logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..76e1c0517be9febe7726dead90e7382d09b41f05 GIT binary patch literal 38485 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 literal 0 HcmV?d00001 diff --git a/op-avail/specs/assets/avail-optimism-model.png b/op-avail/specs/assets/avail-optimism-model.png new file mode 100644 index 0000000000000000000000000000000000000000..1afde37b23c82251889f752f64e10c0033e34e9a GIT binary patch literal 290628 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 Date: Wed, 13 Dec 2023 02:11:01 +0530 Subject: [PATCH 12/13] fix: readme image issues --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index abae57ee9be..394b4a5f1ea 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@


- Avail X Optimism + Avail X Optimism

Avail: Data availability focused blockchain X Low-cost and lightning-fast Ethereum L2 blockchain: Optimism


@@ -48,7 +48,7 @@ Here **`op-node`**, **`op-geth`**, **`op-batcher`** and **`op-proposer`** are th


- Avail X Optimism + Avail X Optimism
From 7547e59312213898c8a3551eb11e818dd15a4760 Mon Sep 17 00:00:00 2001 From: Robin Roy <66296664+robin-rrt@users.noreply.github.com> Date: Wed, 20 Dec 2023 16:49:18 +0530 Subject: [PATCH 13/13] added contribution guidelines --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 394b4a5f1ea..9688ded0d9e 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,22 @@ ### Avail-OP-Stack Adapter integrates the Avail Data Availability layer in Optimism’s OP Stack to create a more optimised and efficient Optimistic Rollup architecture. It is designed to minimise the cost of posting L2 transactions over the DA layer with a better data availability guarantee +## Contribution Guidelines + +### Rules + +Avail welcomes contributors from every background and skill level. Our mission is to build a community that's not only welcoming and friendly but also aligned with the best development practices. Interested in contributing to this project? Whether you've spotted an issue, have improvement ideas, or want to add new features, we'd love to have your input. Simply open a GitHub issue or submit a pull request to get started. + +1. Before asking any questions regarding how the project works, please read through all the documentation and install the project on your own local machine to try it and understand how it works. Please ask your questions in open channels (Github and [Telegram](https://t.me/avail_uncharted/)). + +2. To work on an issue, first, get approval from a maintainer or team member. You can request to be assigned by commenting on the issue in GitHub. This respects the efforts of others who may already be working on the same issue. Unapproved PRs may be declined. + +3. When assigned to an issue, it's expected that you're ready to actively work on it. After assignment, please provide a draft PR or update within one week. If you encounter delays, communicate with us to maintain your assignment. + +4. Got an idea or found a bug? Open an issue with the tags [New Feature] or [Bug]. Provide detailed information like reproduction steps (for bugs) or a basic feature proposal. The team will review and potentially assign you to it. + +5. Start a draft PR early in your development process, even with incomplete changes. This allows us to track progress, provide timely reviews, and assist you. Expect feedback on your drafts periodically. + ## What is Avail? [Avail](https://www.availproject.org/) is a data availability focused blockchain. Its blocks are designed to provide secure, decentralized and low-cost blockspace for the data availability needs of other blockchains. It is built to meet the needs of next-generation, trust-minimized applications and sovereign rollups. Avail's strengths lie in its innovative security approach, which allows light clients to easily verify data availability through sampling over a peer-to-peer network. Avail’s modular approach simplifies blockchain integration for developers, as they no longer need to worry about validator sets or tokenomics. With Avail's unparalleled data availability interface and powerful security capabilities, developers can create zero-knowledge or fraud-proof-based blockchain applications with greater efficiency and ease.