From 9354815836bbca3eb0a1a5d9919a5344a996565d Mon Sep 17 00:00:00 2001 From: Dhanush Naik Date: Sat, 3 Feb 2024 00:10:28 +0530 Subject: [PATCH] Generated Website for RIPs --- .bundle/config | 2 + .gitattributes | 7 + 404.html | 23 + CNAME | 1 + Gemfile | 28 + Gemfile.lock | 321 ++++ _config.yml | 67 + _data/statuses.yaml | 7 + _includes/anchor_headings.html | 109 ++ _includes/authorlist.html | 13 + _includes/eipnums.html | 4 + _includes/eiptable.html | 36 + _includes/head.html | 95 + _includes/header.html | 29 + _includes/social.html | 14 + _includes/toc.html | 96 + _layouts/eip.html | 149 ++ _site/404.html | 147 ++ _site/CNAME | 1 + _site/LICENSE.html | 269 +++ _site/LICENSE.md | 121 ++ _site/RIPS/rip-7212.html | 510 +++++ _site/RIPS/rip-7560.html | 1573 ++++++++++++++++ _site/all.html | 212 +++ _site/assets/main.css | 196 ++ _site/assets/minima-social-icons.svg | 33 + _site/assets/rip-7212/benchstat_compare_test | 42 + .../assets/rip-7212/ecrecover_benchmark_test | 15 + .../assets/rip-7212/p256Verify_benchmark_test | 15 + _site/assets/rip-7560/block_overview.png | Bin 0 -> 63126 bytes _site/assets/rip-7560/flow_diagram.png | Bin 0 -> 142917 bytes .../assets/rip-7560/zoom_into_transaction.png | Bin 0 -> 55317 bytes _site/config/eip-editors.yml | 42 + _site/config/eipw.toml | 920 +++++++++ _site/config/mlc_config.json | 15 + _site/core.html | 213 +++ _site/feed.xml | 1 + _site/index.html | 175 ++ _site/rss/all.xml | 1650 +++++++++++++++++ _site/rss/erc-last-call.xml | 42 + _site/rss/erc.xml | 42 + _site/rss/last-call.xml | 42 + _site/rss/nonerc-last-call.xml | 72 + _site/rss/nonerc.xml | 72 + all.html | 6 + config/.codespell-whitelist | 16 + config/.jekyll-labels.yml | 28 + config/.markdownlint.yaml | 192 ++ config/eip-editors.yml | 42 + config/eipw.toml | 920 +++++++++ config/mlc_config.json | 15 + core.html | 7 + index.html | 52 + rss/all.xml | 27 + rss/erc-last-call.xml | 35 + rss/erc.xml | 33 + rss/last-call.xml | 33 + rss/nonerc-last-call.xml | 35 + rss/nonerc.xml | 35 + 59 files changed, 8897 insertions(+) create mode 100644 .bundle/config create mode 100644 .gitattributes create mode 100644 404.html create mode 100644 CNAME create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 _config.yml create mode 100644 _data/statuses.yaml create mode 100644 _includes/anchor_headings.html create mode 100644 _includes/authorlist.html create mode 100644 _includes/eipnums.html create mode 100644 _includes/eiptable.html create mode 100644 _includes/head.html create mode 100644 _includes/header.html create mode 100644 _includes/social.html create mode 100644 _includes/toc.html create mode 100644 _layouts/eip.html create mode 100644 _site/404.html create mode 100644 _site/CNAME create mode 100644 _site/LICENSE.html create mode 100644 _site/LICENSE.md create mode 100644 _site/RIPS/rip-7212.html create mode 100644 _site/RIPS/rip-7560.html create mode 100644 _site/all.html create mode 100644 _site/assets/main.css create mode 100644 _site/assets/minima-social-icons.svg create mode 100644 _site/assets/rip-7212/benchstat_compare_test create mode 100644 _site/assets/rip-7212/ecrecover_benchmark_test create mode 100644 _site/assets/rip-7212/p256Verify_benchmark_test create mode 100644 _site/assets/rip-7560/block_overview.png create mode 100644 _site/assets/rip-7560/flow_diagram.png create mode 100644 _site/assets/rip-7560/zoom_into_transaction.png create mode 100644 _site/config/eip-editors.yml create mode 100644 _site/config/eipw.toml create mode 100644 _site/config/mlc_config.json create mode 100644 _site/core.html create mode 100644 _site/feed.xml create mode 100644 _site/index.html create mode 100644 _site/rss/all.xml create mode 100644 _site/rss/erc-last-call.xml create mode 100644 _site/rss/erc.xml create mode 100644 _site/rss/last-call.xml create mode 100644 _site/rss/nonerc-last-call.xml create mode 100644 _site/rss/nonerc.xml create mode 100644 all.html create mode 100644 config/.codespell-whitelist create mode 100644 config/.jekyll-labels.yml create mode 100644 config/.markdownlint.yaml create mode 100644 config/eip-editors.yml create mode 100644 config/eipw.toml create mode 100644 config/mlc_config.json create mode 100644 core.html create mode 100644 index.html create mode 100644 rss/all.xml create mode 100644 rss/erc-last-call.xml create mode 100644 rss/erc.xml create mode 100644 rss/last-call.xml create mode 100644 rss/nonerc-last-call.xml create mode 100644 rss/nonerc.xml diff --git a/.bundle/config b/.bundle/config new file mode 100644 index 0000000..4d3e223 --- /dev/null +++ b/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_FROZEN: "false" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a9a9d1e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +# GitHub highlighting for Solidity files +# See https://github.com/github/linguist/pull/3973#issuecomment-357507741 +*.sol linguist-language=Solidity + +# Force Linux line endings on all files +# Necessary for running eipw locally +* text=auto eol=lf diff --git a/404.html b/404.html new file mode 100644 index 0000000..faf7e23 --- /dev/null +++ b/404.html @@ -0,0 +1,23 @@ +--- +layout: default +--- + + + +
+

404

+

Page not found :(

+

The requested page could not be found.

+
diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..de5ac15 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +rips.ethereum.org diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..b69ec37 --- /dev/null +++ b/Gemfile @@ -0,0 +1,28 @@ +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima", "~> 2.0" + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "github-pages", "228" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.1" if Gem.win_platform? + +gem "html-proofer", '>=5.0.7' + +gem "eip_validator", ">=0.8.2" + +gem "webrick", "~> 1.8" # needed for macOS builds diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..dfb1b4f --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,321 @@ +GEM + remote: https://rubygems.org/ + specs: + Ascii85 (1.1.0) + activemodel (7.1.2) + activesupport (= 7.1.2) + activesupport (7.1.2) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + afm (0.2.2) + async (2.8.0) + console (~> 1.10) + fiber-annotation + io-event (~> 1.1) + timers (~> 4.1) + base64 (0.2.0) + bigdecimal (3.1.5) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.23.10) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + console (1.23.3) + fiber-annotation + fiber-local + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + drb (2.2.0) + ruby2_keywords + eip_validator (0.8.2) + activemodel + front_matter_parser (~> 0.1.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.9.1) + faraday (2.8.1) + base64 + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-net_http (3.0.2) + ffi (1.16.3-x64-mingw-ucrt) + fiber-annotation (0.2.0) + fiber-local (1.0.0) + forwardable-extended (2.6.0) + front_matter_parser (0.1.1) + gemoji (3.0.1) + github-pages (228) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.3) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.4.0) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.13.6, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.9) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 3.0, < 5.0) + typhoeus (~> 1.3) + hashery (2.1.2) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + html-proofer (5.0.8) + addressable (~> 2.3) + async (~> 2.1) + nokogiri (~> 1.13) + pdf-reader (~> 2.11) + rainbow (~> 3.0) + typhoeus (~> 1.3) + yell (~> 2.0) + zeitwerk (~> 2.5) + http_parser.rb (0.8.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + io-event (1.4.0) + jekyll (3.9.3) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.20.0) + mutex_m (0.2.0) + nokogiri (1.16.0-x64-mingw-ucrt) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + pdf-reader (2.12.0) + Ascii85 (~> 1.0) + afm (~> 0.2.1) + hashery (~> 2.0) + ruby-rc4 + ttfunk + public_suffix (4.0.7) + racc (1.7.3) + rainbow (3.1.1) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.6) + rouge (3.26.0) + ruby-rc4 (0.1.5) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + timers (4.3.5) + ttfunk (1.7.0) + typhoeus (1.4.1) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2023.4) + tzinfo (>= 1.0.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.9.1-x64-mingw-ucrt) + unicode-display_width (1.8.0) + wdm (0.1.1) + webrick (1.8.1) + yell (2.2.2) + zeitwerk (2.6.12) + +PLATFORMS + x64-mingw-ucrt + +DEPENDENCIES + eip_validator (>= 0.8.2) + github-pages (= 228) + html-proofer (>= 5.0.7) + minima (~> 2.0) + tzinfo-data + wdm (~> 0.1.1) + webrick (~> 1.8) + +BUNDLED WITH + 2.5.3 diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..11c9e15 --- /dev/null +++ b/_config.yml @@ -0,0 +1,67 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. +title: Ethereum Rollup Improvement Proposals +description: >- + Ethereum Improvement Proposals (EIPs) describe standards for the Ethereum + platform, including core protocol specifications, client APIs, and contract + standards. +url: "https://rips.ethereum.org" +github_username: ethereum +repository: ethereum/RIPs + +header_pages: + - all.html + - core.html + +# Build settings +highlighter: rouge +markdown: kramdown +theme: minima +kramdown: + parse_block_html: false + # This is the default, but be explicit as some EIPs depend on it + auto_ids: true + # This is to ensure more determistic behaviour + auto_id_stripping: true + syntax_highlighter: rouge + +permalink: /:slug + +defaults: + - + scope: + path: "RIPS" + values: + layout: "eip" + +exclude: + - .github + - Gemfile + - Gemfile.lock + - node_modules + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + - erc-template.md + - ISSUE_TEMPLATE.md + - PULL_REQUEST_TEMPLATE.md + - README.md + +include: + - LICENSE + +markdown_ext: "markdown,mkdown,mkdn,mkd,md" diff --git a/_data/statuses.yaml b/_data/statuses.yaml new file mode 100644 index 0000000..7d499fa --- /dev/null +++ b/_data/statuses.yaml @@ -0,0 +1,7 @@ +- Living +- Final +- Last Call +- Review +- Draft +- Stagnant +- Withdrawn diff --git a/_includes/anchor_headings.html b/_includes/anchor_headings.html new file mode 100644 index 0000000..8126b25 --- /dev/null +++ b/_includes/anchor_headings.html @@ -0,0 +1,109 @@ +{% capture headingsWorkspace %} +{% comment %} + Version 1.0.5 + https://github.com/allejo/jekyll-anchor-headings + + "Be the pull request you wish to see in the world." ~Ben Balter + + Usage: + {% include anchor_headings.html html=content %} + + Parameters: + * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll + + Optional Parameters: + * beforeHeading (bool) : false - Set to true if the anchor should be placed _before_ the heading's content + * anchorAttrs (string) : '' - Any custom HTML attributes that will be added to the `` tag; you may NOT use `href`, `class` or `title` + * anchorBody (string) : '' - The content that will be placed inside the anchor; the `%heading%` placeholder is available + * anchorClass (string) : '' - The class(es) that will be used for each anchor. Separate multiple classes with a space + * anchorTitle (string) : '' - The `title` attribute that will be used for anchors + * h_min (int) : 1 - The minimum header level to build an anchor for; any header lower than this value will be ignored + * h_max (int) : 6 - The maximum header level to build an anchor for; any header greater than this value will be ignored + * bodyPrefix (string) : '' - Anything that should be inserted inside of the heading tag _before_ its anchor and content + * bodySuffix (string) : '' - Anything that should be inserted inside of the heading tag _after_ its anchor and content + + Output: + The original HTML with the addition of anchors inside of all of the h1-h6 headings. +{% endcomment %} + +{% assign minHeader = include.h_min | default: 1 %} +{% assign maxHeader = include.h_max | default: 6 %} +{% assign beforeHeading = include.beforeHeading %} +{% assign nodes = include.html | split: ' + {% if headerLevel == 0 %} + + {% assign firstChunk = node | split: '>' | first %} + + + {% unless firstChunk contains '<' %} + {% capture node %}' | first }}>{% endcapture %} + {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} + + + {% capture anchor %}{% endcapture %} + + {% if html_id and headerLevel >= minHeader and headerLevel <= maxHeader %} + {% capture anchor %}href="#{{ html_id }}"{% endcapture %} + + {% if include.anchorClass %} + {% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %} + {% endif %} + + {% if include.anchorTitle %} + {% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', header }}"{% endcapture %} + {% endif %} + + {% if include.anchorAttrs %} + {% capture anchor %}{{ anchor }} {{ include.anchorAttrs }}{% endcapture %} + {% endif %} + + {% capture anchor %}{{ include.anchorBody | replace: '%heading%', header | default: '' }}{% endcapture %} + + + {% if beforeHeading %} + {% capture anchor %}{{ anchor }} {% endcapture %} + {% else %} + {% capture anchor %} {{ anchor }}{% endcapture %} + {% endif %} + {% endif %} + + {% capture new_heading %} + "}}">{{authorparts[1]|remove:">"}}> + {%- elsif author contains "(@" -%} + {%- assign authorparts=author|split:"(@" -%} + {{authorparts[0]|strip}} (@{{authorparts[1]|remove:")"}}) + {%- else -%} + {{author}} + {%- endif -%} + {% if forloop.last == false %}, {% endif %} +{%- endfor -%} diff --git a/_includes/eipnums.html b/_includes/eipnums.html new file mode 100644 index 0000000..4edcd30 --- /dev/null +++ b/_includes/eipnums.html @@ -0,0 +1,4 @@ +{% assign eips=include.eips|split:"," %} +{% for eipnum in eips %} + EIP-{{eipnum|strip}}{% if forloop.last == false %}, {% endif %} +{% endfor %} diff --git a/_includes/eiptable.html b/_includes/eiptable.html new file mode 100644 index 0000000..42429fb --- /dev/null +++ b/_includes/eiptable.html @@ -0,0 +1,36 @@ + +{% for status in site.data.statuses %} + {% assign eips = include.eips|where:"status",status|sort:"eip" %} + {% assign count = eips|size %} + {% if count > 0 %} +

{{status}}

+ + + {% if status == "Last Call" %} + + + {% else %} + + {% endif %} + + {% for page in eips %} + + + {% if status == "Last Call" and page.last-call-deadline != undefined %} + + {% endif %} + + + + {% endfor %} +
NumberReview endsTitleAuthor
NumberTitleAuthor
{{page.rip|xml_escape}}{{ page.last-call-deadline | xml_escape }}{{page.title|xml_escape}}{% include authorlist.html authors=page.author %}
+ {% endif %} +{% endfor %} diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..b53d34f --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,95 @@ + + + + + {% if page.layout == "eip" %} + {% if page.category == "ERC" %} + ERC-{{ page.rip }}: {{ page.title | escape }} + + {% else %} + EIP-{{ page.rip }}: {{ page.title | escape }} + + {% endif %} + + + + {% else %} + {{ page.title | escape }} | {{site.title}} + + + + + {% endif %} + + + + + + + + + + {%- feed_meta -%} + + + + + + + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..2afd73f --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,29 @@ + diff --git a/_includes/social.html b/_includes/social.html new file mode 100644 index 0000000..73b634b --- /dev/null +++ b/_includes/social.html @@ -0,0 +1,14 @@ + diff --git a/_includes/toc.html b/_includes/toc.html new file mode 100644 index 0000000..9c5bbf6 --- /dev/null +++ b/_includes/toc.html @@ -0,0 +1,96 @@ +{% capture tocWorkspace %} +{% comment %} + Version 1.0.10 + https://github.com/allejo/jekyll-toc + + "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe + + Usage: + {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %} + + Parameters: + * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll + + Optional Parameters: + * sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC + * class (string) : '' - a CSS class assigned to the TOC + * id (string) : '' - an ID to assigned to the TOC + * h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored + * h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored + * ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list + * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level + * baseurl (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content + * anchor_class (string) : '' - add custom class(es) for each anchor element + + Output: + An ordered or unordered list representing the table of contents of a markdown block. This snippet will only + generate the table of contents and will NOT output the markdown given to it +{% endcomment %} + +{% capture my_toc %}{% endcapture %} +{% assign orderedList = include.ordered | default: false %} +{% assign minHeader = include.h_min | default: 1 %} +{% assign maxHeader = include.h_max | default: 6 %} +{% assign nodes = include.html | split: ' maxHeader %} + {% continue %} + {% endif %} + + {% if firstHeader %} + {% assign firstHeader = false %} + {% assign minHeader = headerLevel %} + {% endif %} + + {% assign indentAmount = headerLevel | minus: minHeader %} + {% assign _workspace = node | split: '' | first }}>{% endcapture %} + {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} + + {% assign space = '' %} + {% for i in (1..indentAmount) %} + {% assign space = space | prepend: ' ' %} + {% endfor %} + + {% if include.item_class and include.item_class != blank %} + {% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %} + {% endif %} + + {% capture heading_body %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %} + {% capture my_toc %}{{ my_toc }} +{{ space }}{{ listModifier }} {{ listItemClass }} [{{ heading_body | replace: "|", "\|" }}]({% if include.baseurl %}{{ include.baseurl }}{% endif %}#{{ html_id }}){% if include.anchor_class %}{:.{{ include.anchor_class }}}{% endif %}{% endcapture %} +{% endfor %} + +{% if include.class and include.class != blank %} + {% capture my_toc %}{:.{{ include.class }}} +{{ my_toc | lstrip }}{% endcapture %} +{% endif %} + +{% if include.id %} + {% capture my_toc %}{: #{{ include.id }}} +{{ my_toc | lstrip }}{% endcapture %} +{% endif %} +{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }} diff --git a/_layouts/eip.html b/_layouts/eip.html new file mode 100644 index 0000000..084e316 --- /dev/null +++ b/_layouts/eip.html @@ -0,0 +1,149 @@ +--- +layout: default +--- + + + Alert + + + + Source + + + + Discuss + + + + +
+ + {% if page.status == "Stagnant" %} + 🚧 Stagnant + {% endif %} + {% if page.status == "Withdrawn" %} + 🛑 Withdrawn + {% endif %} + {% if page.status == "Draft" or page.status == "Review" %} + ⚠️ {{ page.status }} + {% endif %} + {% if page.status == "Last Call" %} + 📢 Last Call + {% endif %} + {% if page.category == "ERC" %} + Standards Track: ERC + {% elsif page.category == "Interface" %} + Standards Track: Interface + {% elsif page.category == "Networking" %} + Standards Track: Networking + {% elsif page.category == "Core" %} + Standards Track: Core + {% elsif page.type == "Informational" %} + Informational + {% elsif page.type == "Meta" %} + Meta + {% endif %} + +

+ {% if page.category == "ERC" %} + ERC-{{ page.rip | xml_escape }}: {{ page.title | xml_escape }} + {% elsif page.category != "ERC" %} + EIP-{{ page.rip | xml_escape }}: {{ page.title | xml_escape }} + {% endif %} + + + + + + + + + + +

+

{{ page.description | xml_escape }}

+ + + + + + + {% if page.created != undefined %} + + + + + {% endif %} + {% if page.last-call-deadline != undefined %} + + + + + {% endif %} + {% if page.status != "Review" and page.status != "Last Call" and page.status != "Final" and page.discussions-to != undefined %} + + + + + {% endif %} + {% if page.requires != undefined %} + + + + + {% endif %} + +
Authors{% include authorlist.html authors=page.author %}
Created{{ page.created }}
Last Call Deadline{{ page.last-call-deadline }}
Discussion Link{{ page.discussions-to | xml_escape }}
Requires{% include eipnums.html eips=page.requires %}
+
+ + {% if page.status == "Review" or page.status == "Last Call" %} + + {% endif %} + +
+

Table of Contents

+ {% include toc.html html=content sanitize=true h_max=3 %} +
+ + {% include anchor_headings.html html=content anchorClass="anchor-link" beforeHeading=true %} + +

Citation

+

Please cite this document as:

+ {% comment %} + IEEE specification for reference formatting: + https://ieee-dataport.org/sites/default/files/analysis/27/IEEE%20Citation%20Guidelines.pdf + {% endcomment %} +

{% include authorlist.html authors=page.author %}, "{% if page.category == "ERC" %}ERC{% else %}EIP{% endif %}-{{ page.rip | xml_escape }}: {{ page.title | xml_escape }}{% if page.status == "Draft" or page.status == "Stagnant" or page.status == "Withdrawn" or page.status == "Review" or page.status == "Last Call" %} [DRAFT]{% endif %}," Ethereum Improvement Proposals, no. {{ page.rip | xml_escape }}, {{ page.created | date: "%B %Y" }}. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-{{ page.rip | xml_escape }}.

+
+{% comment %} +Article schema specification: +https://schema.org/TechArticle +{% endcomment %} + + diff --git a/_site/404.html b/_site/404.html new file mode 100644 index 0000000..50388e2 --- /dev/null +++ b/_site/404.html @@ -0,0 +1,147 @@ + + + + + + + | Ethereum Rollup Improvement Proposals + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+

404

+

Page not found :(

+

The requested page could not be found.

+
+ +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/CNAME b/_site/CNAME new file mode 100644 index 0000000..de5ac15 --- /dev/null +++ b/_site/CNAME @@ -0,0 +1 @@ +rips.ethereum.org diff --git a/_site/LICENSE.html b/_site/LICENSE.html new file mode 100644 index 0000000..f7ec2db --- /dev/null +++ b/_site/LICENSE.html @@ -0,0 +1,269 @@ + + + + + + + | Ethereum Rollup Improvement Proposals + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+

+
+ +
+

Creative Commons Legal Code

+ +

CC0 1.0 Universal

+ +
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+HEREUNDER.
+
+ +

Statement of Purpose

+ +

The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an “owner”) of an original work of +authorship and/or a database (each, a “Work”).

+ +

Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works (“Commons”) that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others.

+ +

For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the “Affirmer”), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights.

+ +
    +
  1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights (“Copyright and +Related Rights”). Copyright and Related Rights include, but are not +limited to, the following:
  2. +
+ +

i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person’s image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof.

+ +
    +
  1. +

    Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer’s Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer’s heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer’s express Statement of Purpose.

    +
  2. +
  3. +

    Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer’s express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer’s Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +“License”). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer’s +express Statement of Purpose.

    +
  4. +
  5. +

    Limitations and Disclaimers.

    +
  6. +
+ +

a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person’s Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work.

+ +
+ +
+ +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/LICENSE.md b/_site/LICENSE.md new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/_site/LICENSE.md @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/_site/RIPS/rip-7212.html b/_site/RIPS/rip-7212.html new file mode 100644 index 0000000..aa39f40 --- /dev/null +++ b/_site/RIPS/rip-7212.html @@ -0,0 +1,510 @@ + + + + + + + + EIP-7212: Precompile for secp256r1 Curve Support + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Alert + + + + Source + + + + Discuss + + + + +
+ + + + + + + Standards Track: Core + + +

+ + EIP-7212: Precompile for secp256r1 Curve Support + + + + + + + + + + + +

+

Proposal to add precompiled contract that performs signature verifications in the “secp256r1” elliptic curve.

+ + + + + + + + + + + + + + + + +
AuthorsUlaş Erdoğan (@ulerdogan), Doğan Alpaslan (@doganalpaslan)
Created2023-06-22
+
+ + + + + +

+ + + Abstract + + +

+ +

This proposal creates a precompiled contract that performs signature verifications in the “secp256r1” elliptic curve by given parameters of message hash, r and s components of the signature, x and y coordinates of the public key. So that, any EVM chain - principally Ethereum rollups - will be able to integrate this precompiled contract easily.

+ +

+ + + Motivation + + +

+ +

“secp256r1” elliptic curve is a standardized curve by NIST which has the same calculations by different input parameters with “secp256k1” elliptic curve used by the “ecrecover” precompiled contract. The cost of combined attacks and the security conditions are almost the same for both curves. Adding a precompiled contract which is similar to “ecrecover” can provide signature verifications using the “secp256r1” elliptic curve in the smart contracts and multi-faceted benefits can occur. One important factor is that this curve is widely used and supported in many modern devices such as Apple’s Secure Enclave, Webauthn, Android Keychain which proves the user adoption. Additionally, the introduction of this precompiled contract could enable valuable features in the account abstraction which allows more efficient and flexible management of accounts by transaction signs in mobile devices. +Most of the modern devices and applications rely on the “secp256r1” elliptic curve. The addition of this precompiled contract enables the verification of device native transaction signing mechanisms. For example:

+ +
    +
  1. Apple’s Secure Enclave: There is a separate “Trusted Execution Environment” in Apple hardware which can sign arbitrary messages and can only be accessed by biometric identification.
  2. +
  3. Webauthn: Web Authentication (WebAuthn) is a web standard published by the World Wide Web Consortium (W3C). WebAuthn aims to standardize an interface for authenticating users to web-based applications and services using public-key cryptography. It is being used by almost all of the modern web browsers.
  4. +
  5. Android Keystore: Android Keystore is an API that manages the private keys and signing methods. The private keys are not processed while using Keystore as the applications’ signing method. Also, it can be done in the “Trusted Execution Environment” in the microchip.
  6. +
  7. Passkeys: Passkeys is utilizing FIDO Alliance and W3C standards. It replaces passwords with cryptographic key-pairs which is also can be used for the elliptic curve cryptography.
  8. +
+ +

Modern devices have these signing mechanisms that are designed to be more secure and they are able to sign transaction data, but none of the current wallets are utilizing these signing mechanisms. So, these secure signing methods can be enabled by the proposed precompiled contract to initiate the transactions natively from the devices and also, can be used for the key management. This proposal aims to reach maximum security and convenience for the key management.

+ +

+ + + Specification + + +

+ +

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119 and RFC 8174.

+ +

As of FORK_TIMESTAMP in the integrated EVM chain, add precompiled contract P256VERIFY for signature verifications in the “secp256r1” elliptic curve at address PRECOMPILED_ADDRESS in 0x100 (indicates 0x0000000000000000000000000000000000000100).

+ +

+ + + Elliptic Curve Information + + +

+ +

“secp256r1” is a specific elliptic curve, also known as “P-256” and “prime256v1” curves. The curve is defined with the following equation and domain parameters:

+ +
# curve: short weierstrass form
+y^2 ≡ x^3 + ax + b
+
+# p: curve prime field modulus
+0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff
+
+# a: elliptic curve short weierstrass first coefficient
+0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc
+
+# b: elliptic curve short weierstrass second coefficient
+0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b
+
+# G: base point of the subgroup
+(0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296,
+ 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5)
+
+# n: subgroup order (number of points)
+0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
+
+# h: cofactor of the subgroup
+0x1
+
+
+ +

+ + + Elliptic Curve Signature Verification Steps + + +

+ +

The signature verifying algorithm takes the signed message hash, the signature components provided by the “secp256r1” curve algorithm, and the public key derived from the signer private key. The verification can be done with the following steps:

+ +
# h (message hash)
+# pubKey = (public key of the signer private key)
+
+# Calculate the modular inverse of the signature proof:
+s1 = s^(−1) (mod n)
+
+# Recover the random point used during the signing:
+R' = (h * s1) * G + (r * s1) * pubKey
+
+# Take from R' its x-coordinate:
+r' = R'.x
+
+# Calculate the signature validation result by comparing whether:
+r' == r
+
+
+ +

+ + + Required Checks in Verification + + +

+ +

The following requirements MUST be checked by the precompiled contract to verify signature components are valid:

+ +
    +
  • Verify that the r and s values are in (0, n) (exclusive) where n is the order of the subgroup.
  • +
  • Verify that the point formed by (x, y) is on the curve and that both x and y are in [0, p) (inclusive 0, exclusive p) where p is the prime field modulus. Note that many implementations use (0, 0) as the reference point at infinity, which is not on the curve and should therefore be rejected.
  • +
+ +

+ + + Precompiled Contract Specification + + +

+ +

The P256VERIFY precompiled contract is proposed with the following input and outputs, which are big-endian values:

+ +
    +
  • Input data: 160 bytes of data including: +
      +
    • 32 bytes of the signed data hash
    • +
    • 32 bytes of the r component of the signature
    • +
    • 32 bytes of the s component of the signature
    • +
    • 32 bytes of the x coordinate of the public key
    • +
    • 32 bytes of the y coordinate of the public key
    • +
    +
  • +
  • Output data: 32 bytes of result data and error +
      +
    • If the signature verification process succeeds, it returns 1 in 32 bytes format.
    • +
    +
  • +
+ +

+ + + Precompiled Contract Gas Usage + + +

+ +

The use of signature verification cost by P256VERIFY is 3450 gas. Following reasons and calculations are provided in the Rationale and Test Cases sections.

+ +

+ + + Rationale + + +

+ +

“secp256r1” ECDSA signatures consist of v, r, and s components. While the v value makes it possible to recover the public key of the signer, most signers do not generate the v component of the signature since r and s are sufficient for verification. In order to provide an exact and more compatible implementation, verification is preferred over recovery for the precompile.

+ +

Existing P256 implementations verify (x, y, r, s) directly. We’ve chosen to match this style here, encoding each argument for the EVM as a uint256.

+ +

This is different from the ecrecover precompiled address specification. The advantage is that it 1. follows the NIST specification (as defined in NIST FIPS 186-5 Digital Signature Standard (DSS)), 2. matches the rest of the (large) P256 ecosystem, and most importantly 3. allows execution clients to use existing well-vetted verifier implementations and test vectors.

+ +

Another important difference is that the NIST FIPS 186-5 specification does not include a malleability check. We’ve matched that here in order to maximize compatibility with the large existing NIST P-256 ecosystem.

+ +

Wrapper libraries SHOULD add a malleability check by default, with functions wrapping the raw precompile call (exact NIST FIPS 186-5 spec, without malleability check) clearly identified. For example, P256.verifySignature and P256.verifySignatureWithoutMalleabilityCheck. Adding the malleability check is straightforward and costs minimal gas.

+ +

The PRECOMPILED_ADDRESS is chosen as 0x100 as P256VERIFY is the first precompiled contract presented as an RIP, and the address is the first available address in the precompiled address set that is reserved for the RIP precompiles.

+ +

The gas cost is proposed by comparing the performance of the P256VERIFY and the ECRECOVER precompiled contract which is implemented in the EVM at 0x01 address. It is seen that “secp256r1” signature verification is ~15% slower (elaborated in test cases) than “secp256k1” signature recovery, so 3450 gas is proposed by comparison which causes similar “mgas/op” values in both precompiled contracts.

+ +

+ + + Backwards Compatibility + + +

+ +

No backward compatibility issues found as the precompiled contract will be added to PRECOMPILED_ADDRESS at the next available address in the precompiled address set.

+ +

+ + + Test Cases + + +

+ +

Functional tests are applied for multiple cases in the reference implementation of P256VERIFY precompiled contract and they succeed. Benchmark tests are also applied for both P256VERIFY and ECRECOVER with some pre-calculated data and signatures in the “go-ethereum”s precompile testing structure to propose a meaningful gas cost for the “secp256r1” signature verifications by the precompiled contract implemented in the reference implementation. The benchmark test results by example data in the assets can be checked:

+ + + +
# results of geth benchmark tests of
+# ECRECOVER and P256VERIFY (reference implementation)
+# by benchstat tool
+
+goos: darwin
+goarch: arm64
+pkg: github.com/ethereum/go-ethereum/core/vm
+                                            │ compare_p256Verify │ compare_ecrecover  │
+                                            │       sec/op       │   sec/op           │
+PrecompiledP256Verify/p256Verify-Gas=3450-8          57.75µ ± 1%
+PrecompiledEcrecover/-Gas=3000-8                                   50.48µ ± 1%
+geomean                                              57.75µ        50.48µ
+
+                                            │ compare_p256Verify │ compare_ecrecover  │
+                                            │       gas/op       │   gas/op           │
+PrecompiledP256Verify/p256Verify-Gas=3450-8          3.450k ± 0%
+PrecompiledEcrecover/-Gas=3000-8                                   3.000k ± 0%
+geomean                                              3.450k        3.000k
+
+                                            │ compare_p256Verify │ compare_ecrecover │
+                                            │       mgas/s       │   mgas/s          │
+PrecompiledP256Verify/p256Verify-Gas=3450-8           59.73 ± 1%
+PrecompiledEcrecover/-Gas=3000-8                                   59.42 ± 1%
+geomean                                               59.73        59.42
+
+                                            │ compare_p256Verify │ compare_ecrecover │
+                                            │        B/op        │    B/op           │
+PrecompiledP256Verify/p256Verify-Gas=3450-8         1.523Ki ± 0%
+PrecompiledEcrecover/-Gas=3000-8                                   800.0 ± 0%
+geomean                                             1.523Ki        800.0
+
+                                            │ compare_p256Verify │ compare_ecrecover │
+                                            │     allocs/op      │ allocs/op         │
+PrecompiledP256Verify/p256Verify-Gas=3450-8           33.00 ± 0%
+PrecompiledEcrecover/-Gas=3000-8                                   7.000 ± 0%
+geomean                                               33.00        7.000
+
+
+ +

+ + + Reference Implementation + + +

+ +

Implementation of the P256VERIFY precompiled contract is applied to go-ethereum client to create a reference. Also, a “secp256r1” package has already been included in the Besu Native library which is used by Besu client. Other client implementations are in the future roadmap.

+ +

+ + + Security Considerations + + +

+ +

The changes are not directly affecting the protocol security, it is related with the applications using P256VERIFY for the signature verifications. The “secp256r1” curve has been using in many other protocols and services and there is not any security issues in the past.

+ + + +

Copyright and related rights waived via CC0.

+ +

Citation

+

Please cite this document as:

+ +

Ulaş Erdoğan (@ulerdogan), Doğan Alpaslan (@doganalpaslan), "EIP-7212: Precompile for secp256r1 Curve Support," Ethereum Improvement Proposals, no. 7212, June 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7212.

+
+ + + + +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/RIPS/rip-7560.html b/_site/RIPS/rip-7560.html new file mode 100644 index 0000000..16bc6d9 --- /dev/null +++ b/_site/RIPS/rip-7560.html @@ -0,0 +1,1573 @@ + + + + + + + + EIP-7560: Native Account Abstraction + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Alert + + + + Source + + + + Discuss + + + + +
+ + + + + ⚠️ Draft + + + + Standards Track: Core + + +

+ + EIP-7560: Native Account Abstraction + + + + + + + + + + + +

+

An account abstraction proposal that introduces consensus-layer protocol changes, instead of relying on higher-layer infrastructure.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
AuthorsVitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Alex Forshtat (@forshtat), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn)
Created2023-09-01
Discussion Linkhttps://ethereum-magicians.org/t/rip-7560-native-account-abstraction/16664
Requires + + EIP-4337, + + EIP-6780 + +
+
+ + + + + +

+ + + Abstract + + +

+ +

Combining the EIP-2938 +and ERC-4337 +into a comprehensive Native Account Abstraction proposal.

+ +

We propose splitting the Ethereum transaction scope into multiple steps: validations, execution, +and post-transaction logic. +Transaction validity is determined by the result of the validation steps of a transaction.

+ +

We further separate transaction validation for the purposes of authorization and the gas fee payment, +allowing contract B to pay gas for a transaction that will be executed from account contract A.

+ +

The benefits are in backward compatibility with the emerging ERC-4337 ecosystem while achieving the +long-term goal of Native Account Abstraction.

+ +

+ + + Motivation + + +

+ +

ERC-4337 can do a lot as a purely voluntary ERC. However, any of the out-of-protocol ways of achieving +Account Abstraction faces several drawbacks compared to native support. There are a few key areas where +it is weaker than a truly in-protocol solution:

+ +
    +
  • +

    Existing users cannot benefit from it or upgrade to use it without moving all their assets and activity +to a new account.

    +
  • +
  • +

    Extra gas overhead of ~42k for a basic UserOperation compared to ~21k for a basic transaction.

    +
  • +
  • +

    Less benefit from in-protocol censorship resistance techniques such as crLists, which target transactions +and would miss UserOperations.

    +
  • +
  • +

    Relying on a significantly smaller set of participating nodes and non-standard RPC methods like +eth_sendRawTransactionConditional.

    +
  • +
  • +

    Inability to use tx.origin or contracts that rely on it as it returns the meaningless address of a bundler.

    +
  • +
+ +

EIP-2938 defines a very mature alternative approach to Account Abstraction. However, it does not translate +well to the architecture of ERC-4337 that is being used in production without any protocol changes. +Therefore, the implementation of EIP-2938 will not benefit as much from the production experience gained by using +ERC-4337 and from maintaining backward compatibility with it.

+ +

There is also a possibility that at some point in the future, the EOAs on Ethereum will be replaced with pre-deployed +smart contracts. This, however, is impossible without an addition of Native Account Abstraction to the protocol.

+ +

+ + + Specification + + +

+ +

+ + + Constants + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValue
FORK_BLOCKTBD
AA_TX_TYPE4
AA_ENTRY_POINTaddress(7560)
AA_SENDER_CREATORaddress(ffff7560)
AA_NONCE_MANAGERTODO
AA_BASE_GAS_COST15000
AA_ECRECOVER_COST6000
VERSION1
MAGIC_VALUE_SENDER0xbf45c166 // bytes4(keccak256(“validateTransaction(uint256,bytes32,bytes)”))
MAGIC_VALUE_PAYMASTER0xe0e6183a // bytes4(keccak256(“validatePaymasterTransaction(uint256,bytes32,bytes)”))
MAX_CONTEXT_SIZE65536
UNUSED_GAS_PENALTY10
+ +

+ + + New Transaction Type + + +

+ +

A new EIP-2718 transaction with type AA_TX_TYPE is introduced. Transactions of this type are referred to as +“AA transactions”. Their payload should be interpreted as:

+ +

+0x04 || 0x00 || rlp([
+  chainId, sender, nonce, builderFee,
+  callData, paymasterData, deployerData,
+  maxPriorityFeePerGas, maxFeePerGas,
+  validationGasLimit, paymasterGasLimit, callGasLimit,
+  accessList, signature
+])
+
+
+ +

The base gas cost of this transaction is set to AA_BASE_GAS_COST instead of 21000 to reflect the lack of “intrinsic” +ECDSA signature verification.

+ +

If paymasterData is specified, its first 20 bytes contain the address of a paymaster contract.

+ +

If deployerData is specified, its first 20 bytes contain the address of a deployer contract.

+ +

+ + + Optional “transaction counter header” + + +

+ +

In some cases the block builders may want to split up an array of type AA_TX_TYPE transactions into individual +batches of transactions that perform validations and executions separately.

+ +

Without a header transaction type this would only be possible by creating an artificial legacy type transaction. +Instead, we propose to introduce an explicit “counter” transaction subtype.

+ +

Their payload should be interpreted as:

+ +
0x04 || 0x01 || rlp([chainId, transactionCount])
+
+ +

Header transactions have a unique hash calculated as follows:

+ +
keccak256(AA_TX_TYPE || 0x01 || rlp(chainId, transactionCount, blockNumber, txIndex))
+
+ +

The blockNumber and txIndex parameters are added to the hash to achieve unique header transaction IDs.

+ +

The header transactions are only used to help execution clients determine how many of the AA_TX_TYPE transactions +belong to each individual batch. +The block is not valid if a header transaction is located anywhere except before an AA_TX_TYPE transactions.
+If a header transaction is included all AA_TX_TYPE transactions in the block must be covered by one.

+ +

Header transactions do not affect blockchain state and do not cost any gas.

+ +

+ + + Non-sequential nonce support + + +

+ +

Before RIP-7560, for accounts with associated code (smart contracts), the account nonce is only used and incremented +when the account executes the CREATE (0xf0) opcode.

+ +

However, with Smart Contract Accounts this creates a bottleneck for some use-cases. +For example, an account that is operated by multiple participants simultaneously will require these participants +to coordinate their transactions to avoid invalidating each other.

+ +

Another example when this can also be a limitation is a case where there are separate execution flows. +A configuration change may require multiple participants to co-sign a transaction but a regular operation does not. +With sequential nonces, all operations will have to be halted until the configuration change is executed.

+ +

To address it we propose an introduction of a separate 2-dimensional nonce used when contracts initiate a transaction.

+ +

The nonce parameter of the transaction is to be interpreted as uint192 key || uint64 seq value. +The contract account nonce is then defined as a mapping address account => uint192 key => uint64 seq. +This approach guarantees unique transaction nonce and hash but removes the requirement of nonce being sequential +numbers.

+ +

This nonce is exposed to the EVM in a NonceManager pre-deployed contract located at the AA_NONCE_MANAGER address.

+ +

The nonce is validated and incremented on-chain before the rest of the validation code.

+ +

The old nonce account parameter remains in use for transactions initiated by EOAs and for the CREATE opcode.

+ +

+ + + NonceManager Pseudocode + + +

+ +

+if evm.caller == AA_ENTRY_POINT:
+    validate_increment()
+else:
+    get()
+
+def get():
+    if len(evm.calldata) != 44:
+        evm.revert()
+
+    // address sender, uint192 key
+    address = to_uint160_be(evm.calldata[0:20])
+    key = to_uint192_be(evm.calldata[20:44])
+
+    nonce = storage.get(keccak(address, key))
+
+    evm.return((key << 64) + nonce)
+
+def validate_increment():
+
+    address = to_uint160_be(evm.calldata[0:20])
+    key = to_uint192_be(evm.calldata[20:44])
+    nonce = to_uint64_be(evm.calldata[44:52])
+
+    current_nonce = storage.get(keccak(address, key))
+
+    if (nonce != current_nonce):
+        evm.revert()
+
+    storage.set(kecca
+    k(address, key), current_nonce + 1)
+
+
+ +

+ + + NonceManager Bytecode and deployment + + +

+ +

TODO.

+ +

+ + + Gas fees are charged directly from the contract balance + + +

+ +

The maximum gas cost of the AA_TX_TYPE transaction is defined as:

+ +

+maxPossibleGasCost = AA_BASE_GAS_COST +
+  callGasLimit +
+  paymasterGasLimit +
+  validationGasLimit
+
+
+ +

If paymaster is not specified, the maxPossibleGasCost is charged up-front, before any computation is done in any +execution frame, from the balance of the sender address. +If paymaster is specified, the gas cost is charged from its balance. +The transaction is invalid if the balance of the account that is being pre-charged, +whether it is a sender or a paymaster, is insufficient. +After the transaction finishes its execution, the address that was pre-charged may receive a gas refund.

+ +

+ + + Gas fees charged for transaction input + + +

+ +

For all the existing transaction types, G_txdatazero (4 gas) and G_txdatanonzero (16 gas) per byte is +charged for the data parameter.

+ +

Transaction Type AA_TX_TYPE introduces the following dynamic length inputs: callData, paymasterData, +deployerData, signature. Each of these parameters’ gas cost is counted towards transaction data cost. +This transaction data gas cost is referred to as calldataCost and is subtracted from the validationGasLimit +before execution of the transaction. +The transaction is considered INVALID if validationGasLimit is smaller than calldataCost.

+ +

+ + + Builder Fee + + +

+ +

As we need to account for an additional off-chain work that block builders have to perform to +include AA_TX_TYPE transactions in their blocks, as well as a potential L1 gas cost for builders +operating on L2 rollups, and given that this work does not correspond to the amount of gas spent on +validation and is not linked to the gas price, the sender may decide +to pay an extra builderFee as a “tip” to the block builder.

+ +

This value is denominated in wei and is passed from the sender, or the paymaster if it is specified, +to the coinbase of the current block as part of the gas pre-charge.

+ +

+ + + Unused gas penalty charge + + +

+ +

Transactions of type AA_TX_TYPE that reserve a lot of gas for themselves using validationGasLimit, +paymasterGasLimit and callGasLimit fields but do not use the reserved gas present a challenge for +block builders. This is especially demanding in case a gas used by a transaction can be significantly different +based on its position within a block, as such transactions may cause the block builder to iterate its algorithm +many times until a fully utilized block is discovered.

+ +

A penalty of UNUSED_GAS_PENALTY percent of the entire unused gas limit is charged from the +transaction sender or paymaster.

+ +

The total gas limit is calculated as totalLimit = validationGasLimit + paymasterGasLimit + callGasLimit.
+The totalGasUsed is calculated as a sum of all gas used during the transaction.
+The unused gas is calculated as unusedGas = totalLimit - totalGasUsed.

+ +

+ + + Multiple execution frames for a single transaction + + +

+ +

All existing transaction types only have an implicit validation phase where balance, nonce, and signature are checked, +and a single top-level execution frame with +tx.origin == msg.sender which is the address that is determined by a transaction ECDSA signature.

+ +

When processing a transaction of type AA_TX_TYPE, however, multiple execution frames will be created. +The full list of possible frames tries to replicate the ERC-4337 flow:

+ +
    +
  1. Validation Phase +
      +
    • nonce validation and increment frame (required)
    • +
    • sender deployment frame (once per account)
    • +
    • sender validation frame (required)
    • +
    • paymaster validation frame (optional)
    • +
    +
  2. +
  3. Execution Phase +
      +
    • sender execution frame (required)
    • +
    • paymaster post-transaction frame (optional)
    • +
    +
  4. +
+ +

All execution frames in the “Validation Phase” must be completed successfully without reverting, and the return value +for sender and paymaster validation frames must include MAGIC_VALUE_SENDER and MAGIC_VALUE_PAYMASTER accrodingly +in order for the transaction to be considered valid for a given position in a block.

+ +

In terms of block validity, all validation and execution frames may read and write any state when included in the block. +However, the AA transactions in the mempool SHOULD be bound by storage access rules to avoid DoS on block builders. +These rules are defined in ERC-7562.

+ +

In all top-level frames, the global variables have the following meaning:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Opcode NameSolidity EquivalentValue
CALLERmsg.senderThe AA_ENTRY_POINT address. AA_SENDER_CREATOR for the “deployment frame”.
ORIGINtx.originThe transaction sender address
CALLDATA*msg.dataThe transaction data is set to inputs of the corresponding frame
+ +

+ + + Nonce validation frame + + +

+ +

The NonceManager is invoked with the following data:

+ +
abi.encodePacked(sender, nonce)
+
+ +

+ + + Sender deployment frame + + +

+ +

The deployer address is invoked with the deployerData[20:] as call data input. +It is important that the deployer is not invoked from the AA_ENTRY_POINT but from the AA_SENDER_CREATOR. +This is necessary to guarantee that AA_ENTRY_POINT may never initiate a call to a sender execution function +without first completing a successful validation.

+ +

The gas limit of this frame is set to validationGasLimit. +The amount of gas used by this frame is referred to as senderCreationGasUsed.

+ +

The sender deployment frame MUST result in the sender address becoming +initialized with contract code.

+ +

+ + + Sender validation frame + + +

+ +

We define the following Solidity struct to represent the AA transaction on-chain:

+ +

+struct TransactionType4 {
+    address sender;
+    uint256 nonce;
+    uint256 validationGasLimit;
+    uint256 paymasterGasLimit;
+    uint256 callGasLimit;
+    uint256 maxFeePerGas;
+    uint256 maxPriorityFeePerGas;
+    uint256 builderFee;
+    bytes paymasterData;
+    bytes deployerData;
+    bytes callData;
+    bytes signature;
+}
+
+
+ +

We then define the following Solidity method and the sender of the transaction is invoked with the corresponding data:

+ +

+function validateTransaction(uint256 version, bytes32 txHash, bytes transaction) external returns (uint256 validationData);
+
+
+ +

The gas limit of this frame is set to validationGasLimit - senderCreationGasUsed - calldataCost.
+The transaction parameter is interpreted as an ABI encoding of TransactionType4.
+The txHash parameter represents the hash of the AA_TX_TYPE transaction with empty signature, as defined in section +Calculation of Transaction Type AA_TX_TYPE hash.
+The version parameter is added in order to maintain the Solidity method ID in case of changes to this struct +in future revisions of this EIP.

+ +

The amount of gas used by this frame is referred to as senderValidationGasUsed.

+ +

The frame must return 32 bytes validationData that is interpreted as:

+ +

+abi.encodePacked(MAGIC_VALUE_SENDER, validUntil, validAfter)
+
+
+ +

In order to allow a gas estimation to determine the amount of gas that this frame +requires to complete successfully while not having the actual signature value, this function +should avoid reverting on invalid signature, and should return a value different from MAGIC_VALUE_SENDER.

+ +

Type of the validUntil is 6-byte timestamp value, or zero for “infinite”. The transaction is valid only up to this time. +Type of the validAfter is 6-byte timestamp. The transaction is valid only after this time.

+ +

The validateTransaction function can choose to revert on any condition that can be satisfied during gas estimation.

+ +

+ + + Paymaster validation frame + + +

+ +

The paymaster of the transaction, if specified, is invoked with the following data:

+ +

+function validatePaymasterTransaction(uint256 version, bytes32 txHash, bytes transaction) external returns (bytes context, uint256 validationData);
+
+
+ +

The gas limit of this frame is set to paymasterGasLimit.

+ +

The amount of gas used by this frame is referred to as paymasterValidationGasUsed.

+ +

The transaction parameter is interpreted as an ABI encoding of TransactionType4.
+The txHash parameter represents the hash of the AA_TX_TYPE transaction with empty signature, as defined in section +Calculation of Transaction Type AA_TX_TYPE hash.

+ +

The frame must return a bytes array that is interpreted as:

+ +

+abi.encode(context, MAGIC_VALUE_PAYMASTER, validUntil, validAfter)
+
+
+ +

Same as in the sender validation frame, in order to support gas estimation this +frame should return a value different from MAGIC_VALUE_PAYMASTER for conditions that cannot be satisfied +before signing.

+ +

The size of the context byte array may not exceed MAX_CONTEXT_SIZE for a transaction to be considered valid.

+ +

+ + + Sender execution frame + + +

+ +

The sender address is invoked with callData input.

+ +

The gas limit of this frame is set to callGasLimit.
+Calculation of the calldataCost value is defined in the +Gas fees charged for transaction input section.
+The amount of gas used by this frame is referred to as gasUsedByExecution.

+ +

The validation frames do not revert if the execution frame reverts. +The postPaymasterTransaction may still be called with a success: false flag.

+ +

+ + + Paymaster post-transaction frame + + +

+ +

After the sender execution frame is over the paymaster may need to perform some post-transaction logic, +for instance to perform some kind of cleanup or bookkeeping. +If the gas payment validation returned a non-zero context, the paymaster is invoked again +with the following inputs:

+ +

+function postPaymasterTransaction(bool success, uint256 actualGasCost, bytes context) external;
+
+
+ +

The actualGasCost parameter is the actual amount paid by the paymaster for this transaction, +and success indicates whether this transaction’s execution frame completed without revert.

+ +

The gas limit of this frame is set to paymasterGasLimit - paymasterValidationGasUsed.

+ +

Revert in the postPaymasterTransaction frame reverts the transaction’s execution frame as well. +The validation frames do not revert if the postPaymasterTransaction frame reverts. +The gas fees charged from the paymaster will still include the gas cost of the reverted execution frame.

+ +

+ + + Execution flow diagram + + +

+ +

The execution flow determined by an Account Abstraction Transaction is visualised by the following flow diagram:

+ +

+Execution flow for the Native Account Abstraction Transactions

+ +

+ + + Execution layer transaction validation + + +

+ +

On the execution layer, the transaction validity conditions for a block are extended as follows:

+ +

+func validateAccountAbstractionTransaction(tx *Transaction) {
+    assert !(sender.code.length > 0 && deployerData.length > 0)
+
+    if (sender.code.length == 0 && deployerData.length == 0) {
+        validUntil = (nonce >> 112) & 0xffffffffffff
+        validAfter = (nonce >> 160) & 0xffffffffffff
+        assert Date.now() <= validUntil
+        assert Date.now() >= validAfter
+    }
+
+    if (sender.code.length == 0 && deployerData.length > 0) {
+        assert deployerData.length >= 20
+        deployer := deployerData[0:20]
+        calldataCost := calculateCalldataCost(tx)
+        retDeployer, error := evm.Call(
+            from: AA_SENDER_CREATOR,
+            to: deployer,
+            input: deployerData[20:],
+            gas: validationGasLimit - calldataCost)
+        assert error == nil
+        assert sender.code.length > 0
+    }
+
+    if (paymasterData.length > 0) {
+        assert paymasterData.length >= 20
+        paymaster := paymasterData[0:20]
+        paymasterInput := ABI.encodeWithSelector('validatePaymasterTransaction', tx, tx.hash)
+        retPaymaster, error := evm.Call(
+            from: AA_ENTRY_POINT,
+            to: paymaster,
+            input: paymasterInput,
+            gas: paymasterGasLimit)
+        assert error == nil
+        assert Date.now() <= retPaymaster.validUntil
+        assert Date.now() >= retPaymaster.validAfter
+        assert retPaymaster.isValid
+    }
+
+    if (sender.code.length == 0) {
+      signer := ecrecover(tx.hash, tx.signature)
+      assert signer == sender.address
+    } else {
+      senderInput := ABI.encodeWithSelector('validateTransaction', tx, tx.hash);
+      retSender, error := evm.Call(
+          from: AA_ENTRY_POINT,
+          to: sender,
+          input: senderInput,
+          gas: validationGasLimit - retDeployer.gasUsed)
+      assert error == nil
+      assert Date.now() <= retSender.validUntil
+      assert Date.now() >= retSender.validAfter
+      assert retSender.isValid
+    }
+}
+
+
+ +

In order to defend from DoS attack vectors, the block builders performing mempool transaction validation SHOULD consider +the opcode banning and storage access rules described in ERC-7562.

+ +

Block validation takes roughly the same amount of work as without AA transactions. +In any case, validation must execute the entire block in order to verify the state change. +During this execution, it currently verifies signatures, nonces, and gas payment. +With Account Abstraction, it will also verify that all the validation frames were successful. +There is a slight increase in required memory mostly used to store the context value that is passed from +the paymaster validation frame to its post-transaction frame.

+ +

As long as all transaction validation steps return correct values the block is considered valid. +Block builders who are willing to relax the rules applied to the validation frames MAY do so.

+ +

Such transactions MUST NOT be propagated through the default transaction mempool as they will be rejected by the nodes +and the sending node will be blocked as a spammer. +They may be propagated in the alternative mempool that allows them explicitly as defined in ERC-7562.

+ +

+ + + All validation state changes apply before all execution ones + + +

+ +

Filling a block with AA transactions must not be a challenge for the block builder. +However, if each transaction during its execution can alter any state that affects the validity of another transaction +in the mempool, the block builder will be forced to revalidate all transactions in the mempool after each inclusion.

+ +

We mitigate that by applying all changes in all the validation frames of a sequence of AA transactions first +and all execution frames apply immediately after that.

+ +

In theory, the validation frames can also invalidate each other, but we define ways to prevent that by applying +certain rules for the mempool transactions in ERC-7562.

+ +

A builder that chooses not to enforce the rules from ERC-7562 must take care to re-validate each transaction +against the mid-block state at the position where it is being included into a block. +Otherwise, the resulting block is likely to end up being invalid.

+ +

+ + + Block structure diagram + + +

+ +

Here is a visual representation of a block that contains multiple Account Abstraction Transactions. +The validation parts of AA transactions are executed as separate transactions, +but are not represented as separate transactions in the block data.

+ +

+The structure of a block containing multiple Native Account Abstraction Transactions

+ +

Zooming into a single transaction, the validation part of an AA transaction may include multiple exectution frames:

+ +

+Frames within a single Native Account Abstraction Transaction within a block

+ +

+ + + Validation state change virtual transactions + + +

+ +

The validation frames of the AA_TX_TYPE transaction are represented as individual virtual transactions by the clients. +They are assigned their own sequential transactionIndex, and their transactionHash is defined as +(AA_TX_TYPE transaction hash + 1).

+ +

All block-related RPC methods, like eth_getBlockByHash and eth_getBlockByNumber, must include these virtual +transactions as part of the transactions field and include validation in the block transaction count.

+ +

All transaction-related RPC methods, like eth_getTransactionByHash and eth_getTransactionReceipt, must +accept the virtual transaction hash as input and return the details calculated as if the validation was a +separate transaction.

+ +

There is a number of behaviours that define transaction-wide effects in Ethereum. +This list includes, but is not limited to:

+ +
    +
  • Tracking accessed_addresses
  • +
  • EIP-1283 Gas metering for SSTORE
  • +
  • EIP-1153 Transient storage opcodes
  • +
+ +

Any such behaviour has separate effects in the “Validation Virtual Transaction” and “Execution Transaction”.

+ +

Gas refunds are issued at the end of the entire transaction only.

+ +

+ + + Transaction validity time range parameters + + +

+ +

The Paymaster validation frame and the Sender validation frame each return values validUntil and validAfter. +If the transaction is initiated by an EOA, these fields may be encoded into unused bits of the nonce.

+ +

These values allow the sender and paymaster contracts to specify +a time range for the blocks the transaction will be valid for.

+ +

Transaction cannot be included in a block outside of this time range. +If included, such a block is considered invalid.

+ +

Passing validUntil = 0 and validAfter = 0 disables the check.

+ +

+ + + Calculation of Transaction Type AA_TX_TYPE hash + + +

+ +

+keccak256(AA_TX_TYPE || 0x00 || rlp(transaction_payload)
+
+
+ +

Note that the chainId and accessList parameters are included in the transaction hash calculation but are not +available on-chain as part of the TransactionType4 struct.

+ +

In order to calculate the transaction hash that will be used during the signing of the transaction and validation of +the transaction signature by the sender, the value of the signature parameter is considered to be an empty +byte array.

+ +

+ + + Accepting EOA account as sender to achieve native gas abstraction + + +

+ +

In case the sender address does not have any code deployed and the deployerData length is zero, +interpret the signature parameter as (y_parity, r, s) and the nonce parameter +as (validUntil, validAfter, nonce). +Replace the sender validation frame with default ECDSA signature validation. +Also check the block timestamp is within the [validUntil, validAfter] range.

+ +

The base transaction gas cost, in this case, is increased by AA_ECRECOVER_COST.

+ +

The callData parameter in this case is interpreted as following:

+ +

+target || value || data
+
+
+ +

+ + + Execution layer block validation + + +

+ +

When validating a block, the validity conditions for a block are extended as follows:

+ +

+for txIndex := 0; txIndex < range block.Transactions.Len(); txIndex++ {
+
+    // 1. Save the current transaction
+    txCurr = block.Transactions[txIndex]
+
+    if (txCurr.Type() == AccountAbstractionTransaction) {
+
+      // 2. Start running validations for AA transactions
+      for j := txIndex; j < range block.Transactions().Len(); j++ {
+        tx = block.Transactions[j]
+
+        // 3. Stop after encountering a non-AA transaction (or reaching the end of the block)
+        if (tx.Type() != AccountAbstractionTransaction) {
+          break
+        }
+        context[j], paymasterValidationGasUsed[j], error := validateAccountAbstractionTransaction(tx)
+        assert error == nil
+      }
+
+      // 4. If all validations are successful, go back to the saved tx index and run all executions
+      for j := txIndex; j < range block.Transactions().Len(); j++ {
+        tx = block.Transactions[j]
+        if (tx.Type() != AccountAbstractionTransaction) {
+          break
+        }
+
+        retCall, error := evm.Call(
+            from: AA_ENTRY_POINT,
+            to: sender,
+            input: callData,
+            gas: callGasLimit)
+
+        txIndex := j // transaction executed - no need to revisit in the outer loop
+
+
+        // 5. Run paymaster's post-transaction logic if necessary
+        if (context[j].Len() == 0){
+          continue
+        }
+
+        paymasterPostTransactionInput := ABI.encodeWithSelector('postPaymasterTransaction', success, actualGasCost, context[j])
+        retPostTransaction, error := evm.Call(
+            from: AA_ENTRY_POINT,
+            to: paymaster,
+            input: paymasterPostTransactionInput,
+            gas: paymasterGasLimit - paymasterValidationGasUsed[j])
+      }
+   }
+   else {
+      // handle other types of transactions
+      evm.Apply(txCurr)
+   }
+}
+
+
+ +

+ + + RPC methods (eth namespace) + + +

+ +

+ + + eth_sendTransaction and eth_sendRawTransaction + + +

+ +

Accepts Transaction Type AA_TX_TYPE.

+ +

Return values unchanged for a successful call.

+ +

In case of failure, MUST return an error result object, with code and message. +The error code and message SHOULD be set as follows:

+ +
    +
  • +

    code: -32500 - transaction validation failed by sender. +The message field SHOULD be set to the revert message from the sender.

    +
  • +
  • +

    code: -32501 - transaction validation failed by paymaster. +The message field SHOULD be set to the revert message from the paymaster.

    +
  • +
  • +

    code: -32502 - transaction rejected because of storage or opcode rules violation in a validation frame. +The message field SHOULD be set to the location and description of the violated rule.

    +
  • +
  • +

    code: -32503 - Transaction out of time range.

    +
  • +
  • +

    code: -32504 - transaction rejected because paymaster is throttled or banned, as defined by ERC-7562.

    +
  • +
  • +

    code: -32505 - transaction rejected because factory is throttled or banned.

    +
  • +
  • +

    code: -32506 - transaction rejected because sender is throttled or banned.

    +
  • +
+ +

+ + + eth_signTransaction + + +

+ +

Accepts Transaction Type AA_TX_TYPE.

+ +

Returns the RLP-encoded transaction object with value for the signature field that makes the AA_TX_TYPE +transaction valid.

+ +

Returns error object if this operation cannot be performed by the RPC endpoint.

+ +

+ + + eth_getTransactionReceipt + + +

+ +

Accepts the hash of a virtual transaction that encapsulates the validation frames of the AA_TX_TYPE transaction. +This transaction’s ID is defined as (AA_TX_TYPE transaction hash + 1).

+ +

If an AA transaction is included in a block, returns the following values in addition to the existing fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValue
senderAddress of the sender of this transaction
nonceThe transaction nonce value
paymasterAddress of the Paymaster if it is paying for the transaction, null otherwise
deployerAddress of the Deployer if it is included in the transaction, null otherwise
senderCreationGasUsedThe amount of gas actually used by the sender deployment frame
senderValidationGasUsedThe amount of gas actually used by the sender validation frame
paymasterValidationGasUsedThe amount of gas actually used by the paymaster validation frame
+ +

Accepts hash of Transaction Type AA_TX_TYPE.

+ +

If an AA transaction is included in a block, returns the following values in addition to the existing fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValue
statusEither 1 (success) or 0 (failure) status of the execution frame
executionGasUsedThe amount of gas actually used by the execution frame
postPaymasterTransactionStatusEither 1 (success), 0 (failure), or null (did not run) status of the postPaymasterTransaction frame
postPaymasterTransactionGasUsedThe amount of gas actually used by the paymaster postPaymasterTransaction frame
+ +

Note that the field to is not included as there is no clear target in an AA_TX_TYPE transaction.

+ +

+ + + eth_call + + +

+ +

Accepts Transaction Type AA_TX_TYPE with all fields except from and callData optional.

+ +

Returns the return value of the sender execution frame.

+ +

If provided with paymasterData and deployerData also executes the corresponding frame.

+ +

If any of the frames reverts the call returns the revert data of each reverted frame.

+ +

+ + + eth_estimateGasAccountAbstraction + + +

+ +

Accepts Transaction Type AA_TX_TYPE with fields validationGasLimit, paymasterGasLimit, callGasLimit optional.

+ +

Optionally accepts the State Override Set to allow users to modify the state during the gas estimation. +This field as well as its behavior is equivalent to the ones defined for eth_call RPC method.

+ +

Returns {validationGasLimit, paymasterGasLimit, callGasLimit, builderFee} object.

+ +

Note that the deployerData and paymasterData fields are required for a consistent result.

+ +

As mentioned earlier, the sender and paymaster contracts should not revert on the validation failure +and should return a value different from MAGIC_VALUE_SENDER or MAGIC_VALUE_PAYMASTER accordingly +in order to enable gas estimation.

+ +

One acceptable way to achieve this behavior for Smart Contract Accounts is to compare the signature parameter to +a predetermined “dummy signature” and to return without reverting in case the values match. +This will not result in transaction being authorized as long as returned value does not include MAGIC_VALUE_SENDER.

+ +

+ + + Rationale + + +

+ +

+ + + Using Solidity method selectors in a Core EIP + + +

+ +

The contracts that have a role in this Account Abstraction proposal, such as sender or paymaster, +MUST know which code to execute and understand the calldata provided to them in order to validate the transaction.

+ +

We argue that the most straightforward implementation is to rely on Solidity 4-byte method selectors as it is an +established de-facto standard.

+ +

+ + + Accepting AA_TX_TYPE transactions from EOAs + + +

+ +

While it may seem like allowing EOAs to initiate AA_TX_TYPE transactions contradicts the purpose of Account Abstraction, we argue that this +may actually be important for the adoption of Smart Contract Accounts.

+ +

It will enable all existing EOAs to benefit from the improved UX features like gas abstraction and validity ranges.

+ +

In the future, this can be used to pay gas for transactions that add code to the EOA addresses, +once Ethereum implements changes like the ones proposed in +EIP-5003: Insert Code into EOAs with AUTHUSURP, +EIP-6913: SETCODE instruction and +EIP-7377: Migration Transaction.

+ +

+ + + Backwards Compatibility + + +

+ +

This EIP preserves most of the design elements established by the ERC-4337. This allows the same client code and smart +contracts to be used in both systems with minimal to no modifications, while providing significant UX improvements.

+ +

Existing contracts are not significantly affected by the change. +The assumption that tx.origin is guaranteed to be an EOA is no longer valid. +The assumption that tx.origin is the address that pays for the current transaction is no longer valid as well.

+ +

Any code that expects a single top-level execution frame for an Ethereum transaction will have to accommodate +the new transaction type.

+ +

EIP-3607 introduces a ban on transactions from senders with deployed code. +This limitation does not apply to AA_TX_TYPE transactions.

+ +

+ + + Migration path for existing ERC-4337 projects and further roadmap + + +

+ +

+ + + Existing bundlers can co-exist on the network + + +

+ +

The ERC-4337 is not a protocol change and may remain operational in parallel to this EIP indefinitely. +Given the similarity to ERC-4337, the same block builders may easily support both ERC-4337 and AA_TX_TYPE transactions.

+ +

+ + + Accounts need to upgrade their EntryPoint to an adapter contract + + +

+ +

The team behind ERC-4337 will provide a reference implementation of a contract converting +the ABI of the paymaster and sender contracts. This adapter can be set as a trusted +EntryPoint address by the ERC-4337 contracts.

+ +

+ + + Supporting ERC-4337 RPC calls as a compatibility layer + + +

+ +

The sender contracts MAY support both ERC-4337 and AA_TX_TYPE transactions during a transition period, +as long as this EIP may be adopted by some chains and not by others.

+ +

+ + + Security Considerations + + +

+ +

This EIP creates a complex and sophisticated mechanism and aims to expand the usage of Smart Contract Accounts. +All of it creates a lot of new risk vectors and attack surfaces.

+ +

The following is a non-exhaustive list of known security considerations regarding Native Account Abstraction.

+ +

+ + + Attacks on validation-execution separation + + +

+ +

The state that exists at the end of the validation frame may be observed or modified by unrelated contracts before +the execution frame begins. +Sender contracts must take great care in making sure their code does not make any false assumptions.

+ +

+ + + DoS attacks on block builders + + +

+ +

The amount of computation and available memory that is necessary to maintain a mempool and produce valid blocks is +increased significantly.

+ +

+ + + Directly charging the balance of a contract + + +

+ +

This EIP adds a new way for a smart contract to have its balance charged simply by returning a valid value from a +function with method ID that corresponds to validateTransaction, validatePaymasterTransaction.

+ +

This creates a new kind of risk for contracts that accidentally or maliciously contain such methods but are not public +about the fact that these contracts can be used as a sender or a paymaster in an AA_TX_TYPE transaction.

+ +

This is somewhat mitigated by requiring these contracts to return MAGIC_VALUE_SENDER or MAGIC_VALUE_PAYMASTER, +however code reviewers should still be aware of this.

+ +

+ + + Observing revert reasons in a validation frame + + +

+ +

Existing transaction types get included in a block even if reverted and provide a revert reason for debugging purposes. +There is a very short list of things that can cause a transaction not to be included on-chain:

+ +
    +
  • low gas fee
  • +
  • insufficient balance
  • +
  • invalid nonce
  • +
  • censorship
  • +
+ +

This is not the case for reverts that occur in the validation phase of an AA_TX_TYPE transaction. +In order to address this developers should track the validity of these transactions being signed and are encouraged +to rely on the validUntil time range parameter to guarantee a transaction that has not been included in the intended time +will not become valid again unexpectedly for the user who had sent it.

+ + + +

Copyright and related rights waived via CC0.

+ +

Citation

+

Please cite this document as:

+ +

Vitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Alex Forshtat (@forshtat), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn), "EIP-7560: Native Account Abstraction [DRAFT]," Ethereum Improvement Proposals, no. 7560, September 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7560.

+
+ + + + +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/all.html b/_site/all.html new file mode 100644 index 0000000..2c66fb9 --- /dev/null +++ b/_site/all.html @@ -0,0 +1,212 @@ + + + + + + + All | Ethereum Rollup Improvement Proposals + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+

All

+
+ +
+ + + + + + + + + +

Final

+ + + + + + + + + + + + + + +
NumberTitleAuthor
7212Precompile for secp256r1 Curve SupportUlaş Erdoğan (@ulerdogan), Doğan Alpaslan (@doganalpaslan)
+ + + + + + + + + + + + + +

Draft

+ + + + + + + + + + + + + + +
NumberTitleAuthor
7560Native Account AbstractionVitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Alex Forshtat (@forshtat), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn)
+ + + + + + + + + + + + +
+ +
+ +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/assets/main.css b/_site/assets/main.css new file mode 100644 index 0000000..83b9124 --- /dev/null +++ b/_site/assets/main.css @@ -0,0 +1,196 @@ +/** Reset some basic elements */ +body, h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr, dl, dd, ol, ul, figure { margin: 0; padding: 0; } + +/** Basic styling */ +body { font: 400 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; color: #111; background-color: #fdfdfd; -webkit-text-size-adjust: 100%; -webkit-font-feature-settings: "kern" 1; -moz-font-feature-settings: "kern" 1; -o-font-feature-settings: "kern" 1; font-feature-settings: "kern" 1; font-kerning: normal; display: flex; min-height: 100vh; flex-direction: column; } + +/** Set `margin-bottom` to maintain vertical rhythm */ +h1, h2, h3, h4, h5, h6, p, blockquote, pre, ul, ol, dl, figure, .highlight { margin-bottom: 15px; } + +/** `main` element */ +main { display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */ } + +/** Images */ +img { max-width: 100%; vertical-align: middle; } + +/** Figures */ +figure > img { display: block; } + +figcaption { font-size: 14px; } + +/** Lists */ +ul, ol { margin-left: 30px; } + +li > ul, li > ol { margin-bottom: 0; } + +/** Headings */ +h1, h2, h3, h4, h5, h6 { font-weight: 400; } + +/** Links */ +a { color: #2a7ae2; text-decoration: none; } +a:visited { color: #1756a9; } +a:hover { color: #111; text-decoration: underline; } +.social-media-list a:hover { text-decoration: none; } +.social-media-list a:hover .username { text-decoration: underline; } + +/** Blockquotes */ +blockquote { color: #828282; border-left: 4px solid #e8e8e8; padding-left: 15px; font-size: 18px; letter-spacing: -1px; font-style: italic; } +blockquote > :last-child { margin-bottom: 0; } + +/** Code formatting */ +pre, code { font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; background-color: #eef; } + +code { padding: 1px 5px; } + +pre { padding: 8px 12px; overflow-x: auto; } +pre > code { border: 0; padding-right: 0; padding-left: 0; } + +/** Wrapper */ +.wrapper { max-width: -webkit-calc(800px - (30px * 2)); max-width: calc(800px - (30px * 2)); margin-right: auto; margin-left: auto; padding-right: 30px; padding-left: 30px; } +@media screen and (max-width: 800px) { .wrapper { max-width: -webkit-calc(800px - (30px)); max-width: calc(800px - (30px)); padding-right: 15px; padding-left: 15px; } } + +/** Clearfix */ +.wrapper:after, .footer-col-wrapper:after { content: ""; display: table; clear: both; } + +/** Icons */ +.svg-icon { width: 16px; height: 16px; display: inline-block; fill: #828282; padding-right: 5px; vertical-align: text-top; } + +.social-media-list li + li { padding-top: 5px; } + +/** Tables */ +table { margin-bottom: 30px; width: 100%; text-align: left; color: #3f3f3f; border-collapse: collapse; border: 1px solid #e8e8e8; } +table tr:nth-child(even) { background-color: #f7f7f7; } +table th, table td { padding: 10px 15px; } +table th { background-color: #f0f0f0; border: 1px solid #dedede; border-bottom-color: #c9c9c9; } +table td { border: 1px solid #e8e8e8; } + +/** Site header */ +.site-header { border-top: 5px solid #424242; border-bottom: 1px solid #e8e8e8; min-height: 55.95px; position: relative; } + +.site-title { font-size: 26px; font-weight: 300; line-height: 54px; letter-spacing: -1px; margin-bottom: 0; float: left; } +.site-title, .site-title:visited { color: #424242; } + +.site-nav { float: right; line-height: 54px; } +.site-nav .nav-trigger { display: none; } +.site-nav .menu-icon { display: none; } +.site-nav .page-link { color: #111; line-height: 1.5; } +.site-nav .page-link:not(:last-child) { margin-right: 20px; } +@media screen and (max-width: 600px) { .site-nav { position: absolute; top: 9px; right: 15px; background-color: #fdfdfd; border: 1px solid #e8e8e8; border-radius: 5px; text-align: right; } + .site-nav label[for="nav-trigger"] { display: block; float: right; width: 36px; height: 36px; z-index: 2; cursor: pointer; } + .site-nav .menu-icon { display: block; float: right; width: 36px; height: 26px; line-height: 0; padding-top: 10px; text-align: center; } + .site-nav .menu-icon > svg { fill: #424242; } + .site-nav input ~ .trigger { clear: both; display: none; } + .site-nav input:checked ~ .trigger { display: block; padding-bottom: 5px; } + .site-nav .page-link { display: block; padding: 5px 10px; margin-left: 20px; } + .site-nav .page-link:not(:last-child) { margin-right: 0; } } + +/** Site footer */ +.site-footer { border-top: 1px solid #e8e8e8; padding: 30px 0; } + +.footer-heading { font-size: 18px; margin-bottom: 15px; } + +.contact-list, .social-media-list { list-style: none; margin-left: 0; } + +.footer-col-wrapper { font-size: 15px; color: #828282; margin-left: -15px; } + +.footer-col { float: left; margin-bottom: 15px; padding-left: 15px; } + +.footer-col-1 { width: -webkit-calc(35% - (30px / 2)); width: calc(35% - (30px / 2)); } + +.footer-col-2 { width: -webkit-calc(20% - (30px / 2)); width: calc(20% - (30px / 2)); } + +.footer-col-3 { width: -webkit-calc(45% - (30px / 2)); width: calc(45% - (30px / 2)); } + +@media screen and (max-width: 800px) { .footer-col-1, .footer-col-2 { width: -webkit-calc(50% - (30px / 2)); width: calc(50% - (30px / 2)); } + .footer-col-3 { width: -webkit-calc(100% - (30px / 2)); width: calc(100% - (30px / 2)); } } +@media screen and (max-width: 600px) { .footer-col { float: none; width: -webkit-calc(100% - (30px / 2)); width: calc(100% - (30px / 2)); } } +/** Page content */ +.page-content { padding: 30px 0; flex: 1; } + +.page-heading { font-size: 32px; } + +.post-list-heading { font-size: 28px; } + +.post-list { margin-left: 0; list-style: none; } +.post-list > li { margin-bottom: 30px; } + +.post-meta { font-size: 14px; color: #828282; } + +.post-link { display: block; font-size: 24px; } + +/** Posts */ +.post-header { margin-bottom: 30px; } + +.post-title { font-size: 42px; letter-spacing: -1px; line-height: 1; } +@media screen and (max-width: 800px) { .post-title { font-size: 36px; } } + +.post-content { margin-bottom: 30px; } +.post-content h2 { font-size: 32px; } +@media screen and (max-width: 800px) { .post-content h2 { font-size: 28px; } } +.post-content h3 { font-size: 26px; } +@media screen and (max-width: 800px) { .post-content h3 { font-size: 22px; } } +.post-content h4 { font-size: 20px; } +@media screen and (max-width: 800px) { .post-content h4 { font-size: 18px; } } + +/** Syntax highlighting styles */ +.highlight { background: #fff; } +.highlighter-rouge .highlight { background: #eef; } +.highlight .c { color: #998; font-style: italic; } +.highlight .err { color: #a61717; background-color: #e3d2d2; } +.highlight .k { font-weight: bold; } +.highlight .o { font-weight: bold; } +.highlight .cm { color: #998; font-style: italic; } +.highlight .cp { color: #999; font-weight: bold; } +.highlight .c1 { color: #998; font-style: italic; } +.highlight .cs { color: #999; font-weight: bold; font-style: italic; } +.highlight .gd { color: #000; background-color: #fdd; } +.highlight .gd .x { color: #000; background-color: #faa; } +.highlight .ge { font-style: italic; } +.highlight .gr { color: #a00; } +.highlight .gh { color: #999; } +.highlight .gi { color: #000; background-color: #dfd; } +.highlight .gi .x { color: #000; background-color: #afa; } +.highlight .go { color: #888; } +.highlight .gp { color: #555; } +.highlight .gs { font-weight: bold; } +.highlight .gu { color: #aaa; } +.highlight .gt { color: #a00; } +.highlight .kc { font-weight: bold; } +.highlight .kd { font-weight: bold; } +.highlight .kp { font-weight: bold; } +.highlight .kr { font-weight: bold; } +.highlight .kt { color: #458; font-weight: bold; } +.highlight .m { color: #099; } +.highlight .s { color: #d14; } +.highlight .na { color: #008080; } +.highlight .nb { color: #0086B3; } +.highlight .nc { color: #458; font-weight: bold; } +.highlight .no { color: #008080; } +.highlight .ni { color: #800080; } +.highlight .ne { color: #900; font-weight: bold; } +.highlight .nf { color: #900; font-weight: bold; } +.highlight .nn { color: #555; } +.highlight .nt { color: #000080; } +.highlight .nv { color: #008080; } +.highlight .ow { font-weight: bold; } +.highlight .w { color: #bbb; } +.highlight .mf { color: #099; } +.highlight .mh { color: #099; } +.highlight .mi { color: #099; } +.highlight .mo { color: #099; } +.highlight .sb { color: #d14; } +.highlight .sc { color: #d14; } +.highlight .sd { color: #d14; } +.highlight .s2 { color: #d14; } +.highlight .se { color: #d14; } +.highlight .sh { color: #d14; } +.highlight .si { color: #d14; } +.highlight .sx { color: #d14; } +.highlight .sr { color: #009926; } +.highlight .s1 { color: #d14; } +.highlight .ss { color: #990073; } +.highlight .bp { color: #999; } +.highlight .vc { color: #008080; } +.highlight .vg { color: #008080; } +.highlight .vi { color: #008080; } +.highlight .il { color: #099; } diff --git a/_site/assets/minima-social-icons.svg b/_site/assets/minima-social-icons.svg new file mode 100644 index 0000000..fa7399f --- /dev/null +++ b/_site/assets/minima-social-icons.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_site/assets/rip-7212/benchstat_compare_test b/_site/assets/rip-7212/benchstat_compare_test new file mode 100644 index 0000000..d99bcf9 --- /dev/null +++ b/_site/assets/rip-7212/benchstat_compare_test @@ -0,0 +1,42 @@ +goos: darwin +goarch: arm64 +pkg: github.com/ethereum/go-ethereum/core/vm + │ compare_p256Verify │ compare_ecrecover │ + │ sec/op │ sec/op vs base │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 57.75µ ± 1% +PrecompiledEcrecover/-Gas=3000-8 50.48µ ± 1% +geomean 57.75µ 50.48µ ? ¹ ² +¹ benchmark set differs from baseline; geomeans may not be comparable +² ratios must be >0 to compute geomean + + │ compare_p256Verify │ compare_ecrecover │ + │ gas/op │ gas/op vs base │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 3.450k ± 0% +PrecompiledEcrecover/-Gas=3000-8 3.000k ± 0% +geomean 3.450k 3.000k ? ¹ ² +¹ benchmark set differs from baseline; geomeans may not be comparable +² ratios must be >0 to compute geomean + + │ compare_p256Verify │ compare_ecrecover │ + │ mgas/s │ mgas/s vs base │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 59.73 ± 1% +PrecompiledEcrecover/-Gas=3000-8 59.42 ± 1% +geomean 59.73 59.42 ? ¹ ² +¹ benchmark set differs from baseline; geomeans may not be comparable +² ratios must be >0 to compute geomean + + │ compare_p256Verify │ compare_ecrecover │ + │ B/op │ B/op vs base │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 1.523Ki ± 0% +PrecompiledEcrecover/-Gas=3000-8 800.0 ± 0% +geomean 1.523Ki 800.0 ? ¹ ² +¹ benchmark set differs from baseline; geomeans may not be comparable +² ratios must be >0 to compute geomean + + │ compare_p256Verify │ compare_ecrecover │ + │ allocs/op │ allocs/op vs base │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 33.00 ± 0% +PrecompiledEcrecover/-Gas=3000-8 7.000 ± 0% +geomean 33.00 7.000 ? ¹ ² +¹ benchmark set differs from baseline; geomeans may not be comparable +² ratios must be >0 to compute geomean diff --git a/_site/assets/rip-7212/ecrecover_benchmark_test b/_site/assets/rip-7212/ecrecover_benchmark_test new file mode 100644 index 0000000..4bf20a6 --- /dev/null +++ b/_site/assets/rip-7212/ecrecover_benchmark_test @@ -0,0 +1,15 @@ +goos: darwin +goarch: arm64 +pkg: github.com/ethereum/go-ethereum/core/vm +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23295 50034 ns/op 3000 gas/op 59.95 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23734 50558 ns/op 3000 gas/op 59.33 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23823 50586 ns/op 3000 gas/op 59.30 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23913 50049 ns/op 3000 gas/op 59.94 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23721 50299 ns/op 3000 gas/op 59.64 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23760 51160 ns/op 3000 gas/op 58.63 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23151 50818 ns/op 3000 gas/op 59.03 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23744 53451 ns/op 3000 gas/op 56.12 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 22837 50315 ns/op 3000 gas/op 59.62 mgas/s 800 B/op 7 allocs/op +BenchmarkPrecompiledEcrecover/-Gas=3000-8 23823 50401 ns/op 3000 gas/op 59.52 mgas/s 800 B/op 7 allocs/op +PASS +ok github.com/ethereum/go-ethereum/core/vm 17.687s diff --git a/_site/assets/rip-7212/p256Verify_benchmark_test b/_site/assets/rip-7212/p256Verify_benchmark_test new file mode 100644 index 0000000..dc908bf --- /dev/null +++ b/_site/assets/rip-7212/p256Verify_benchmark_test @@ -0,0 +1,15 @@ +goos: darwin +goarch: arm64 +pkg: github.com/ethereum/go-ethereum/core/vm +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20770 57970 ns/op 3450 gas/op 59.51 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20899 57769 ns/op 3450 gas/op 59.71 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20780 57343 ns/op 3450 gas/op 60.16 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20870 57740 ns/op 3450 gas/op 59.74 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20911 57411 ns/op 3450 gas/op 60.09 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20874 58423 ns/op 3450 gas/op 59.04 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20736 57552 ns/op 3450 gas/op 59.94 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 19700 58235 ns/op 3450 gas/op 59.24 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20814 57681 ns/op 3450 gas/op 59.80 mgas/s 1560 B/op 33 allocs/op +BenchmarkPrecompiledP256Verify/p256Verify-Gas=3450-8 20736 58806 ns/op 3450 gas/op 58.66 mgas/s 1560 B/op 33 allocs/op +PASS +ok github.com/ethereum/go-ethereum/core/vm 18.491s diff --git a/_site/assets/rip-7560/block_overview.png b/_site/assets/rip-7560/block_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3db3ab7828cbcc83f91570a16669ea0d4b69ba GIT binary patch literal 63126 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 literal 0 HcmV?d00001 diff --git a/_site/assets/rip-7560/flow_diagram.png b/_site/assets/rip-7560/flow_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..eceb86c642e374059efee2c843ae902b0ca1bb83 GIT binary patch literal 142917 zcmeEuhgVZu_bqls5evPlh%}`a=_r?u^xh&OT|i3c0Te5}igb`(gY=GofYi{E0HLS| z0YXzsAQ*W2c)$Do?t6d08{>`fatGs*cyi7ztIRd$+Pu}#QlX+`qNJdppi)!)OOJx$ zbPV|MJ$o8_@=o*xKltA@8&$mr6cqlqC@4Z+P*9M-MnX}L**}uBj~@ZmV$Wj$+@Shrk)fO45`r1F*SH-0{HNZm)ZlRGkD6=bW*~W zsqd!29VyiQx@X`!wK@|V7`=1Y^RuAVN!t1#CL&CT%k(zOk5oZ3o;GzJF;+^hMAeTg zdzaOD=efg|uF>!ixJOZ4H=}H#*mIU&I~qLM|2e7Wf|lzcM#C-3QAl#-+EjE8*_-gr z1&iPEgJJQFv)BXww%HAA6J~j=K>Iux&)=`TPDyY2f8J0~B%VKZ^S|%vuZNuc?;DAe zV3Gdw`ud9E%0ItTOkYws{?D5b=HsgW{7&&yk>cEc-?*N=cI=-wpQ!%-L;kGA|DEMZ zRcJb|b7g3iC2w`Y)<=jU>%Q08sA+rqJ#YFG&@e(gwsiF>XOzG%#!b7YoZ$Pm9xq-^ zSSDO4x^nEMy>}EFll;BqGa}>J2=kXlA44xta3)q;$Ad3GudMsSb7!&|aSeQiTjIt0c1IecdvSHGaKVUN{AhgoHLR z`t8_e(;4T97?Y;(KhuB)qw^?g_>v|2)v~D?fnl=E_v*kA88D=}CX<&^J?qD5775#- z#rUU}Wd3WhhO_8&Y2JK$pEAoM@JJrLyo=WmmF`vk%04ws4A4FQyllT?QV)3D2hA3m zEWGLSbP}aPs;~Q1m9I?9u0Q(cB8r5!UySZ>s`W&%)-`dzEFM3W8?RN6@>1gCzwdNI z@Y<*K8#Ef=LI3rLtnZiqcPFCdb{~{_kSwQPbTGQgPg(qS9O0NEjL5%&Ev;(erqFTx z(PYs#I9S!hpb+_EU}z*^Swzg1q}dd%XZ_2vT)l1c4n@MLDPszqK(Oyk;b3Ht5tt$p z5=tFKzK6FUzV~rD(O@cuU3P<7VPHRsH1JwsPOOeZej`&$|6QKlS|Qmc=c!zkHGYqV z-htouz%^=dr!Owq`?wDf@*CNSDFbE_t)ddG!;J&=Ms-h2+@rT=s$Ca@l|yzkczxi3amHnh_a`wepBjLsneLOri@7 z3(I34p=VX%U@BX)ZfIa|aA2y??gvLXxZ?IRl9KG-A*HY`hbw7Iu9jZ=w!!&B$DYKb zrWU-Ht5fH#XG;=DvG<8BZVpV+a6D)mk4kS!{Jl(<$377ABM6o4cH*uy#$HVu%uOTC zwWR@h!@Q+{)b zi6?S?WeQ){!uI@yvt%*23YO~Uio^O;Uey(2eqEhQtTctbR|^J)QzVi`-t1J^;9VCM z7ip*5>wT9go5D@YZkx7_uDxf9{Iwm*s4o9L`?Hv{A?jPjLZDcmQS$L3&ntAm$fnc{ zZ>6=cO8cZfyP(DtM0`lae8t)4V{zVx6_%nbPx!8a;Z`Wj&4rssW6o`78Ue+#3n`_kKO-wr&cyF3=R&CVVBQ{x%XX2_mUD@ z|H#GLtmvb?g7;>>A<(p&J7sw?;TTH1*u6CvcqniM^!GeIucb|&l;1@6lcfHbnxVIu zLWb#5wM0|=DzGnYS&^m=X>p(R;y`R2lF?JawBM(pdbLL4ChbW{@73utqCDw^cd>fX z{az-SFbB4Be7^j*-PJYVP+ZLN=(HE7%$mJk^0%#`Xs3!0q9P?7awYXqtkSMNmvyN2 zC_{3AZG$0HgKd_*dh{IAvXe5?RqD0s>TD9K!a7xlo}ce|4_~ZSi(YZCduLP@Wd7C} z<1`iF`|_owL3WiyG|OQ1&feayHJ>>gm>b2hT;T*@%7f;$$sC!rPjLKdPGgOUD23Ot zqz|s?QY*mB<`hDNTx3MH&LCQkG%QDo^X7=Zxp_?EybzkzX_JzRryR@PNAM&npBk;# zeQ#zNl+2QS-E{*lDxwiUTqBx)WX!a^)3mb{`Fd$!fSrcUJJwu^7KC^`@6}Nsm8hj5 zoGTCUn(9icsIA>$7KoyolNDlz>kUYZ&CyIOM`NzLOYBI4au**Q5=7jCagR|cWvGo%*kR+arCh=NwcE@N1U;z2E~ zx4y{kLKBAylvj|;lihP<#Os%cXw24HTz6#4kP57)^B49DlwV{e z)lLxKDZXwsB(+~a`22X&2=jzzAFLv^h`*y`+Cs^&z&wFgk{O&Z{xj9A|L$Q1*2;Pz zDYp!#HxMgzy+9t^E#{vOjCNuzat`o9gFu@AQgdaMXJ9`1_FBtGq0P1J7t{r#@sm;!l_Mo1u>Q#oUus=)trg zoWXjt2t|c$aB+L$9O1w7B;Fk7uOd?A1;)|_9|CiNtIc<>Ok`VT6HVt2;wVoKqstM` zaKzX~fx*%?nf{XrHPvL;O72+Eo5gP_Qp>tKEu2Q-N#(;a?V*%qIT7{}YEw;a!P$63 zYrpO3a}nO*Z3mS|dm-2cq82rcq47+D?b;)EU9C}ZFNL0~9NOti-B%QSsvu7WYX@0G z{W<-X)4p^CL&RxqXZhzp_cMse(Q$D*`-cLEb$xeS0!G})eKg8Hh?p_AprY1mcNG2e zC~WJzJ6VAE2CT>L+Xf0>|yxO9iMa?n{qmE`<-faTG z-~Y*Iyq$gYP0n(jy*6Z6@80iLv#PBa#xB5J?2?%~Dgn&kpmB&Xv85wEDXgj+G@*wFTKqb;M zHOPrvt}HLuLCAk-iTxb2IeG)Ka=(ivsH-sQVYe1?InK{UwqTUnt{%a4*qQ^LzpeTE zd>3z%E*nQ(dChNN0Xnj;6@ks^xY9Nt1KYaytslJJ1Yu?I<7V>+Q-tYhfx$Zy{BsL> z9lw>-EvhiiIFLhd#P5EqF!P$J=JlneO-!CAmzaykTgVK0ZpoUivTVIXaOt%>xH`Yi z-jNnkUS)v(2^gN)dqEr_aI+=~nrVxm^DFaCC`0O_2E5PzV1Sn**TOx39os$plAJ!j zRf8-uyQ8*3JJxCc2XEHRiFK@z#LCaXsDEO_iXxmp^%;{_O3H=h=D&>){mP0Kouyh0 zp3Y5Fx-_8zEWf9~Q{pQ=;oW~($oCiamu_%1%)tWp1s!v8pC4FQH{>$E6ca`161
Us65!Nej$8I@><%_Poe%bT7!? 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%0A~-HdJl-LnJXj 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 literal 0 HcmV?d00001 diff --git a/_site/config/eip-editors.yml b/_site/config/eip-editors.yml new file mode 100644 index 0000000..8eb7e2f --- /dev/null +++ b/_site/config/eip-editors.yml @@ -0,0 +1,42 @@ +governance: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 +core: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 + - g11tech +erc: + - axic + - SamWilsn + - Pandapip1 + - xinbenlv + - g11tech +networking: + - lightclient + - axic + - SamWilsn +interface: + - lightclient + - axic + - SamWilsn + - Pandapip1 +meta: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 + - xinbenlv +informational: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 + - xinbenlv diff --git a/_site/config/eipw.toml b/_site/config/eipw.toml new file mode 100644 index 0000000..e19bb68 --- /dev/null +++ b/_site/config/eipw.toml @@ -0,0 +1,920 @@ +[[modifiers]] +kind = "set-default-annotation" +name = "status" +value = "Stagnant" +annotation_type = "warning" + +[[modifiers]] +kind = "set-default-annotation" +name = "status" +value = "Withdrawn" +annotation_type = "warning" + +[lints.markdown-re-eip-dash] +kind = "markdown-regex" +mode = "excludes" +pattern = '(?i)eip[\s]*[0-9]+' +message = "proposals must be referenced with the form `EIP-N` (not `EIPN` or `EIP N`)" + +[lints.preamble-date-created] +kind = "preamble-date" +name = "created" + +[lints.preamble-re-description-eip-dash] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = '(?i)eip[\s]*[0-9]+' +message = "proposals must be referenced with the form `EIP-N` (not `EIPN` or `EIP N`)" + +[lints.preamble-re-description-colon] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = ":" +message = "preamble header `description` should not contain `:`" + +[lints.preamble-refs-description] +kind = "preamble-proposal-ref" +name = "description" +prefix = "erc-" +suffix = ".md" + +[lints.preamble-enum-category] +kind = "preamble-one-of" +name = "category" +values = [ + "ERC", +] + +[lints.preamble-re-description] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = '(?i)standar\w*\b' +message = "preamble header `description` should not contain `standard` (or similar words.)" + +[lints.preamble-re-title-erc-dash] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = '(?i)erc[\s]*[0-9]+' +message = "proposals must be referenced with the form `ERC-N` (not `ERCN` or `ERC N`)" + +[lints.preamble-re-description-erc-dash] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = '(?i)erc[\s]*[0-9]+' +message = "proposals must be referenced with the form `ERC-N` (not `ERCN` or `ERC N`)" + +## TODO: Disabled because half the files are in another repository. +# [lints.markdown-refs] +# kind = "markdown-proposal-ref" +# prefix = "erc-" +# suffix = ".md" + +[lints.preamble-req-withdrawal-reason] +kind = "preamble-required-if-eq" +when = "status" +equals = "Withdrawn" +then = "withdrawal-reason" + +[lints.preamble-order] +kind = "preamble-order" +names = [ + "eip", + "title", + "description", + "author", + "discussions-to", + "status", + "last-call-deadline", + "type", + "category", + "created", + "requires", + "withdrawal-reason", +] + +## TODO: Disabled because half the files are in another repository. +# [lints.preamble-requires-status] +# prefix = "erc-" +# suffix = ".md" +# kind = "preamble-requires-status" +# requires = "requires" +# status = "status" +# flow = [ +# [ +# "Draft", +# "Stagnant", +# ], +# ["Review"], +# ["Last Call"], +# [ +# "Final", +# "Withdrawn", +# "Living", +# ], +# ] + +[lints.markdown-order-section] +kind = "markdown-section-order" +sections = [ + "Abstract", + "Motivation", + "Specification", + "Rationale", + "Backwards Compatibility", + "Test Cases", + "Reference Implementation", + "Security Considerations", + "Copyright", +] + +[lints.markdown-rel-links] +kind = "markdown-relative-links" +exceptions = [ + '^https://(www\.)?github\.com/ethereum/consensus-specs/blob/[a-f0-9]{40}/.+$', + '^https://(www\.)?github\.com/ethereum/consensus-specs/commit/[a-f0-9]{40}$', + '^https://(www\.)?github\.com/ethereum/devp2p/blob/[0-9a-f]{40}/.+$', + '^https://(www\.)?github\.com/ethereum/devp2p/commit/[0-9a-f]{40}$', + '^https://(www\.)?github\.com/bitcoin/bips/blob/[0-9a-f]{40}/bip-[0-9]+\.mediawiki$', + '^https://www\.w3\.org/TR/[0-9][0-9][0-9][0-9]/.*$', + '^https://[a-z]*\.spec\.whatwg\.org/commit-snapshots/[0-9a-f]{40}/$', + '^https://www\.rfc-editor\.org/rfc/.*$', +] + +[lints.preamble-req-category] +kind = "preamble-required-if-eq" +when = "type" +equals = "Standards Track" +then = "category" + +[lints.preamble-eip] +kind = "preamble-uint" +name = "eip" + +[lints.markdown-json-cite] +kind = "markdown-json-schema" +language = "csl-json" +additional_schemas = [[ + "https://resource.citationstyles.org/schema/v1.0/input/json/csl-data.json", + """ +{ + \"description\": \"JSON schema for CSL input data\", + \"$schema\": \"http://json-schema.org/draft-07/schema#\", + \"$id\": \"https://resource.citationstyles.org/schema/v1.0/input/json/csl-data.json\", + \"type\": \"array\", + \"items\": { + \"type\": \"object\", + \"properties\": { + \"type\": { + \"type\": \"string\", + \"enum\": [ + \"article\", + \"article-journal\", + \"article-magazine\", + \"article-newspaper\", + \"bill\", + \"book\", + \"broadcast\", + \"chapter\", + \"classic\", + \"collection\", + \"dataset\", + \"document\", + \"entry\", + \"entry-dictionary\", + \"entry-encyclopedia\", + \"event\", + \"figure\", + \"graphic\", + \"hearing\", + \"interview\", + \"legal_case\", + \"legislation\", + \"manuscript\", + \"map\", + \"motion_picture\", + \"musical_score\", + \"pamphlet\", + \"paper-conference\", + \"patent\", + \"performance\", + \"periodical\", + \"personal_communication\", + \"post\", + \"post-weblog\", + \"regulation\", + \"report\", + \"review\", + \"review-book\", + \"software\", + \"song\", + \"speech\", + \"standard\", + \"thesis\", + \"treaty\", + \"webpage\" + ] + }, + \"id\": { + \"type\": [\"string\", \"number\"] + }, + \"citation-key\": { + \"type\": \"string\" + }, + \"categories\": { + \"type\": \"array\", + \"items\": { + \"type\": \"string\" + } + }, + \"language\": { + \"type\": \"string\" + }, + \"journalAbbreviation\": { + \"type\": \"string\" + }, + \"shortTitle\": { + \"type\": \"string\" + }, + \"author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"chair\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"collection-editor\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"compiler\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"composer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"container-author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"contributor\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"curator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"director\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"editor\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"editorial-director\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"executive-producer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"guest\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"host\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"interviewer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"illustrator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"narrator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"organizer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"original-author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"performer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"producer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"recipient\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"reviewed-author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"script-writer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"series-creator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"translator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"accessed\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"available-date\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"event-date\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"issued\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"original-date\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"submitted\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"abstract\": { + \"type\": \"string\" + }, + \"annote\": { + \"type\": \"string\" + }, + \"archive\": { + \"type\": \"string\" + }, + \"archive_collection\": { + \"type\": \"string\" + }, + \"archive_location\": { + \"type\": \"string\" + }, + \"archive-place\": { + \"type\": \"string\" + }, + \"authority\": { + \"type\": \"string\" + }, + \"call-number\": { + \"type\": \"string\" + }, + \"chapter-number\": { + \"type\": [\"string\", \"number\"] + }, + \"citation-number\": { + \"type\": [\"string\", \"number\"] + }, + \"citation-label\": { + \"type\": \"string\" + }, + \"collection-number\": { + \"type\": [\"string\", \"number\"] + }, + \"collection-title\": { + \"type\": \"string\" + }, + \"container-title\": { + \"type\": \"string\" + }, + \"container-title-short\": { + \"type\": \"string\" + }, + \"dimensions\": { + \"type\": \"string\" + }, + \"division\": { + \"type\": \"string\" + }, + \"DOI\": { + \"type\": \"string\" + }, + \"edition\": { + \"type\": [\"string\", \"number\"] + }, + \"event\": { + \"description\": \"[Deprecated - use 'event-title' instead. Will be removed in 1.1]\", + \"type\": \"string\" + }, + \"event-title\": { + \"type\": \"string\" + }, + \"event-place\": { + \"type\": \"string\" + }, + \"first-reference-note-number\": { + \"type\": [\"string\", \"number\"] + }, + \"genre\": { + \"type\": \"string\" + }, + \"ISBN\": { + \"type\": \"string\" + }, + \"ISSN\": { + \"type\": \"string\" + }, + \"issue\": { + \"type\": [\"string\", \"number\"] + }, + \"jurisdiction\": { + \"type\": \"string\" + }, + \"keyword\": { + \"type\": \"string\" + }, + \"locator\": { + \"type\": [\"string\", \"number\"] + }, + \"medium\": { + \"type\": \"string\" + }, + \"note\": { + \"type\": \"string\" + }, + \"number\": { + \"type\": [\"string\", \"number\"] + }, + \"number-of-pages\": { + \"type\": [\"string\", \"number\"] + }, + \"number-of-volumes\": { + \"type\": [\"string\", \"number\"] + }, + \"original-publisher\": { + \"type\": \"string\" + }, + \"original-publisher-place\": { + \"type\": \"string\" + }, + \"original-title\": { + \"type\": \"string\" + }, + \"page\": { + \"type\": [\"string\", \"number\"] + }, + \"page-first\": { + \"type\": [\"string\", \"number\"] + }, + \"part\": { + \"type\": [\"string\", \"number\"] + }, + \"part-title\": { + \"type\": \"string\" + }, + \"PMCID\": { + \"type\": \"string\" + }, + \"PMID\": { + \"type\": \"string\" + }, + \"printing\": { + \"type\": [\"string\", \"number\"] + }, + \"publisher\": { + \"type\": \"string\" + }, + \"publisher-place\": { + \"type\": \"string\" + }, + \"references\": { + \"type\": \"string\" + }, + \"reviewed-genre\": { + \"type\": \"string\" + }, + \"reviewed-title\": { + \"type\": \"string\" + }, + \"scale\": { + \"type\": \"string\" + }, + \"section\": { + \"type\": \"string\" + }, + \"source\": { + \"type\": \"string\" + }, + \"status\": { + \"type\": \"string\" + }, + \"supplement\": { + \"type\": [\"string\", \"number\"] + }, + \"title\": { + \"type\": \"string\" + }, + \"title-short\": { + \"type\": \"string\" + }, + \"URL\": { + \"type\": \"string\" + }, + \"version\": { + \"type\": \"string\" + }, + \"volume\": { + \"type\": [\"string\", \"number\"] + }, + \"volume-title\": { + \"type\": \"string\" + }, + \"volume-title-short\": { + \"type\": \"string\" + }, + \"year-suffix\": { + \"type\": \"string\" + }, + \"custom\": { + \"title\": \"Custom key-value pairs.\", + \"type\": \"object\", + \"description\": \"Used to store additional information that does not have a designated CSL JSON field. The custom field is preferred over the note field for storing custom data, particularly for storing key-value pairs, as the note field is used for user annotations in annotated bibliography styles.\", + \"examples\": [ + { + \"short_id\": \"xyz\", + \"other-ids\": [\"alternative-id\"] + }, + { + \"metadata-double-checked\": true + } + ] + } + }, + \"required\": [\"type\", \"id\"], + \"additionalProperties\": false + }, + \"definitions\": { + \"name-variable\": { + \"anyOf\": [ + { + \"properties\": { + \"family\": { + \"type\": \"string\" + }, + \"given\": { + \"type\": \"string\" + }, + \"dropping-particle\": { + \"type\": \"string\" + }, + \"non-dropping-particle\": { + \"type\": \"string\" + }, + \"suffix\": { + \"type\": \"string\" + }, + \"comma-suffix\": { + \"type\": [\"string\", \"number\", \"boolean\"] + }, + \"static-ordering\": { + \"type\": [\"string\", \"number\", \"boolean\"] + }, + \"literal\": { + \"type\": \"string\" + }, + \"parse-names\": { + \"type\": [\"string\", \"number\", \"boolean\"] + } + }, + \"additionalProperties\": false + } + ] + }, + \"date-variable\": { + \"title\": \"Date content model.\", + \"description\": \"The CSL input model supports two different date representations: an EDTF string (preferred), and a more structured alternative.\", + \"anyOf\": [ + { + \"properties\": { + \"date-parts\": { + \"type\": \"array\", + \"items\": { + \"type\": \"array\", + \"items\": { + \"type\": [\"string\", \"number\"] + }, + \"minItems\": 1, + \"maxItems\": 3 + }, + \"minItems\": 1, + \"maxItems\": 2 + }, + \"season\": { + \"type\": [\"string\", \"number\"] + }, + \"circa\": { + \"type\": [\"string\", \"number\", \"boolean\"] + }, + \"literal\": { + \"type\": \"string\" + }, + \"raw\": { + \"type\": \"string\" + } + }, + \"additionalProperties\": false + } + ] + } + } +} +""", +]] +schema = """ +{ + \"$id\": \"https://eips.ethereum.org/assets/eip-1/schema/json/citation.json\", + \"description\": \"Citation format for EIPs\", + \"$schema\": \"http://json-schema.org/draft-07/schema#\", + \"allOf\": [ + { + \"$ref\": \"https://resource.citationstyles.org/schema/v1.0/input/json/csl-data.json#/items\" + }, + { + \"required\": [ + \"DOI\", + \"URL\" + ], + \"properties\": { + \"URL\": { + \"format\": \"uri\" + }, + \"custom\": { + \"properties\": { + \"additional-urls\": { + \"type\": \"array\", + \"items\": { + \"format\": \"uri\" + } + } + } + } + } + } + ] +} +""" +help = "see https://github.com/ethereum/eipw/blob/master/eipw-lint/src/lints/markdown/json_schema/citation.json" + +[lints.preamble-no-dup] +kind = "preamble-no-duplicates" + +[lints.preamble-requires-ref-description] +kind = "preamble-require-referenced" +name = "description" +requires = "requires" + +[lints.preamble-re-title] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = '(?i)standar\w*\b' +message = "preamble header `title` should not contain `standard` (or similar words.)" + +[lints.preamble-re-title-eip-dash] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = '(?i)eip[\s]*[0-9]+' +message = "proposals must be referenced with the form `EIP-N` (not `EIPN` or `EIP N`)" + +[lints.preamble-date-last-call-deadline] +kind = "preamble-date" +name = "last-call-deadline" + +[lints.markdown-req-section] +kind = "markdown-section-required" +sections = [ + "Abstract", + "Specification", + "Rationale", + "Security Considerations", + "Copyright", +] + +[lints.markdown-link-status] +prefix = "erc-" +suffix = ".md" +kind = "markdown-link-status" +status = "status" +flow = [ + [ + "Draft", + "Stagnant", +], + ["Review"], + ["Last Call"], + [ + "Final", + "Withdrawn", + "Living", +], +] + +[lints.preamble-re-title-colon] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = ":" +message = "preamble header `title` should not contain `:`" + +[lints.preamble-list-requires] +kind = "preamble-list" +name = "requires" + +[lints.preamble-len-description] +kind = "preamble-length" +name = "description" +min = 2 +max = 140 + +[lints.preamble-requires-ref-title] +kind = "preamble-require-referenced" +name = "title" +requires = "requires" + +[lints.markdown-html-comments] +kind = "markdown-html-comments" +name = "status" +warn_for = [ + "Draft", + "Withdrawn", +] + +[lints.preamble-author] +kind = "preamble-author" +name = "author" + +[lints.preamble-uint-requires] +kind = "preamble-uint-list" +name = "requires" + +[lints.preamble-len-requires] +kind = "preamble-length" +name = "requires" +min = 1 + +[lints.markdown-link-first] +kind = "markdown-link-first" +pattern = "(?i)(?:eip|erc)-[0-9]+" + +[lints.markdown-re-erc-dash] +kind = "markdown-regex" +mode = "excludes" +pattern = '(?i)erc[\s]*[0-9]+' +message = "proposals must be referenced with the form `ERC-N` (not `ERCN` or `ERC N`)" + +[lints.preamble-list-author] +kind = "preamble-list" +name = "author" + +[lints.preamble-enum-type] +kind = "preamble-one-of" +name = "type" +values = [ + "Standards Track", +] + +[lints.preamble-len-title] +kind = "preamble-length" +name = "title" +min = 2 +max = 44 + +[lints.preamble-discussions-to] +kind = "preamble-url" +name = "discussions-to" + +[lints.preamble-req] +kind = "preamble-required" +names = [ + "eip", + "title", + "description", + "author", + "discussions-to", + "status", + "type", + "created", +] + +[lints.preamble-re-discussions-to] +kind = "preamble-regex" +name = "discussions-to" +mode = "includes" +pattern = "^https://ethereum-magicians.org/t/[^/]+/[0-9]+$" +message = "preamble header `discussions-to` should point to a thread on ethereum-magicians.org" + +[lints.preamble-refs-title] +kind = "preamble-proposal-ref" +name = "title" +prefix = "erc-" +suffix = ".md" + +[lints.preamble-enum-status] +kind = "preamble-one-of" +name = "status" +values = [ + "Draft", + "Review", + "Last Call", + "Final", + "Stagnant", + "Withdrawn", + "Living", +] + +[lints.preamble-trim] +kind = "preamble-trim" + +[lints.preamble-req-last-call-deadline] +kind = "preamble-required-if-eq" +when = "status" +equals = "Last Call" +then = "last-call-deadline" + +[lints.preamble-file-name] +kind = "preamble-file-name" +name = "eip" +prefix = "erc-" +suffix = ".md" + + diff --git a/_site/config/mlc_config.json b/_site/config/mlc_config.json new file mode 100644 index 0000000..ed1f966 --- /dev/null +++ b/_site/config/mlc_config.json @@ -0,0 +1,15 @@ +{ + "ignorePatterns": [ + "[`]*csl-json" + ], + "replacementPatterns": [ + { + "pattern": "^/", + "replacement": "/github/workspace/" + } + ], + "aliveStatusCodes": [ + 200, + 429 + ] +} diff --git a/_site/core.html b/_site/core.html new file mode 100644 index 0000000..5e83756 --- /dev/null +++ b/_site/core.html @@ -0,0 +1,213 @@ + + + + + + + Core | Ethereum Rollup Improvement Proposals + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+

Core

+
+ +
+ + + + + + + + + + +

Final

+ + + + + + + + + + + + + + +
NumberTitleAuthor
7212Precompile for secp256r1 Curve SupportUlaş Erdoğan (@ulerdogan), Doğan Alpaslan (@doganalpaslan)
+ + + + + + + + + + + + + +

Draft

+ + + + + + + + + + + + + + +
NumberTitleAuthor
7560Native Account AbstractionVitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Alex Forshtat (@forshtat), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn)
+ + + + + + + + + + + + +
+ +
+ +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/feed.xml b/_site/feed.xml new file mode 100644 index 0000000..b895d06 --- /dev/null +++ b/_site/feed.xml @@ -0,0 +1 @@ +Jekyll2024-02-03T00:10:05+05:30http://localhost:4000/feed.xmlEthereum Rollup Improvement ProposalsEthereum Improvement Proposals (EIPs) describe standards for the Ethereum platform, including core protocol specifications, client APIs, and contract standards. \ No newline at end of file diff --git a/_site/index.html b/_site/index.html new file mode 100644 index 0000000..d63c6e5 --- /dev/null +++ b/_site/index.html @@ -0,0 +1,175 @@ + + + + + + + Home | Ethereum Rollup Improvement Proposals + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

EIPs + Discord channel for ECH eip-editer + Discord channel for Eth R&D eip-editing + Discord server for discussions about proposals that impact Ethereum wallets + + RSS + RSS + RSS +

+

Ethereum Improvement Proposals (EIPs) describe standards for the Ethereum platform, including core protocol specifications, client APIs, and contract standards. Network upgrades are discussed separately in the Ethereum Project Management repository.

+ +

Contributing

+

First review EIP-1. Then clone the repository and add your EIP to it. There is a template EIP here. Then submit a Pull Request to Ethereum's EIPs repository.

+ +

EIP status terms

+
    +
  • Idea - An idea that is pre-draft. This is not tracked within the EIP Repository. +
  • Draft - The first formally tracked stage of an EIP in development. An EIP is merged by an EIP Editor into the EIP repository when properly formatted.
  • +
  • Review - An EIP Author marks an EIP as ready for and requesting Peer Review.
  • +
  • Last Call - This is the final review window for an EIP before moving to FINAL. An EIP editor will assign Last Call status and set a review end date (`last-call-deadline`), typically 14 days later. If this period results in necessary normative changes it will revert the EIP to Review.
  • +
  • Final - This EIP represents the final standard. A Final EIP exists in a state of finality and should only be updated to correct errata and add non-normative clarifications.
  • +
  • Stagnant - Any EIP in Draft or Review if inactive for a period of 6 months or greater is moved to Stagnant. An EIP may be resurrected from this state by Authors or EIP Editors through moving it back to Draft.
  • +
  • Withdrawn - The EIP Author(s) have withdrawn the proposed EIP. This state has finality and can no longer be resurrected using this EIP number. If the idea is pursued at later date it is considered a new proposal.
  • +
  • Living - A special status for EIPs that are designed to be continually updated and not reach a state of finality. This includes most notably EIP-1.
  • +
+ +

EIP Types

+ +

EIPs are separated into a number of types, and each has its own list of EIPs.

+ +

Standard Track (2)

+

Describes any change that affects most or all Ethereum implementations, such as a change to the network protocol, a change in block or transaction validity rules, proposed application standards/conventions, or any change or addition that affects the interoperability of applications using Ethereum. Furthermore Standard EIPs can be broken down into the following categories.

+ +

Core (2)

+

Improvements requiring a consensus fork (e.g. EIP-5, EIP-211), as well as changes that are not necessarily consensus critical but may be relevant to “core dev” discussions (for example, the PoA algorithm for testnets described in EIP-225).

+ +

Networking (0)

+

Includes improvements around devp2p (EIP-8) and Light Ethereum Subprotocol, as well as proposed improvements to network protocol specifications of whisper and swarm.

+ +

Interface (0)

+

Includes improvements around client API/RPC specifications and standards, and also certain language-level standards like method names (EIP-6) and contract ABIs. The label “interface” aligns with the interfaces repo and discussion should primarily occur in that repository before an EIP is submitted to the EIPs repository.

+ +

ERC (0)

+

Application-level standards and conventions, including contract standards such as token standards (EIP-20), name registries (EIP-137), URI schemes (EIP-681), library/package formats (EIP-190), and account abstraction (EIP-4337).

+ +

Meta (0)

+

Describes a process surrounding Ethereum or proposes a change to (or an event in) a process. Process EIPs are like Standards Track EIPs but apply to areas other than the Ethereum protocol itself. They may propose an implementation, but not to Ethereum's codebase; they often require community consensus; unlike Informational EIPs, they are more than recommendations, and users are typically not free to ignore them. Examples include procedures, guidelines, changes to the decision-making process, and changes to the tools or environment used in Ethereum development. Any meta-EIP is also considered a Process EIP.

+ +
+
+ + +
+ + + + + +
+ +
+ + + diff --git a/_site/rss/all.xml b/_site/rss/all.xml new file mode 100644 index 0000000..47718d4 --- /dev/null +++ b/_site/rss/all.xml @@ -0,0 +1,1650 @@ + + + + Ethereum EIPs + A feed of all EIPs + http://localhost:4000 + + Sat, 03 Feb 2024 00:10:05 +0530 + + + + + / + + <style type="text/css" media="screen"> + .container { + margin: 10px auto; + max-width: 600px; + text-align: center; + } + h1 { + margin: 30px 0; + font-size: 4em; + line-height: 1; + letter-spacing: -1px; + } +</style> + +<div class="container"> + <h1>404</h1> + <p><strong>Page not found :(</strong></p> + <p>The requested page could not be found.</p> +</div> + + + http://localhost:4000/404 + http://localhost:4000/404 + + + + All + / + + <style type="text/css"> + .eiptable .title { + width: 67%; + } + + .eiptable .author { + width: 33%; + } +</style> + + + + + + + + + <h2 id="final">Final</h2> + <table class="eiptable"> + <thead> + + <tr><th class="eipnum">Number</th><th class="title">Title</th><th class="author">Author</th></tr> + + </thead> + + <tr> + <td class="eipnum"><a href="/RIPS/rip-7212">7212</a></td> + + <td class="title">Precompile for secp256r1 Curve Support</td> + <td class="author">Ulaş Erdoğan&nbsp;(<a href="https://github.com/ulerdogan">@ulerdogan</a>), Doğan Alpaslan&nbsp;(<a href="https://github.com/doganalpaslan">@doganalpaslan</a>)</td> + </tr> + + </table> + + + + + + + + + + + + + + <h2 id="draft">Draft</h2> + <table class="eiptable"> + <thead> + + <tr><th class="eipnum">Number</th><th class="title">Title</th><th class="author">Author</th></tr> + + </thead> + + <tr> + <td class="eipnum"><a href="/RIPS/rip-7560">7560</a></td> + + <td class="title">Native Account Abstraction</td> + <td class="author">Vitalik Buterin&nbsp;(<a href="https://github.com/vbuterin">@vbuterin</a>), Yoav Weiss&nbsp;(<a href="https://github.com/yoavw">@yoavw</a>), Alex Forshtat&nbsp;(<a href="https://github.com/forshtat">@forshtat</a>), Dror Tirosh&nbsp;(<a href="https://github.com/drortirosh">@drortirosh</a>), Shahaf Nacson&nbsp;(<a href="https://github.com/shahafn">@shahafn</a>)</td> + </tr> + + </table> + + + + + + + + + + + + + + http://localhost:4000/all + http://localhost:4000/all + + + + + / + + <?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Ethereum EIPs</title> + <description>A feed of all EIPs</description> + <link>{{ site.url }}</link> + <atom:link href="{{ site.url }}/all.xml" rel="self" type="application/rss+xml" /> + <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate> + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + <item> + <title>{{ eip.title | xml_escape }}</title> + <category>{{ eip.type | xml_escape }}/{{ eip.category | xml_escape }}</category> + {% if eip.discussions-to %} + <comments>{{ eip.discussions-to | xml_escape }}</comments> + {% endif %} + <description>{{ eip.content | xml_escape }}</description> + <pubDate>{{ eip.created | date_to_rfc822 }}</pubDate> + <link>{{ site.url }}{{ eip.url }}</link> + <guid isPermaLink="true">{{ site.url }}{{ eip.url }}</guid> + </item> + {% endfor %} + </channel> +</rss> + + + http://localhost:4000/rss/all.xml + http://localhost:4000/rss/all.xml + + + + Core + / + + {% assign eips=site.pages|where:"type","Standards Track"|where:"category","Core" %} +{% include eiptable.html eips=eips %} + + + http://localhost:4000/core + http://localhost:4000/core + + + + + / + + <?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Ethereum EIPs - Last Call Review</title> + <description>All EIPs which are in the "last call" status, please help review these and provide your feedback!</description> + <link>{{ site.url }}</link> + <atom:link href="{{ site.url }}/rss/last-call.xml" rel="self" type="application/rss+xml" /> + <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate> + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% if eip.category == "ERC" %} + {% if eip.status == "Last Call" %} + {% capture description %} + <p><strong>EIP #{{ eip.eip }} - {{eip.title }}</strong> is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.</p> + {% if eip.discussions-to %} + <p>The author has requested that discussions happen at the following URL: <a href="{{ eip.discussions-to }}">{{ eip.discussions-to }}</a></p> + {% endif %} + <hr /> + {{ eip.content }} + {% endcapture %} + <item> + <title>{{ eip.title | xml_escape }}</title> + <description>{{ description | xml_escape }}</description> + <pubDate>{{ eip.created | date_to_rfc822 }}</pubDate> + <link>{{ site.url }}/{{ eip.url }}</link> + <guid isPermaLink="true">{{ site.url }}/{{ eip.url }}</guid> + </item> + {% endif %} + {% endif %} + {% endfor %} + </channel> +</rss> + + + http://localhost:4000/rss/erc-last-call.xml + http://localhost:4000/rss/erc-last-call.xml + + + + + / + + <?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Ethereum ERCs</title> + <description>All updates for ERCs</description> + <link>{{ site.url }}</link> + <atom:link href="{{ site.url }}/rss/erc.xml" rel="self" type="application/rss+xml" /> + <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate> + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% if eip.category == "ERC" %} + {% capture description %} + <p><strong>EIP #{{ eip.eip }} - {{eip.title }}</strong> is in the {{ eip.category }} category of type {{ eip.type }} and was just updated.</p> + {% if eip.discussions-to %} + <p>The author has requested that discussions happen at the following URL: <a href="{{ eip.discussions-to }}">{{ eip.discussions-to }}</a></p> + {% endif %} + <hr /> + {{ eip.content }} + {% endcapture %} + <item> + <title>{{ eip.title | xml_escape }}</title> + <description>{{ description | xml_escape }}</description> + <pubDate>{{ eip.created | date_to_rfc822 }}</pubDate> + <link>{{ site.url }}/{{ eip.url }}</link> + <guid isPermaLink="true">{{ site.url }}/{{ eip.url }}</guid> + </item> + {% endif %} + {% endfor %} + </channel> +</rss> + + + http://localhost:4000/rss/erc.xml + http://localhost:4000/rss/erc.xml + + + + Home + / + + <h1 class="page-heading">EIPs + <a href="https://discord.io/EthCatHerders"><img src="https://dcbadge.vercel.app/api/server/Nz6rtfJ8Cu?style=flat" alt="Discord channel for ECH eip-editer"></a> + <a href="https://discord.gg/EVTQ9crVgQ"><img src="https://dcbadge.vercel.app/api/server/EVTQ9crVgQ?style=flat" alt="Discord channel for Eth R&D eip-editing"></a> + <a href="https://discord.gg/mRzPXmmYEA"><img src="https://dcbadge.vercel.app/api/server/mRzPXmmYEA?style=flat" alt="Discord server for discussions about proposals that impact Ethereum wallets"></a> + + <a href="rss/last-call.xml"><img src="https://img.shields.io/badge/rss-Last Calls-red.svg" alt="RSS"></a> + <a href="rss/nonerc.xml"><img src="https://img.shields.io/badge/rss-All except ERC-red.svg" alt="RSS"></a> + <a href="https://eepurl.com/ikqNIP"><img src="https://img.shields.io/badge/-email%20alerts-red.svg" alt="RSS"></a> +</h1> +<p>Ethereum Improvement Proposals (EIPs) describe standards for the Ethereum platform, including core protocol specifications, client APIs, and contract standards. Network upgrades are discussed separately in the <a target="_blank" href="https://github.com/ethereum/pm/">Ethereum Project Management</a> repository.</p> + +<h2>Contributing</h2> +<p>First review <a href="EIPS/eip-1">EIP-1</a>. Then clone the repository and add your EIP to it. There is a <a href="https://github.com/ethereum/EIPs/blob/master/eip-template.md?plain=1">template EIP here</a>. Then submit a Pull Request to Ethereum's <a href="https://github.com/ethereum/EIPs">EIPs repository</a>.</p> + +<h2>EIP status terms</h2> +<ul> + <li><strong>Idea</strong> - An idea that is pre-draft. This is not tracked within the EIP Repository. + <li><strong>Draft</strong> - The first formally tracked stage of an EIP in development. An EIP is merged by an EIP Editor into the EIP repository when properly formatted.</li> + <li><strong>Review</strong> - An EIP Author marks an EIP as ready for and requesting Peer Review.</li> + <li><strong>Last Call</strong> - This is the final review window for an EIP before moving to FINAL. An EIP editor will assign Last Call status and set a review end date (`last-call-deadline`), typically 14 days later. If this period results in necessary normative changes it will revert the EIP to Review.</li> + <li><strong>Final</strong> - This EIP represents the final standard. A Final EIP exists in a state of finality and should only be updated to correct errata and add non-normative clarifications.</li> + <li><strong>Stagnant</strong> - Any EIP in Draft or Review if inactive for a period of 6 months or greater is moved to Stagnant. An EIP may be resurrected from this state by Authors or EIP Editors through moving it back to Draft.</li> + <li><strong>Withdrawn</strong> - The EIP Author(s) have withdrawn the proposed EIP. This state has finality and can no longer be resurrected using this EIP number. If the idea is pursued at later date it is considered a new proposal.</li> + <li><strong>Living</strong> - A special status for EIPs that are designed to be continually updated and not reach a state of finality. This includes most notably EIP-1.</li> +</ul> + +<h2>EIP Types</h2> + +<p>EIPs are separated into a number of types, and each has its own list of EIPs.</p> + +<h3>Standard Track ({{site.pages|where:"type","Standards Track"|size}})</h3> +<p>Describes any change that affects most or all Ethereum implementations, such as a change to the network protocol, a change in block or transaction validity rules, proposed application standards/conventions, or any change or addition that affects the interoperability of applications using Ethereum. Furthermore Standard EIPs can be broken down into the following categories.</p> + +<h4><a href="{{"core"|relative_url}}">Core</a> ({{site.pages|where:"type","Standards Track"|where:"category","Core"|size}})</h4> +<p>Improvements requiring a consensus fork (e.g. <a href="./EIPS/eip-5">EIP-5</a>, <a href="./EIPS/eip-211">EIP-211</a>), as well as changes that are not necessarily consensus critical but may be relevant to “core dev” discussions (for example, the PoA algorithm for testnets described in <a href="./EIPS/eip-225">EIP-225</a>).</p> + +<h4><a href="{{"networking"|relative_url}}">Networking</a> ({{site.pages|where:"type","Standards Track"|where:"category","Networking"|size}})</h4> +<p>Includes improvements around devp2p (<a href="./EIPS/eip-8">EIP-8</a>) and Light Ethereum Subprotocol, as well as proposed improvements to network protocol specifications of whisper and swarm.</p> + +<h4><a href="{{"interface"|relative_url}}">Interface</a> ({{site.pages|where:"type","Standards Track"|where:"category","Interface"|size}})</h4> +<p>Includes improvements around client API/RPC specifications and standards, and also certain language-level standards like method names (<a href="./EIPS/eip-6">EIP-6</a>) and contract ABIs. The label “interface” aligns with the interfaces repo and discussion should primarily occur in that repository before an EIP is submitted to the EIPs repository.</p> + +<h4><a href="{{"erc"|relative_url}}">ERC</a> ({{site.pages|where:"type","Standards Track"|where:"category","ERC"|size}})</h4> +<p>Application-level standards and conventions, including contract standards such as token standards (<a href="./EIPS/eip-20">EIP-20</a>), name registries (<a href="./EIPS/eip-137">EIP-137</a>), URI schemes (<a href="./EIPS/eip-681">EIP-681</a>), library/package formats (<a href="./EIPS/eip-190">EIP-190</a>), and account abstraction (<a href="./EIPS/eip-4337">EIP-4337</a>).</p> + +<h3><a href="{{"meta"|relative_url}}">Meta</a> ({{site.pages|where:"type","Meta"|size}})</h3> +<p>Describes a process surrounding Ethereum or proposes a change to (or an event in) a process. Process EIPs are like Standards Track EIPs but apply to areas other than the Ethereum protocol itself. They may propose an implementation, but not to Ethereum's codebase; they often require community consensus; unlike Informational EIPs, they are more than recommendations, and users are typically not free to ignore them. Examples include procedures, guidelines, changes to the decision-making process, and changes to the tools or environment used in Ethereum development. Any meta-EIP is also considered a Process EIP.</p> + + + http://localhost:4000/ + http://localhost:4000/ + + + + + / + + <?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Ethereum EIPs - Last Call Review</title> + <description>All EIPs which are in the two-week "last call" status, please help review these and provide your feedback!</description> + <link>{{ site.url }}</link> + <atom:link href="{{ site.url }}/rss/last-call.xml" rel="self" type="application/rss+xml" /> + <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate> + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% if eip.status == "Last Call" %} + {% capture description %} + <p><strong>EIP #{{ eip.eip }} - {{eip.title }}</strong> is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.</p> + {% if eip.discussions-to %} + <p>The author has requested that discussions happen at the following URL: <a href="{{ eip.discussions-to }}">{{ eip.discussions-to }}</a></p> + {% endif %} + <hr /> + {{ eip.content }} + {% endcapture %} + <item> + <title>{{ eip.title | xml_escape }}</title> + <description>{{ description | xml_escape }}</description> + <pubDate>{{ eip.created | date_to_rfc822 }}</pubDate> + <link>{{ site.url }}/{{ eip.url }}</link> + <guid isPermaLink="true">{{ site.url }}/{{ eip.url }}</guid> + </item> + {% endif %} + {% endfor %} + </channel> +</rss> + + + http://localhost:4000/rss/last-call.xml + http://localhost:4000/rss/last-call.xml + + + + + / + + <?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Ethereum EIPs - Last Call Review</title> + <description>All EIPs which are in the two-week "last call" status, please help review these and provide your feedback!</description> + <link>{{ site.url }}</link> + <atom:link href="{{ site.url }}/rss/last-call.xml" rel="self" type="application/rss+xml" /> + <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate> + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% unless eip.category == "ERC" %} + {% if eip.status == "Last Call" %} + {% capture description %} + <p><strong>EIP #{{ eip.eip }} - {{eip.title }}</strong> is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.</p> + {% if eip.discussions-to %} + <p>The author has requested that discussions happen at the following URL: <a href="{{ eip.discussions-to }}">{{ eip.discussions-to }}</a></p> + {% endif %} + <hr /> + {{ eip.content }} + {% endcapture %} + <item> + <title>{{ eip.title | xml_escape }}</title> + <description>{{ description | xml_escape }}</description> + <pubDate>{{ eip.created | date_to_rfc822 }}</pubDate> + <link>{{ site.url }}/{{ eip.url }}</link> + <guid isPermaLink="true">{{ site.url }}/{{ eip.url }}</guid> + </item> + {% endif %} + {% endunless %} + {% endfor %} + </channel> +</rss> + + + http://localhost:4000/rss/nonerc-last-call.xml + http://localhost:4000/rss/nonerc-last-call.xml + + + + + / + + <?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Ethereum EIPs</title> + <description>All EIPs that are not ERCs</description> + <link>{{ site.url }}</link> + <atom:link href="{{ site.url }}/rss/last-call.xml" rel="self" type="application/rss+xml" /> + <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate> + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% unless eip.category == "ERC" %} + {% if eip.status == "Last Call" %} + {% capture description %} + <p><strong>EIP #{{ eip.eip }} - {{eip.title }}</strong> is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.</p> + {% if eip.discussions-to %} + <p>The author has requested that discussions happen at the following URL: <a href="{{ eip.discussions-to }}">{{ eip.discussions-to }}</a></p> + {% endif %} + <hr /> + {{ eip.content }} + {% endcapture %} + <item> + <title>{{ eip.title | xml_escape }}</title> + <description>{{ description | xml_escape }}</description> + <pubDate>{{ eip.created | date_to_rfc822 }}</pubDate> + <link>{{ site.url }}/{{ eip.url }}</link> + <guid isPermaLink="true">{{ site.url }}/{{ eip.url }}</guid> + </item> + {% endif %} + {% endunless %} + {% endfor %} + </channel> +</rss> + + + http://localhost:4000/rss/nonerc.xml + http://localhost:4000/rss/nonerc.xml + + + + Precompile for secp256r1 Curve Support + Standards Track/Core + + https://ethereum-magicians.org/t/eip-7212-precompiled-for-secp256r1-curve-support/14789 + + ## Abstract + +This proposal creates a precompiled contract that performs signature verifications in the “secp256r1” elliptic curve by given parameters of message hash, `r` and `s` components of the signature, `x` and `y` coordinates of the public key. So that, any EVM chain - principally Ethereum rollups - will be able to integrate this precompiled contract easily. + +## Motivation + +“secp256r1” elliptic curve is a standardized curve by NIST which has the same calculations by different input parameters with “secp256k1” elliptic curve used by the “ecrecover” precompiled contract. The cost of combined attacks and the security conditions are almost the same for both curves. Adding a precompiled contract which is similar to "ecrecover" can provide signature verifications using the “secp256r1” elliptic curve in the smart contracts and multi-faceted benefits can occur. One important factor is that this curve is widely used and supported in many modern devices such as Apple’s Secure Enclave, Webauthn, Android Keychain which proves the user adoption. Additionally, the introduction of this precompiled contract could enable valuable features in the account abstraction which allows more efficient and flexible management of accounts by transaction signs in mobile devices. +Most of the modern devices and applications rely on the “secp256r1” elliptic curve. The addition of this precompiled contract enables the verification of device native transaction signing mechanisms. For example: + +1. **Apple's Secure Enclave:** There is a separate “Trusted Execution Environment” in Apple hardware which can sign arbitrary messages and can only be accessed by biometric identification. +2. **Webauthn:** Web Authentication (WebAuthn) is a web standard published by the World Wide Web Consortium (W3C). WebAuthn aims to standardize an interface for authenticating users to web-based applications and services using public-key cryptography. It is being used by almost all of the modern web browsers. +3. **Android Keystore:** Android Keystore is an API that manages the private keys and signing methods. The private keys are not processed while using Keystore as the applications’ signing method. Also, it can be done in the “Trusted Execution Environment” in the microchip. +4. **Passkeys:** Passkeys is utilizing FIDO Alliance and W3C standards. It replaces passwords with cryptographic key-pairs which is also can be used for the elliptic curve cryptography. + +Modern devices have these signing mechanisms that are designed to be more secure and they are able to sign transaction data, but none of the current wallets are utilizing these signing mechanisms. So, these secure signing methods can be enabled by the proposed precompiled contract to initiate the transactions natively from the devices and also, can be used for the key management. This proposal aims to reach maximum security and convenience for the key management. + +## Specification + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174. + +As of `FORK_TIMESTAMP` in the integrated EVM chain, add precompiled contract `P256VERIFY` for signature verifications in the “secp256r1” elliptic curve at address `PRECOMPILED_ADDRESS` in `0x100` (indicates 0x0000000000000000000000000000000000000100). + +### Elliptic Curve Information + +“secp256r1” is a specific elliptic curve, also known as “P-256” and “prime256v1” curves. The curve is defined with the following equation and domain parameters: + +``` +# curve: short weierstrass form +y^2 ≡ x^3 + ax + b + +# p: curve prime field modulus +0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# a: elliptic curve short weierstrass first coefficient +0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc + +# b: elliptic curve short weierstrass second coefficient +0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b + +# G: base point of the subgroup +(0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296, + 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5) + +# n: subgroup order (number of points) +0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# h: cofactor of the subgroup +0x1 + +``` + +### Elliptic Curve Signature Verification Steps + +The signature verifying algorithm takes the signed message hash, the signature components provided by the “secp256r1” curve algorithm, and the public key derived from the signer private key. The verification can be done with the following steps: + +``` +# h (message hash) +# pubKey = (public key of the signer private key) + +# Calculate the modular inverse of the signature proof: +s1 = s^(−1) (mod n) + +# Recover the random point used during the signing: +R' = (h * s1) * G + (r * s1) * pubKey + +# Take from R' its x-coordinate: +r' = R'.x + +# Calculate the signature validation result by comparing whether: +r' == r + +``` + +### Required Checks in Verification + +The following requirements **MUST** be checked by the precompiled contract to verify signature components are valid: + +- Verify that the `r` and `s` values are in `(0, n)` (exclusive) where `n` is the order of the subgroup. +- Verify that the point formed by `(x, y)` is on the curve and that both `x` and `y` are in `[0, p)` (inclusive 0, exclusive p) where `p` is the prime field modulus. Note that many implementations use `(0, 0)` as the reference point at infinity, which is not on the curve and should therefore be rejected. + +### Precompiled Contract Specification + +The `P256VERIFY` precompiled contract is proposed with the following input and outputs, which are big-endian values: + +- **Input data:** 160 bytes of data including: + - 32 bytes of the signed data `hash` + - 32 bytes of the `r` component of the signature + - 32 bytes of the `s` component of the signature + - 32 bytes of the `x` coordinate of the public key + - 32 bytes of the `y` coordinate of the public key +- **Output data:** 32 bytes of result data and error + - If the signature verification process succeeds, it returns 1 in 32 bytes format. + +### Precompiled Contract Gas Usage + +The use of signature verification cost by `P256VERIFY` is `3450` gas. Following reasons and calculations are provided in the [Rationale](#rationale) and [Test Cases](#test-cases) sections. + +## Rationale + +“secp256r1” ECDSA signatures consist of `v`, `r`, and `s` components. While the `v` value makes it possible to recover the public key of the signer, most signers do not generate the `v` component of the signature since `r` and `s` are sufficient for verification. In order to provide an exact and more compatible implementation, verification is preferred over recovery for the precompile. + +Existing P256 implementations verify `(x, y, r, s)` directly. We've chosen to match this style here, encoding each argument for the EVM as a `uint256`. + +This is different from the `ecrecover` precompiled address specification. The advantage is that it 1. follows the NIST specification (as defined in NIST FIPS 186-5 Digital Signature Standard (DSS)), 2. matches the rest of the (large) P256 ecosystem, and most importantly 3. allows execution clients to use existing well-vetted verifier implementations and test vectors. + +Another important difference is that the NIST FIPS 186-5 specification does not include a malleability check. We've matched that here in order to maximize compatibility with the large existing NIST P-256 ecosystem. + +Wrapper libraries **SHOULD** add a malleability check by default, with functions wrapping the raw precompile call (exact NIST FIPS 186-5 spec, without malleability check) clearly identified. For example, `P256.verifySignature` and `P256.verifySignatureWithoutMalleabilityCheck`. Adding the malleability check is straightforward and costs minimal gas. + +The `PRECOMPILED_ADDRESS` is chosen as `0x100` as `P256VERIFY` is the first precompiled contract presented as an RIP, and the address is the first available address in the precompiled address set that is reserved for the RIP precompiles. + +The gas cost is proposed by comparing the performance of the `P256VERIFY` and the `ECRECOVER` precompiled contract which is implemented in the EVM at `0x01` address. It is seen that “secp256r1” signature verification is ~15% slower (elaborated in [test cases](#test-cases)) than “secp256k1” signature recovery, so `3450` gas is proposed by comparison which causes similar “mgas/op” values in both precompiled contracts. + +## Backwards Compatibility + +No backward compatibility issues found as the precompiled contract will be added to `PRECOMPILED_ADDRESS` at the next available address in the precompiled address set. + +## Test Cases + +Functional tests are applied for multiple cases in the [reference implementation](#reference-implementation) of `P256VERIFY` precompiled contract and they succeed. Benchmark tests are also applied for both `P256VERIFY` and `ECRECOVER` with some pre-calculated data and signatures in the “go-ethereum”s precompile testing structure to propose a meaningful gas cost for the “secp256r1” signature verifications by the precompiled contract implemented in the [reference implementation](#reference-implementation). The benchmark test results by example data in the assets can be checked: + +- [P256Verify Benchmark Test Results](/assets/rip-7212/p256Verify_benchmark_test) +- [Ecrecover Benchmark Test Results](/assets/rip-7212/ecrecover_benchmark_test) + +``` +# results of geth benchmark tests of +# ECRECOVER and P256VERIFY (reference implementation) +# by benchstat tool + +goos: darwin +goarch: arm64 +pkg: github.com/ethereum/go-ethereum/core/vm + │ compare_p256Verify │ compare_ecrecover │ + │ sec/op │ sec/op │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 57.75µ ± 1% +PrecompiledEcrecover/-Gas=3000-8 50.48µ ± 1% +geomean 57.75µ 50.48µ + + │ compare_p256Verify │ compare_ecrecover │ + │ gas/op │ gas/op │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 3.450k ± 0% +PrecompiledEcrecover/-Gas=3000-8 3.000k ± 0% +geomean 3.450k 3.000k + + │ compare_p256Verify │ compare_ecrecover │ + │ mgas/s │ mgas/s │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 59.73 ± 1% +PrecompiledEcrecover/-Gas=3000-8 59.42 ± 1% +geomean 59.73 59.42 + + │ compare_p256Verify │ compare_ecrecover │ + │ B/op │ B/op │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 1.523Ki ± 0% +PrecompiledEcrecover/-Gas=3000-8 800.0 ± 0% +geomean 1.523Ki 800.0 + + │ compare_p256Verify │ compare_ecrecover │ + │ allocs/op │ allocs/op │ +PrecompiledP256Verify/p256Verify-Gas=3450-8 33.00 ± 0% +PrecompiledEcrecover/-Gas=3000-8 7.000 ± 0% +geomean 33.00 7.000 + +``` + +## Reference Implementation + +Implementation of the `P256VERIFY` precompiled contract is applied to go-ethereum client to create a reference. Also, a “secp256r1” package has already been included in the Besu Native library which is used by Besu client. Other client implementations are in the future roadmap. + +## Security Considerations + +The changes are not directly affecting the protocol security, it is related with the applications using `P256VERIFY` for the signature verifications. The “secp256r1” curve has been using in many other protocols and services and there is not any security issues in the past. + + +## Copyright + +Copyright and related rights waived via [CC0](/LICENSE). + + Thu, 22 Jun 2023 00:00:00 +0530 + http://localhost:4000/RIPS/rip-7212 + http://localhost:4000/RIPS/rip-7212 + + + + Native Account Abstraction + Standards Track/Core + + https://ethereum-magicians.org/t/rip-7560-native-account-abstraction/16664 + + ## Abstract + +Combining the [EIP-2938](./eip-2938) +and [ERC-4337](./eip-4337) +into a comprehensive Native Account Abstraction proposal. + +We propose splitting the Ethereum transaction scope into multiple steps: validations, execution, +and post-transaction logic. +Transaction validity is determined by the result of the validation steps of a transaction. + +We further separate transaction validation for the purposes of authorization and the gas fee payment, +allowing contract B to pay gas for a transaction that will be executed from account contract A. + +The benefits are in backward compatibility with the emerging ERC-4337 ecosystem while achieving the +long-term goal of Native Account Abstraction. + +## Motivation + +ERC-4337 can do a lot as a purely voluntary ERC. However, any of the out-of-protocol ways of achieving +Account Abstraction faces several drawbacks compared to native support. There are a few key areas where +it is weaker than a truly in-protocol solution: + +* Existing users cannot benefit from it or upgrade to use it without moving all their assets and activity + to a new account. + +* Extra gas overhead of ~42k for a basic `UserOperation` compared to ~21k for a basic transaction. + +* Less benefit from in-protocol censorship resistance techniques such as crLists, which target transactions + and would miss `UserOperations`. + +* Relying on a significantly smaller set of participating nodes and non-standard RPC methods like + `eth_sendRawTransactionConditional`. + +* Inability to use `tx.origin` or contracts that rely on it as it returns the meaningless address of a bundler. + +EIP-2938 defines a very mature alternative approach to Account Abstraction. However, it does not translate +well to the architecture of ERC-4337 that is being used in production without any protocol changes. +Therefore, the implementation of EIP-2938 will not benefit as much from the production experience gained by using +ERC-4337 and from maintaining backward compatibility with it. + +There is also a possibility that at some point in the future, the EOAs on Ethereum will be replaced with pre-deployed +smart contracts. This, however, is impossible without an addition of Native Account Abstraction to the protocol. + +## Specification + +### Constants + +| Name | Value | +|-----------------------|---------------------------------------------------------------------------------| +| FORK_BLOCK | TBD | +| AA_TX_TYPE | 4 | +| AA_ENTRY_POINT | `address(7560)` | +| AA_SENDER_CREATOR | `address(ffff7560)` | +| AA_NONCE_MANAGER | TODO | +| AA_BASE_GAS_COST | 15000 | +| AA_ECRECOVER_COST | 6000 | +| VERSION | 1 | +| MAGIC_VALUE_SENDER | 0xbf45c166 // bytes4(keccak256("validateTransaction(uint256,bytes32,bytes)")) | +| MAGIC_VALUE_PAYMASTER | 0xe0e6183a // bytes4(keccak256("validatePaymasterTransaction(uint256,bytes32,bytes)")) | +| MAX_CONTEXT_SIZE | 65536 | +| UNUSED_GAS_PENALTY | 10 | + +### New Transaction Type + +A new [EIP-2718](./eip-2718) transaction with type AA_TX_TYPE is introduced. Transactions of this type are referred to as +“AA transactions”. Their payload should be interpreted as: + +``` + +0x04 || 0x00 || rlp([ + chainId, sender, nonce, builderFee, + callData, paymasterData, deployerData, + maxPriorityFeePerGas, maxFeePerGas, + validationGasLimit, paymasterGasLimit, callGasLimit, + accessList, signature +]) + +``` + +The base gas cost of this transaction is set to AA_BASE_GAS_COST instead of 21000 to reflect the lack of “intrinsic” +ECDSA signature verification. + +If `paymasterData` is specified, its first 20 bytes contain the address of a `paymaster` contract. + +If `deployerData` is specified, its first 20 bytes contain the address of a `deployer` contract. + +### Optional "transaction counter header" + +In some cases the block builders may want to split up an array of type `AA_TX_TYPE` transactions into individual +batches of transactions that perform validations and executions separately. + +Without a header transaction type this would only be possible by creating an artificial legacy type transaction. +Instead, we propose to introduce an explicit "counter" transaction subtype. + +Their payload should be interpreted as: + +``` +0x04 || 0x01 || rlp([chainId, transactionCount]) +``` + +Header transactions have a unique hash calculated as follows: + +``` +keccak256(AA_TX_TYPE || 0x01 || rlp(chainId, transactionCount, blockNumber, txIndex)) +``` + +The `blockNumber` and `txIndex` parameters are added to the hash to achieve unique header transaction IDs. + +The header transactions are only used to help execution clients determine how many of the `AA_TX_TYPE` transactions +belong to each individual batch. +The block is not valid if a header transaction is located anywhere except before an `AA_TX_TYPE` transactions.\ +If a header transaction is included all `AA_TX_TYPE` transactions in the block must be covered by one. + +Header transactions do not affect blockchain state and do not cost any gas. + +### Non-sequential nonce support + +Before RIP-7560, for accounts with associated code (smart contracts), the account nonce is only used and incremented +when the account executes the `CREATE` (`0xf0`) opcode. + +However, with Smart Contract Accounts this creates a bottleneck for some use-cases. +For example, an account that is operated by multiple participants simultaneously will require these participants +to coordinate their transactions to avoid invalidating each other. + +Another example when this can also be a limitation is a case where there are separate execution flows. +A configuration change may require multiple participants to co-sign a transaction but a regular operation does not. +With sequential nonces, all operations will have to be halted until the configuration change is executed. + +To address it we propose an introduction of a separate 2-dimensional nonce used when contracts initiate a transaction. + +The `nonce` parameter of the transaction is to be interpreted as `uint192 key || uint64 seq` value. +The contract account nonce is then defined as a mapping `address account => uint192 key => uint64 seq`. +This approach guarantees unique transaction nonce and hash but removes the requirement of nonce being sequential +numbers. + +This `nonce` is exposed to the EVM in a `NonceManager` pre-deployed contract located at the AA_NONCE_MANAGER address. + +The `nonce` is [validated and incremented](#nonce-validation-frame) on-chain before the rest of the validation code. + +The old `nonce` account parameter remains in use for transactions initiated by EOAs and for the `CREATE` opcode. + +#### NonceManager Pseudocode + +``` + +if evm.caller == AA_ENTRY_POINT: + validate_increment() +else: + get() + +def get(): + if len(evm.calldata) != 44: + evm.revert() + + // address sender, uint192 key + address = to_uint160_be(evm.calldata[0:20]) + key = to_uint192_be(evm.calldata[20:44]) + + nonce = storage.get(keccak(address, key)) + + evm.return((key << 64) + nonce) + +def validate_increment(): + + address = to_uint160_be(evm.calldata[0:20]) + key = to_uint192_be(evm.calldata[20:44]) + nonce = to_uint64_be(evm.calldata[44:52]) + + current_nonce = storage.get(keccak(address, key)) + + if (nonce != current_nonce): + evm.revert() + + storage.set(kecca + k(address, key), current_nonce + 1) + +``` + +#### NonceManager Bytecode and deployment + +TODO. + +### Gas fees are charged directly from the contract balance + +The maximum gas cost of the AA_TX_TYPE transaction is defined as: + +``` + +maxPossibleGasCost = AA_BASE_GAS_COST + + callGasLimit + + paymasterGasLimit + + validationGasLimit + +``` + +If `paymaster` is not specified, the `maxPossibleGasCost` is charged up-front, before any computation is done in any +execution frame, from the balance of the `sender` address. +If `paymaster` is specified, the gas cost is charged from its balance. +The transaction is invalid if the balance of the account that is being pre-charged, +whether it is a `sender` or a `paymaster`, is insufficient. +After the transaction finishes its execution, the address that was pre-charged may receive a gas refund. + +### Gas fees charged for transaction input + +For all the existing transaction types, G_txdatazero (4 gas) and G_txdatanonzero (16 gas) per byte is +charged for the `data` parameter. + +Transaction Type AA_TX_TYPE introduces the following dynamic length inputs: `callData`, `paymasterData`, +`deployerData`, `signature`. Each of these parameters' gas cost is counted towards transaction data cost. +This transaction data gas cost is referred to as `calldataCost` and is subtracted from the `validationGasLimit` +before execution of the transaction. +The transaction is considered INVALID if `validationGasLimit` is smaller than `calldataCost`. + +### Builder Fee + +As we need to account for an additional off-chain work that block builders have to perform to +include `AA_TX_TYPE` transactions in their blocks, as well as a potential L1 gas cost for builders +operating on L2 rollups, and given that this work does not correspond to the amount of gas spent on +validation and is not linked to the gas price, the `sender` may decide +to pay an extra `builderFee` as a "tip" to the block builder. + +This value is denominated in wei and is passed from the `sender`, or the `paymaster` if it is specified, +to the `coinbase` of the current block as part of the gas pre-charge. + +### Unused gas penalty charge + +Transactions of type `AA_TX_TYPE` that reserve a lot of gas for themselves using `validationGasLimit`, +`paymasterGasLimit` and `callGasLimit` fields but do not use the reserved gas present a challenge for +block builders. This is especially demanding in case a gas used by a transaction can be significantly different +based on its position within a block, as such transactions may cause the block builder to iterate its algorithm +many times until a fully utilized block is discovered. + +A penalty of `UNUSED_GAS_PENALTY` percent of the entire unused gas limit is charged from the +transaction `sender` or `paymaster`. + +The total gas limit is calculated as `totalLimit = validationGasLimit + paymasterGasLimit + callGasLimit`.\ +The `totalGasUsed` is calculated as a sum of all gas used during the transaction.\ +The unused gas is calculated as `unusedGas = totalLimit - totalGasUsed`. + +### Multiple execution frames for a single transaction + +All existing transaction types only have an implicit validation phase where balance, nonce, and signature are checked, +and a single top-level execution frame with +`tx.origin == msg.sender` which is the address that is determined by a transaction ECDSA signature. + +When processing a transaction of type `AA_TX_TYPE`, however, multiple execution frames will be created. +The full list of possible frames tries to replicate the ERC-4337 flow: + +1. Validation Phase + * `nonce` validation and increment frame (required) + * `sender` deployment frame (once per account) + * `sender` validation frame (required) + * `paymaster` validation frame (optional) +2. Execution Phase + * `sender` execution frame (required) + * `paymaster` post-transaction frame (optional) + +All execution frames in the "Validation Phase" must be completed successfully without reverting, and the return value +for `sender` and `paymaster` validation frames must include `MAGIC_VALUE_SENDER` and `MAGIC_VALUE_PAYMASTER` accrodingly +in order for the transaction to be considered valid for a given position in a block. + +In terms of block validity, all validation and execution frames may read and write any state when included in the block. +However, the AA transactions in the mempool SHOULD be bound by storage access rules to avoid DoS on block builders. +These rules are defined in [ERC-7562](./eips/eip-7562). + +In all top-level frames, the global variables have the following meaning: + +| Opcode Name | Solidity Equivalent | Value | +|-------------|---------------------|-------------------------------------------------------------------------------| +| `CALLER` | `msg.sender` | The `AA_ENTRY_POINT` address. `AA_SENDER_CREATOR` for the "deployment frame". | +| `ORIGIN` | `tx.origin` | The transaction `sender` address | +| `CALLDATA*` | `msg.data` | The transaction data is set to inputs of the corresponding frame | + +#### Nonce validation frame + +The `NonceManager` is invoked with the following data: + +```solidity +abi.encodePacked(sender, nonce) +``` + +#### Sender deployment frame + +The `deployer` address is invoked with the `deployerData[20:]` as call data input. +It is important that the `deployer` is **not** invoked from the `AA_ENTRY_POINT` but from the `AA_SENDER_CREATOR`. +This is necessary to guarantee that `AA_ENTRY_POINT` may never initiate a call to a `sender` execution function +without first completing a successful validation. + +The gas limit of this frame is set to `validationGasLimit`. +The amount of gas used by this frame is referred to as `senderCreationGasUsed`. + +The sender deployment frame MUST result in the `sender` address becoming +initialized with contract code. + +#### Sender validation frame + +We define the following Solidity struct to represent the AA transaction on-chain: + +```solidity + +struct TransactionType4 { + address sender; + uint256 nonce; + uint256 validationGasLimit; + uint256 paymasterGasLimit; + uint256 callGasLimit; + uint256 maxFeePerGas; + uint256 maxPriorityFeePerGas; + uint256 builderFee; + bytes paymasterData; + bytes deployerData; + bytes callData; + bytes signature; +} + +``` + +We then define the following Solidity method and the `sender` of the transaction is invoked with the corresponding data: + +```solidity + +function validateTransaction(uint256 version, bytes32 txHash, bytes transaction) external returns (uint256 validationData); + +``` + +The gas limit of this frame is set to `validationGasLimit - senderCreationGasUsed - calldataCost`.\ +The `transaction` parameter is interpreted as an ABI encoding of `TransactionType4`.\ +The `txHash` parameter represents the hash of the AA_TX_TYPE transaction with empty signature, as defined in section +[Calculation of Transaction Type AA_TX_TYPE hash](#calculation-of-transaction-type-aatxtype-hash).\ +The `version` parameter is added in order to maintain the Solidity method ID in case of changes to this struct +in future revisions of this EIP. + +The amount of gas used by this frame is referred to as `senderValidationGasUsed`. + +The frame must return 32 bytes `validationData` that is interpreted as: + +```solidity + +abi.encodePacked(MAGIC_VALUE_SENDER, validUntil, validAfter) + +``` + +In order to allow a gas estimation to determine the amount of gas that this frame +requires to complete successfully while not having the actual `signature` value, this function +should avoid reverting on invalid signature, and should return a value different from `MAGIC_VALUE_SENDER`. + +Type of the `validUntil` is 6-byte timestamp value, or zero for "infinite". The transaction is valid only up to this time. +Type of the `validAfter` is 6-byte timestamp. The transaction is valid only after this time. + +The `validateTransaction` function can choose to revert on any condition that can be satisfied during gas estimation. + +#### Paymaster validation frame + +The `paymaster` of the transaction, if specified, is invoked with the following data: + +```solidity + +function validatePaymasterTransaction(uint256 version, bytes32 txHash, bytes transaction) external returns (bytes context, uint256 validationData); + +``` + +The gas limit of this frame is set to `paymasterGasLimit`. + +The amount of gas used by this frame is referred to as `paymasterValidationGasUsed`. + +The `transaction` parameter is interpreted as an ABI encoding of `TransactionType4`.\ +The `txHash` parameter represents the hash of the AA_TX_TYPE transaction with empty signature, as defined in section +[Calculation of Transaction Type AA_TX_TYPE hash](#calculation-of-transaction-type-aatxtype-hash). + +The frame must return a bytes array that is interpreted as: + +```solidity + +abi.encode(context, MAGIC_VALUE_PAYMASTER, validUntil, validAfter) + +``` + +Same as in the [`sender` validation frame](#sender-validation-frame), in order to support gas estimation this +frame should return a value different from `MAGIC_VALUE_PAYMASTER` for conditions that cannot be satisfied +before signing. + +The size of the `context` byte array may not exceed `MAX_CONTEXT_SIZE` for a transaction to be considered valid. + +#### Sender execution frame + +The `sender` address is invoked with `callData` input. + +The gas limit of this frame is set to `callGasLimit`.\ +Calculation of the `calldataCost` value is defined in the +[Gas fees charged for transaction input](#gas-fees-charged-for-transaction-input) section.\ +The amount of gas used by this frame is referred to as `gasUsedByExecution`. + +The validation frames do not revert if the execution frame reverts. +The `postPaymasterTransaction` may still be called with a `success: false` flag. + +#### Paymaster post-transaction frame + +After the sender execution frame is over the `paymaster` may need to perform some post-transaction logic, +for instance to perform some kind of cleanup or bookkeeping. +If the gas payment validation returned a non-zero `context`, the `paymaster` is invoked again +with the following inputs: + +```solidity + +function postPaymasterTransaction(bool success, uint256 actualGasCost, bytes context) external; + +``` + +The `actualGasCost` parameter is the actual amount paid by the paymaster for this transaction, +and `success` indicates whether this transaction's execution frame completed without revert. + +The gas limit of this frame is set to `paymasterGasLimit - paymasterValidationGasUsed`. + +Revert in the `postPaymasterTransaction` frame reverts the transaction's execution frame as well. +The validation frames do not revert if the `postPaymasterTransaction` frame reverts. +The gas fees charged from the `paymaster` will still include the gas cost of the reverted execution frame. + +### Execution flow diagram + +The execution flow determined by an Account Abstraction Transaction is visualised by the following flow diagram: + +![](/assets/rip-7560/flow_diagram.png) +*Execution flow for the Native Account Abstraction Transactions* + +### Execution layer transaction validation + +On the execution layer, the transaction validity conditions for a block are extended as follows: + +``` + +func validateAccountAbstractionTransaction(tx *Transaction) { + assert !(sender.code.length > 0 && deployerData.length > 0) + + if (sender.code.length == 0 && deployerData.length == 0) { + validUntil = (nonce >> 112) & 0xffffffffffff + validAfter = (nonce >> 160) & 0xffffffffffff + assert Date.now() <= validUntil + assert Date.now() >= validAfter + } + + if (sender.code.length == 0 && deployerData.length > 0) { + assert deployerData.length >= 20 + deployer := deployerData[0:20] + calldataCost := calculateCalldataCost(tx) + retDeployer, error := evm.Call( + from: AA_SENDER_CREATOR, + to: deployer, + input: deployerData[20:], + gas: validationGasLimit - calldataCost) + assert error == nil + assert sender.code.length > 0 + } + + if (paymasterData.length > 0) { + assert paymasterData.length >= 20 + paymaster := paymasterData[0:20] + paymasterInput := ABI.encodeWithSelector('validatePaymasterTransaction', tx, tx.hash) + retPaymaster, error := evm.Call( + from: AA_ENTRY_POINT, + to: paymaster, + input: paymasterInput, + gas: paymasterGasLimit) + assert error == nil + assert Date.now() <= retPaymaster.validUntil + assert Date.now() >= retPaymaster.validAfter + assert retPaymaster.isValid + } + + if (sender.code.length == 0) { + signer := ecrecover(tx.hash, tx.signature) + assert signer == sender.address + } else { + senderInput := ABI.encodeWithSelector('validateTransaction', tx, tx.hash); + retSender, error := evm.Call( + from: AA_ENTRY_POINT, + to: sender, + input: senderInput, + gas: validationGasLimit - retDeployer.gasUsed) + assert error == nil + assert Date.now() <= retSender.validUntil + assert Date.now() >= retSender.validAfter + assert retSender.isValid + } +} + +``` + +In order to defend from DoS attack vectors, the block builders performing mempool transaction validation SHOULD consider +the opcode banning and storage access rules described in ERC-7562. + +[Block validation](#execution-layer-block-validation) takes roughly the same amount of work as without AA transactions. +In any case, validation must execute the entire block in order to verify the state change. +During this execution, it currently verifies signatures, nonces, and gas payment. +With Account Abstraction, it will also verify that all the validation frames were successful. +There is a slight increase in required memory mostly used to store the `context` value that is passed from +the `paymaster` validation frame to its post-transaction frame. + +As long as all transaction validation steps return correct values the block is considered valid. +Block builders who are willing to relax the rules applied to the validation frames MAY do so. + +Such transactions MUST NOT be propagated through the default transaction mempool as they will be rejected by the nodes +and the sending node will be blocked as a spammer. +They may be propagated in the alternative mempool that allows them explicitly as defined in ERC-7562. + +### All validation state changes apply before all execution ones + +Filling a block with AA transactions must not be a challenge for the block builder. +However, if each transaction during its execution can alter any state that affects the validity of another transaction +in the mempool, the block builder will be forced to revalidate all transactions in the mempool after each inclusion. + +We mitigate that by applying all changes in all the validation frames of a sequence of AA transactions first +and all execution frames apply immediately after that. + +In theory, the validation frames can also invalidate each other, but we define ways to prevent that by applying +certain rules for the mempool transactions in ERC-7562. + +A builder that chooses not to enforce the rules from ERC-7562 **must** take care to re-validate each transaction +against the mid-block state at the position where it is being included into a block. +Otherwise, the resulting block is likely to end up being invalid. + +### Block structure diagram + +Here is a visual representation of a block that contains multiple Account Abstraction Transactions. +The validation parts of AA transactions are executed as separate transactions, +but are not represented as separate transactions in the block data. + +![](/assets/rip-7560/block_overview.png) +*The structure of a block containing multiple Native Account Abstraction Transactions* + +Zooming into a single transaction, the validation part of an AA transaction may include multiple exectution frames: + +![](/assets/rip-7560/zoom_into_transaction.png) +*Frames within a single Native Account Abstraction Transaction within a block* + +### Validation state change virtual transactions + +The validation frames of the AA_TX_TYPE transaction are represented as individual virtual transactions by the clients. +They are assigned their own sequential `transactionIndex`, and their `transactionHash` is defined as +(`AA_TX_TYPE transaction hash + 1`). + +All block-related RPC methods, like `eth_getBlockByHash` and `eth_getBlockByNumber`, must include these virtual +transactions as part of the `transactions` field and include validation in the block transaction count. + +All transaction-related RPC methods, like `eth_getTransactionByHash` and `eth_getTransactionReceipt`, must +accept the virtual transaction hash as input and return the details calculated as if the validation was a +separate transaction. + +There is a number of behaviours that define transaction-wide effects in Ethereum. +This list includes, but is not limited to: + +* Tracking `accessed_addresses` +* [EIP-1283](./eip-1283) Gas metering for SSTORE +* [EIP-1153](./eip-1153) Transient storage opcodes + +Any such behaviour has separate effects in the "Validation Virtual Transaction" and "Execution Transaction". + +Gas refunds are issued at the end of the entire transaction only. + +### Transaction validity time range parameters + +The `Paymaster validation frame` and the `Sender validation frame` each return values `validUntil` and `validAfter`. +If the transaction is initiated by an EOA, these fields may be encoded into unused bits of the `nonce`. + +These values allow the `sender` and `paymaster` contracts to specify +a time range for the blocks the transaction will be valid for. + +Transaction cannot be included in a block outside of this time range. +If included, such a block is considered invalid. + +Passing `validUntil = 0` and `validAfter = 0` disables the check. + +### Calculation of Transaction Type AA_TX_TYPE hash + +``` + +keccak256(AA_TX_TYPE || 0x00 || rlp(transaction_payload) + +``` + +Note that the `chainId` and `accessList` parameters are included in the transaction hash calculation but are not +available on-chain as part of the `TransactionType4` struct. + +In order to calculate the transaction hash that will be used during the signing of the transaction and validation of +the transaction signature by the `sender`, the value of the `signature` parameter is considered to be an empty +byte array. + +### Accepting EOA account as `sender` to achieve native gas abstraction + +In case the `sender` address does not have any code deployed and the `deployerData` length is zero, +interpret the `signature` parameter as `(y_parity, r, s)` and the `nonce` parameter +as `(validUntil, validAfter, nonce)`. +Replace the sender validation frame with default ECDSA signature validation. +Also check the block timestamp is within the `[validUntil, validAfter]` range. + +The base transaction gas cost, in this case, is increased by `AA_ECRECOVER_COST`. + +The `callData` parameter in this case is interpreted as following: + +``` + +target || value || data + +``` + +### Execution layer block validation + +When validating a block, the validity conditions for a block are extended as follows: + +``` + +for txIndex := 0; txIndex < range block.Transactions.Len(); txIndex++ { + + // 1. Save the current transaction + txCurr = block.Transactions[txIndex] + + if (txCurr.Type() == AccountAbstractionTransaction) { + + // 2. Start running validations for AA transactions + for j := txIndex; j < range block.Transactions().Len(); j++ { + tx = block.Transactions[j] + + // 3. Stop after encountering a non-AA transaction (or reaching the end of the block) + if (tx.Type() != AccountAbstractionTransaction) { + break + } + context[j], paymasterValidationGasUsed[j], error := validateAccountAbstractionTransaction(tx) + assert error == nil + } + + // 4. If all validations are successful, go back to the saved tx index and run all executions + for j := txIndex; j < range block.Transactions().Len(); j++ { + tx = block.Transactions[j] + if (tx.Type() != AccountAbstractionTransaction) { + break + } + + retCall, error := evm.Call( + from: AA_ENTRY_POINT, + to: sender, + input: callData, + gas: callGasLimit) + + txIndex := j // transaction executed - no need to revisit in the outer loop + + + // 5. Run paymaster's post-transaction logic if necessary + if (context[j].Len() == 0){ + continue + } + + paymasterPostTransactionInput := ABI.encodeWithSelector('postPaymasterTransaction', success, actualGasCost, context[j]) + retPostTransaction, error := evm.Call( + from: AA_ENTRY_POINT, + to: paymaster, + input: paymasterPostTransactionInput, + gas: paymasterGasLimit - paymasterValidationGasUsed[j]) + } + } + else { + // handle other types of transactions + evm.Apply(txCurr) + } +} + +``` + +### RPC methods (eth namespace) + +#### `eth_sendTransaction` and `eth_sendRawTransaction` + +Accepts Transaction Type `AA_TX_TYPE`. + +Return values unchanged for a successful call. + +In case of failure, MUST return an error result object, with code and message. +The error code and message SHOULD be set as follows: + +* code: -32500 - transaction validation failed by `sender`. + The message field SHOULD be set to the revert message from the `sender`. + +* code: -32501 - transaction validation failed by `paymaster`. + The message field SHOULD be set to the revert message from the `paymaster`. + +* code: -32502 - transaction rejected because of storage or opcode rules violation in a validation frame. + The message field SHOULD be set to the location and description of the violated rule. + +* code: -32503 - Transaction out of time range. + +* code: -32504 - transaction rejected because `paymaster` is throttled or banned, as defined by ERC-7562. + +* code: -32505 - transaction rejected because `factory` is throttled or banned. + +* code: -32506 - transaction rejected because `sender` is throttled or banned. + +#### `eth_signTransaction` + +Accepts Transaction Type `AA_TX_TYPE`. + +Returns the RLP-encoded transaction object with value for the `signature` field that makes the `AA_TX_TYPE` +transaction valid. + +Returns error object if this operation cannot be performed by the RPC endpoint. + +#### `eth_getTransactionReceipt` + +Accepts the hash of a virtual transaction that encapsulates the validation frames of the `AA_TX_TYPE` transaction. +This transaction's ID is defined as (`AA_TX_TYPE transaction hash + 1`). + +If an AA transaction is included in a block, returns the following values in addition to the existing fields: + +| Name | Value | +|----------------------------|------------------------------------------------------------------------------| +| sender | Address of the sender of this transaction | +| nonce | The transaction nonce value | +| paymaster | Address of the Paymaster if it is paying for the transaction, null otherwise | +| deployer | Address of the Deployer if it is included in the transaction, null otherwise | +| senderCreationGasUsed | The amount of gas actually used by the sender deployment frame | +| senderValidationGasUsed | The amount of gas actually used by the sender validation frame | +| paymasterValidationGasUsed | The amount of gas actually used by the paymaster validation frame | + +Accepts hash of Transaction Type `AA_TX_TYPE`. + +If an AA transaction is included in a block, returns the following values in addition to the existing fields: + +| Name | Value | +|---------------------------------|------------------------------------------------------------------------------------------------| +| status | Either 1 (success) or 0 (failure) status of the execution frame | +| executionGasUsed | The amount of gas actually used by the execution frame | +| postPaymasterTransactionStatus | Either 1 (success), 0 (failure), or `null` (did not run) status of the `postPaymasterTransaction` frame | +| postPaymasterTransactionGasUsed | The amount of gas actually used by the paymaster `postPaymasterTransaction` frame | + +Note that the field `to` is not included as there is no clear `target` in an `AA_TX_TYPE` transaction. + +#### `eth_call` + +Accepts Transaction Type `AA_TX_TYPE` with all fields except `from` and `callData` optional. + +Returns the return value of [the `sender` execution frame](#sender-execution-frame). + +If provided with `paymasterData` and `deployerData` also executes the corresponding frame. + +If any of the frames reverts the call returns the revert data of each reverted frame. + +#### `eth_estimateGasAccountAbstraction` + +Accepts Transaction Type `AA_TX_TYPE` with fields `validationGasLimit`, `paymasterGasLimit`, `callGasLimit` optional. + +Optionally accepts the State Override Set to allow users to modify the state during the gas estimation. +This field as well as its behavior is equivalent to the ones defined for `eth_call` RPC method. + +Returns `{validationGasLimit, paymasterGasLimit, callGasLimit, builderFee}` object. + +Note that the `deployerData` and `paymasterData` fields are required for a consistent result. + +As mentioned earlier, the `sender` and `paymaster` contracts should not revert on the validation failure +and should return a value different from `MAGIC_VALUE_SENDER` or `MAGIC_VALUE_PAYMASTER` accordingly +in order to enable gas estimation. + +One acceptable way to achieve this behavior for Smart Contract Accounts is to compare the `signature` parameter to +a predetermined "dummy signature" and to return without reverting in case the values match. +This will not result in transaction being authorized as long as returned value does not include `MAGIC_VALUE_SENDER`. + +## Rationale + +### Using Solidity method selectors in a Core EIP + +The contracts that have a role in this Account Abstraction proposal, such as `sender` or `paymaster`, +MUST know which code to execute and understand the calldata provided to them in order to validate the transaction. + +We argue that the most straightforward implementation is to rely on Solidity 4-byte method selectors as it is an +established de-facto standard. + +### Accepting `AA_TX_TYPE` transactions from EOAs + +While it may seem like allowing EOAs to initiate `AA_TX_TYPE` transactions contradicts the purpose of Account Abstraction, we argue that this +may actually be important for the adoption of Smart Contract Accounts. + +It will enable all existing EOAs to benefit from the improved UX features like gas abstraction and validity ranges. + +In the future, this can be used to pay gas for transactions that add code to the EOA addresses, +once Ethereum implements changes like the ones proposed in +[EIP-5003: Insert Code into EOAs with AUTHUSURP](./eip-5003), +[EIP-6913: SETCODE instruction](./eip-6913) and +[EIP-7377: Migration Transaction](./eip-7377). + +## Backwards Compatibility + +This EIP preserves most of the design elements established by the ERC-4337. This allows the same client code and smart +contracts to be used in both systems with minimal to no modifications, while providing significant UX improvements. + +Existing contracts are not significantly affected by the change. +The assumption that `tx.origin` is guaranteed to be an EOA is no longer valid. +The assumption that `tx.origin` is the address that pays for the current transaction is no longer valid as well. + +Any code that expects a single top-level execution frame for an Ethereum transaction will have to accommodate +the new transaction type. + +[EIP-3607](./eip-3607) introduces a ban on transactions from senders with deployed code. +This limitation does not apply to AA_TX_TYPE transactions. + +### Migration path for existing ERC-4337 projects and further roadmap + +#### Existing bundlers can co-exist on the network + +The ERC-4337 is not a protocol change and may remain operational in parallel to this EIP indefinitely. +Given the similarity to ERC-4337, the same block builders may easily support both ERC-4337 and `AA_TX_TYPE` transactions. + +#### Accounts need to upgrade their `EntryPoint` to an adapter contract + +The team behind ERC-4337 will provide a reference implementation of a contract converting +the ABI of the `paymaster` and `sender` contracts. This adapter can be set as a trusted +`EntryPoint` address by the ERC-4337 contracts. + +#### Supporting ERC-4337 RPC calls as a compatibility layer + +The `sender` contracts MAY support both ERC-4337 and `AA_TX_TYPE` transactions during a transition period, +as long as this EIP may be adopted by some chains and not by others. + +## Security Considerations + +This EIP creates a complex and sophisticated mechanism and aims to expand the usage of Smart Contract Accounts. +All of it creates a lot of new risk vectors and attack surfaces. + +The following is a non-exhaustive list of known security considerations regarding Native Account Abstraction. + +### Attacks on validation-execution separation + +The state that exists at the end of the validation frame may be observed or modified by unrelated contracts before +the execution frame begins. +`Sender` contracts must take great care in making sure their code does not make any false assumptions. + +### DoS attacks on block builders + +The amount of computation and available memory that is necessary to maintain a mempool and produce valid blocks is +increased significantly. + +### Directly charging the balance of a contract + +This EIP adds a new way for a smart contract to have its balance charged simply by returning a valid value from a +function with method ID that corresponds to `validateTransaction`, `validatePaymasterTransaction`. + +This creates a new kind of risk for contracts that accidentally or maliciously contain such methods but are not public +about the fact that these contracts can be used as a `sender` or a `paymaster` in an `AA_TX_TYPE` transaction. + +This is somewhat mitigated by requiring these contracts to return `MAGIC_VALUE_SENDER` or `MAGIC_VALUE_PAYMASTER`, +however code reviewers should still be aware of this. + +### Observing revert reasons in a validation frame + +Existing transaction types get included in a block even if reverted and provide a revert reason for debugging purposes. +There is a very short list of things that can cause a transaction not to be included on-chain: + +* low gas fee +* insufficient balance +* invalid nonce +* censorship + +This is not the case for reverts that occur in the validation phase of an `AA_TX_TYPE` transaction. +In order to address this developers should track the validity of these transactions being signed and are encouraged +to rely on the `validUntil` time range parameter to guarantee a transaction that has not been included in the intended time +will not become valid again unexpectedly for the user who had sent it. + +## Copyright + +Copyright and related rights waived via [CC0](/LICENSE). + + Fri, 01 Sep 2023 00:00:00 +0530 + http://localhost:4000/RIPS/rip-7560 + http://localhost:4000/RIPS/rip-7560 + + + + + / + + @import "minima"; + + + http://localhost:4000/assets/main.css + http://localhost:4000/assets/main.css + + + + + / + + Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + + + http://localhost:4000/LICENSE + http://localhost:4000/LICENSE + + + + + / + + <?xml version="1.0" encoding="utf-8"?>{% if page.xsl %}<?xml-stylesheet type="text/xml" href="{{ '/feed.xslt.xml' | absolute_url }}"?>{% endif %}<feed xmlns="http://www.w3.org/2005/Atom" {% if site.lang %}xml:lang="{{ site.lang }}"{% endif %}><generator uri="https://jekyllrb.com/" version="{{ jekyll.version }}">Jekyll</generator><link href="{{ page.url | absolute_url }}" rel="self" type="application/atom+xml" /><link href="{{ '/' | absolute_url }}" rel="alternate" type="text/html" {% if site.lang %}hreflang="{{ site.lang }}" {% endif %}/><updated>{{ site.time | date_to_xmlschema }}</updated><id>{{ page.url | absolute_url | xml_escape }}</id>{% assign title = site.title | default: site.name %}{% if page.collection != "posts" %}{% assign collection = page.collection | capitalize %}{% assign title = title | append: " | " | append: collection %}{% endif %}{% if page.category %}{% assign category = page.category | capitalize %}{% assign title = title | append: " | " | append: category %}{% endif %}{% if title %}<title type="html">{{ title | smartify | xml_escape }}</title>{% endif %}{% if site.description %}<subtitle>{{ site.description | xml_escape }}</subtitle>{% endif %}{% if site.author %}<author><name>{{ site.author.name | default: site.author | xml_escape }}</name>{% if site.author.email %}<email>{{ site.author.email | xml_escape }}</email>{% endif %}{% if site.author.uri %}<uri>{{ site.author.uri | xml_escape }}</uri>{% endif %}</author>{% endif %}{% if page.tags %}{% assign posts = site.tags[page.tags] %}{% else %}{% assign posts = site[page.collection] %}{% endif %}{% if page.category %}{% assign posts = posts | where: "category", page.category %}{% endif %}{% unless site.show_drafts %}{% assign posts = posts | where_exp: "post", "post.draft != true" %}{% endunless %}{% assign posts = posts | sort: "date" | reverse %}{% assign posts_limit = site.feed.posts_limit | default: 10 %}{% for post in posts limit: posts_limit %}<entry{% if post.lang %}{{" "}}xml:lang="{{ post.lang }}"{% endif %}>{% assign post_title = post.title | smartify | strip_html | normalize_whitespace | xml_escape %}<title type="html">{{ post_title }}</title><link href="{{ post.url | absolute_url }}" rel="alternate" type="text/html" title="{{ post_title }}" /><published>{{ post.date | date_to_xmlschema }}</published><updated>{{ post.last_modified_at | default: post.date | date_to_xmlschema }}</updated><id>{{ post.id | absolute_url | xml_escape }}</id>{% assign excerpt_only = post.feed.excerpt_only | default: site.feed.excerpt_only %}{% unless excerpt_only %}<content type="html" xml:base="{{ post.url | absolute_url | xml_escape }}">{{ post.content | strip | xml_escape }}</content>{% endunless %}{% assign post_author = post.author | default: post.authors[0] | default: site.author %}{% assign post_author = site.data.authors[post_author] | default: post_author %}{% assign post_author_email = post_author.email | default: nil %}{% assign post_author_uri = post_author.uri | default: nil %}{% assign post_author_name = post_author.name | default: post_author %}<author><name>{{ post_author_name | default: "" | xml_escape }}</name>{% if post_author_email %}<email>{{ post_author_email | xml_escape }}</email>{% endif %}{% if post_author_uri %}<uri>{{ post_author_uri | xml_escape }}</uri>{% endif %}</author>{% if post.category %}<category term="{{ post.category | xml_escape }}" />{% elsif post.categories %}{% for category in post.categories %}<category term="{{ category | xml_escape }}" />{% endfor %}{% endif %}{% for tag in post.tags %}<category term="{{ tag | xml_escape }}" />{% endfor %}{% if post.excerpt and post.excerpt != empty %}<summary type="html">{{ post.excerpt | strip_html | normalize_whitespace | xml_escape }}</summary>{% endif %}{% assign post_image = post.image.path | default: post.image %}{% if post_image %}{% unless post_image contains "://" %}{% assign post_image = post_image | absolute_url %}{% endunless %}<media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="{{ post_image | xml_escape }}" /><media:content medium="image" url="{{ post_image | xml_escape }}" xmlns:media="http://search.yahoo.com/mrss/" />{% endif %}</entry>{% endfor %}</feed> + + http://localhost:4000/feed.xml + http://localhost:4000/feed.xml + + + + diff --git a/_site/rss/erc-last-call.xml b/_site/rss/erc-last-call.xml new file mode 100644 index 0000000..05828bb --- /dev/null +++ b/_site/rss/erc-last-call.xml @@ -0,0 +1,42 @@ + + + + Ethereum EIPs - Last Call Review + All EIPs which are in the "last call" status, please help review these and provide your feedback! + http://localhost:4000 + + Sat, 03 Feb 2024 00:10:05 +0530 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_site/rss/erc.xml b/_site/rss/erc.xml new file mode 100644 index 0000000..5822234 --- /dev/null +++ b/_site/rss/erc.xml @@ -0,0 +1,42 @@ + + + + Ethereum ERCs + All updates for ERCs + http://localhost:4000 + + Sat, 03 Feb 2024 00:10:05 +0530 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_site/rss/last-call.xml b/_site/rss/last-call.xml new file mode 100644 index 0000000..5ca2626 --- /dev/null +++ b/_site/rss/last-call.xml @@ -0,0 +1,42 @@ + + + + Ethereum EIPs - Last Call Review + All EIPs which are in the two-week "last call" status, please help review these and provide your feedback! + http://localhost:4000 + + Sat, 03 Feb 2024 00:10:05 +0530 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_site/rss/nonerc-last-call.xml b/_site/rss/nonerc-last-call.xml new file mode 100644 index 0000000..b898586 --- /dev/null +++ b/_site/rss/nonerc-last-call.xml @@ -0,0 +1,72 @@ + + + + Ethereum EIPs - Last Call Review + All EIPs which are in the two-week "last call" status, please help review these and provide your feedback! + http://localhost:4000 + + Sat, 03 Feb 2024 00:10:05 +0530 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_site/rss/nonerc.xml b/_site/rss/nonerc.xml new file mode 100644 index 0000000..3a7bd18 --- /dev/null +++ b/_site/rss/nonerc.xml @@ -0,0 +1,72 @@ + + + + Ethereum EIPs + All EIPs that are not ERCs + http://localhost:4000 + + Sat, 03 Feb 2024 00:10:05 +0530 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all.html b/all.html new file mode 100644 index 0000000..d57a5a9 --- /dev/null +++ b/all.html @@ -0,0 +1,6 @@ +--- +layout: page +title: All +--- + +{% include eiptable.html eips=site.pages %} diff --git a/config/.codespell-whitelist b/config/.codespell-whitelist new file mode 100644 index 0000000..9d2323c --- /dev/null +++ b/config/.codespell-whitelist @@ -0,0 +1,16 @@ +uint +ith +nd +mitre +readded +crate +developper +ist +iam +espace +acn +ende +sting +complies +shiping +furter diff --git a/config/.jekyll-labels.yml b/config/.jekyll-labels.yml new file mode 100644 index 0000000..56f96e9 --- /dev/null +++ b/config/.jekyll-labels.yml @@ -0,0 +1,28 @@ +#### EIP Type / Category #### + +# Type +t-informational: this?.new?.type == "Informational" && this?.old?.status != "Living" +t-meta: this?.new?.type == "Meta" && this?.old?.status != "Living" + +# Categories +t-core: this?.new?.category == "Core" && this?.old?.status != "Living" +t-networking: this?.new?.category == "Networking" && this?.old?.status != "Living" +t-interface: this?.new?.category == "Interface" && this?.old?.status != "Living" +t-erc: this?.new?.category == "ERC" && this?.old?.status != "Living" + +# Living EIPs & EIP Template +t-process: this?.old?.status == "Living" || this?.old?.title == "" + +# Status +s-draft: this?.new?.status == "Draft" +s-final: this?.new?.status == "Final" +s-lastcall: this?.new?.status == "Lastcall" +s-review: this?.new?.status == "Review" +s-stagnant: this?.new?.status == "Stagnant" +s-withdrawn: this?.new?.status == "Withdrawn" + +#### PR Classification #### + +c-new: this?.new?.status && !this?.old?.status +c-update: this?.new?.status && this?.old?.status && this?.new?.status == this?.old?.status +c-status: this?.new?.status && this?.old?.status && this?.new?.status != this?.old?.status diff --git a/config/.markdownlint.yaml b/config/.markdownlint.yaml new file mode 100644 index 0000000..46c59a4 --- /dev/null +++ b/config/.markdownlint.yaml @@ -0,0 +1,192 @@ +# Rule details can be found at https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md + +default: false + +# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time +MD001: true +# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading (deprecated) +MD002: false + +# MD003/heading-style/header-style - Heading style +MD003: + # Heading style + style: "atx" + +# MD004/ul-style - Unordered list style +MD004: + # List style + style: "consistent" + +# MD005/list-indent - Inconsistent indentation for list items at the same level +MD005: true + +# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line (deprecated) +MD006: false +# MD007/ul-indent - Unordered list indentation +MD007: false +# MD009/no-trailing-spaces - Trailing spaces +MD009: false + +# MD010/no-hard-tabs - Hard tabs +MD010: false + +# MD011/no-reversed-links - Reversed link syntax +MD011: true + +# MD012/no-multiple-blanks - Multiple consecutive blank lines +MD012: false + +# MD013/line-length - Line length +# Changed from default so we can allow the paragraphs to be a single line +MD013: false + +# MD014/commands-show-output - Dollar signs used before commands without showing output +MD014: false + +# MD018/no-missing-space-atx - No space after hash on atx style heading +MD018: true + +# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading +MD019: true + +# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading +MD020: true + +# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading +MD021: true + +# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines +MD022: true + +# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line +MD023: true + +# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content +MD024: + # Only check sibling headings + siblings_only: true + +# MD025/single-title/single-h1 - Multiple top-level headings in the same document +MD025: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD026/no-trailing-punctuation - Trailing punctuation in heading +MD026: false + +# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol +MD027: false + +# MD028/no-blanks-blockquote - Blank line inside blockquote +MD028: true + +# MD029/ol-prefix - Ordered list item prefix +MD029: false + +# MD030/list-marker-space - Spaces after list markers +MD030: + # Spaces for single-line unordered list items + ul_single: 1 + # Spaces for single-line ordered list items + ol_single: 1 + # Spaces for multi-line unordered list items + ul_multi: 1 + # Spaces for multi-line ordered list items + ol_multi: 1 + +# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines +MD031: + # Include list items + list_items: true + +# MD032/blanks-around-lists - Lists should be surrounded by blank lines +MD032: true + +# MD033/no-inline-html - Inline HTML +MD033: + # Allowed elements + allowed_elements: [] + +# MD034/no-bare-urls - Bare URL used +MD034: false + +# MD035/hr-style - Horizontal rule style +MD035: + # Horizontal rule style + style: "consistent" + +# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading +MD036: false + +# MD037/no-space-in-emphasis - Spaces inside emphasis markers +MD037: false + +# MD038/no-space-in-code - Spaces inside code span elements +MD038: true + +# MD039/no-space-in-links - Spaces inside link text +MD039: false + +# MD040/fenced-code-language - Fenced code blocks should have a language specified +MD040: false + +# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading +# NOTE: Since this uses Jekyll, this setting only applies to freestanding markdown files, such as those in the assets folder +MD041: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD042/no-empty-links - No empty links +MD042: true + +# MD043/required-headings/required-headers - Required heading structure +# Handled by EIP Walidator +MD043: false + +# MD044/proper-names - Proper names should have the correct capitalization +MD044: + # List of proper names + names: [] + # Include code blocks + code_blocks: true + # Include HTML elements + html_elements: true + +# MD045/no-alt-text - Images should have alternate text (alt text) +MD045: false + +# MD046/code-block-style - Code block style +MD046: + # Block style + style: "consistent" + +# MD047/single-trailing-newline - Files should end with a single newline character +MD047: true + +# MD048/code-fence-style - Code fence style +MD048: + # Code fence style + style: "consistent" + +# MD049/emphasis-style - Emphasis style should be consistent +MD049: + # Emphasis style should be consistent + style: "consistent" + +# MD050/strong-style - Strong style should be consistent +MD050: + # Strong style should be consistent + style: "consistent" + +# MD051/link-fragments - Link fragments should be valid +MD051: true + +# MD052/reference-links-images - Reference links and images should use a label that is defined +MD052: true + +# MD053/link-image-reference-definitions - Link and image reference definitions should be needed +MD053: true diff --git a/config/eip-editors.yml b/config/eip-editors.yml new file mode 100644 index 0000000..8eb7e2f --- /dev/null +++ b/config/eip-editors.yml @@ -0,0 +1,42 @@ +governance: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 +core: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 + - g11tech +erc: + - axic + - SamWilsn + - Pandapip1 + - xinbenlv + - g11tech +networking: + - lightclient + - axic + - SamWilsn +interface: + - lightclient + - axic + - SamWilsn + - Pandapip1 +meta: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 + - xinbenlv +informational: + - lightclient + - axic + - gcolvin + - SamWilsn + - Pandapip1 + - xinbenlv diff --git a/config/eipw.toml b/config/eipw.toml new file mode 100644 index 0000000..e19bb68 --- /dev/null +++ b/config/eipw.toml @@ -0,0 +1,920 @@ +[[modifiers]] +kind = "set-default-annotation" +name = "status" +value = "Stagnant" +annotation_type = "warning" + +[[modifiers]] +kind = "set-default-annotation" +name = "status" +value = "Withdrawn" +annotation_type = "warning" + +[lints.markdown-re-eip-dash] +kind = "markdown-regex" +mode = "excludes" +pattern = '(?i)eip[\s]*[0-9]+' +message = "proposals must be referenced with the form `EIP-N` (not `EIPN` or `EIP N`)" + +[lints.preamble-date-created] +kind = "preamble-date" +name = "created" + +[lints.preamble-re-description-eip-dash] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = '(?i)eip[\s]*[0-9]+' +message = "proposals must be referenced with the form `EIP-N` (not `EIPN` or `EIP N`)" + +[lints.preamble-re-description-colon] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = ":" +message = "preamble header `description` should not contain `:`" + +[lints.preamble-refs-description] +kind = "preamble-proposal-ref" +name = "description" +prefix = "erc-" +suffix = ".md" + +[lints.preamble-enum-category] +kind = "preamble-one-of" +name = "category" +values = [ + "ERC", +] + +[lints.preamble-re-description] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = '(?i)standar\w*\b' +message = "preamble header `description` should not contain `standard` (or similar words.)" + +[lints.preamble-re-title-erc-dash] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = '(?i)erc[\s]*[0-9]+' +message = "proposals must be referenced with the form `ERC-N` (not `ERCN` or `ERC N`)" + +[lints.preamble-re-description-erc-dash] +kind = "preamble-regex" +name = "description" +mode = "excludes" +pattern = '(?i)erc[\s]*[0-9]+' +message = "proposals must be referenced with the form `ERC-N` (not `ERCN` or `ERC N`)" + +## TODO: Disabled because half the files are in another repository. +# [lints.markdown-refs] +# kind = "markdown-proposal-ref" +# prefix = "erc-" +# suffix = ".md" + +[lints.preamble-req-withdrawal-reason] +kind = "preamble-required-if-eq" +when = "status" +equals = "Withdrawn" +then = "withdrawal-reason" + +[lints.preamble-order] +kind = "preamble-order" +names = [ + "eip", + "title", + "description", + "author", + "discussions-to", + "status", + "last-call-deadline", + "type", + "category", + "created", + "requires", + "withdrawal-reason", +] + +## TODO: Disabled because half the files are in another repository. +# [lints.preamble-requires-status] +# prefix = "erc-" +# suffix = ".md" +# kind = "preamble-requires-status" +# requires = "requires" +# status = "status" +# flow = [ +# [ +# "Draft", +# "Stagnant", +# ], +# ["Review"], +# ["Last Call"], +# [ +# "Final", +# "Withdrawn", +# "Living", +# ], +# ] + +[lints.markdown-order-section] +kind = "markdown-section-order" +sections = [ + "Abstract", + "Motivation", + "Specification", + "Rationale", + "Backwards Compatibility", + "Test Cases", + "Reference Implementation", + "Security Considerations", + "Copyright", +] + +[lints.markdown-rel-links] +kind = "markdown-relative-links" +exceptions = [ + '^https://(www\.)?github\.com/ethereum/consensus-specs/blob/[a-f0-9]{40}/.+$', + '^https://(www\.)?github\.com/ethereum/consensus-specs/commit/[a-f0-9]{40}$', + '^https://(www\.)?github\.com/ethereum/devp2p/blob/[0-9a-f]{40}/.+$', + '^https://(www\.)?github\.com/ethereum/devp2p/commit/[0-9a-f]{40}$', + '^https://(www\.)?github\.com/bitcoin/bips/blob/[0-9a-f]{40}/bip-[0-9]+\.mediawiki$', + '^https://www\.w3\.org/TR/[0-9][0-9][0-9][0-9]/.*$', + '^https://[a-z]*\.spec\.whatwg\.org/commit-snapshots/[0-9a-f]{40}/$', + '^https://www\.rfc-editor\.org/rfc/.*$', +] + +[lints.preamble-req-category] +kind = "preamble-required-if-eq" +when = "type" +equals = "Standards Track" +then = "category" + +[lints.preamble-eip] +kind = "preamble-uint" +name = "eip" + +[lints.markdown-json-cite] +kind = "markdown-json-schema" +language = "csl-json" +additional_schemas = [[ + "https://resource.citationstyles.org/schema/v1.0/input/json/csl-data.json", + """ +{ + \"description\": \"JSON schema for CSL input data\", + \"$schema\": \"http://json-schema.org/draft-07/schema#\", + \"$id\": \"https://resource.citationstyles.org/schema/v1.0/input/json/csl-data.json\", + \"type\": \"array\", + \"items\": { + \"type\": \"object\", + \"properties\": { + \"type\": { + \"type\": \"string\", + \"enum\": [ + \"article\", + \"article-journal\", + \"article-magazine\", + \"article-newspaper\", + \"bill\", + \"book\", + \"broadcast\", + \"chapter\", + \"classic\", + \"collection\", + \"dataset\", + \"document\", + \"entry\", + \"entry-dictionary\", + \"entry-encyclopedia\", + \"event\", + \"figure\", + \"graphic\", + \"hearing\", + \"interview\", + \"legal_case\", + \"legislation\", + \"manuscript\", + \"map\", + \"motion_picture\", + \"musical_score\", + \"pamphlet\", + \"paper-conference\", + \"patent\", + \"performance\", + \"periodical\", + \"personal_communication\", + \"post\", + \"post-weblog\", + \"regulation\", + \"report\", + \"review\", + \"review-book\", + \"software\", + \"song\", + \"speech\", + \"standard\", + \"thesis\", + \"treaty\", + \"webpage\" + ] + }, + \"id\": { + \"type\": [\"string\", \"number\"] + }, + \"citation-key\": { + \"type\": \"string\" + }, + \"categories\": { + \"type\": \"array\", + \"items\": { + \"type\": \"string\" + } + }, + \"language\": { + \"type\": \"string\" + }, + \"journalAbbreviation\": { + \"type\": \"string\" + }, + \"shortTitle\": { + \"type\": \"string\" + }, + \"author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"chair\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"collection-editor\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"compiler\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"composer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"container-author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"contributor\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"curator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"director\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"editor\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"editorial-director\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"executive-producer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"guest\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"host\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"interviewer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"illustrator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"narrator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"organizer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"original-author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"performer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"producer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"recipient\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"reviewed-author\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"script-writer\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"series-creator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"translator\": { + \"type\": \"array\", + \"items\": { + \"$ref\": \"#/definitions/name-variable\" + } + }, + \"accessed\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"available-date\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"event-date\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"issued\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"original-date\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"submitted\": { + \"$ref\": \"#/definitions/date-variable\" + }, + \"abstract\": { + \"type\": \"string\" + }, + \"annote\": { + \"type\": \"string\" + }, + \"archive\": { + \"type\": \"string\" + }, + \"archive_collection\": { + \"type\": \"string\" + }, + \"archive_location\": { + \"type\": \"string\" + }, + \"archive-place\": { + \"type\": \"string\" + }, + \"authority\": { + \"type\": \"string\" + }, + \"call-number\": { + \"type\": \"string\" + }, + \"chapter-number\": { + \"type\": [\"string\", \"number\"] + }, + \"citation-number\": { + \"type\": [\"string\", \"number\"] + }, + \"citation-label\": { + \"type\": \"string\" + }, + \"collection-number\": { + \"type\": [\"string\", \"number\"] + }, + \"collection-title\": { + \"type\": \"string\" + }, + \"container-title\": { + \"type\": \"string\" + }, + \"container-title-short\": { + \"type\": \"string\" + }, + \"dimensions\": { + \"type\": \"string\" + }, + \"division\": { + \"type\": \"string\" + }, + \"DOI\": { + \"type\": \"string\" + }, + \"edition\": { + \"type\": [\"string\", \"number\"] + }, + \"event\": { + \"description\": \"[Deprecated - use 'event-title' instead. Will be removed in 1.1]\", + \"type\": \"string\" + }, + \"event-title\": { + \"type\": \"string\" + }, + \"event-place\": { + \"type\": \"string\" + }, + \"first-reference-note-number\": { + \"type\": [\"string\", \"number\"] + }, + \"genre\": { + \"type\": \"string\" + }, + \"ISBN\": { + \"type\": \"string\" + }, + \"ISSN\": { + \"type\": \"string\" + }, + \"issue\": { + \"type\": [\"string\", \"number\"] + }, + \"jurisdiction\": { + \"type\": \"string\" + }, + \"keyword\": { + \"type\": \"string\" + }, + \"locator\": { + \"type\": [\"string\", \"number\"] + }, + \"medium\": { + \"type\": \"string\" + }, + \"note\": { + \"type\": \"string\" + }, + \"number\": { + \"type\": [\"string\", \"number\"] + }, + \"number-of-pages\": { + \"type\": [\"string\", \"number\"] + }, + \"number-of-volumes\": { + \"type\": [\"string\", \"number\"] + }, + \"original-publisher\": { + \"type\": \"string\" + }, + \"original-publisher-place\": { + \"type\": \"string\" + }, + \"original-title\": { + \"type\": \"string\" + }, + \"page\": { + \"type\": [\"string\", \"number\"] + }, + \"page-first\": { + \"type\": [\"string\", \"number\"] + }, + \"part\": { + \"type\": [\"string\", \"number\"] + }, + \"part-title\": { + \"type\": \"string\" + }, + \"PMCID\": { + \"type\": \"string\" + }, + \"PMID\": { + \"type\": \"string\" + }, + \"printing\": { + \"type\": [\"string\", \"number\"] + }, + \"publisher\": { + \"type\": \"string\" + }, + \"publisher-place\": { + \"type\": \"string\" + }, + \"references\": { + \"type\": \"string\" + }, + \"reviewed-genre\": { + \"type\": \"string\" + }, + \"reviewed-title\": { + \"type\": \"string\" + }, + \"scale\": { + \"type\": \"string\" + }, + \"section\": { + \"type\": \"string\" + }, + \"source\": { + \"type\": \"string\" + }, + \"status\": { + \"type\": \"string\" + }, + \"supplement\": { + \"type\": [\"string\", \"number\"] + }, + \"title\": { + \"type\": \"string\" + }, + \"title-short\": { + \"type\": \"string\" + }, + \"URL\": { + \"type\": \"string\" + }, + \"version\": { + \"type\": \"string\" + }, + \"volume\": { + \"type\": [\"string\", \"number\"] + }, + \"volume-title\": { + \"type\": \"string\" + }, + \"volume-title-short\": { + \"type\": \"string\" + }, + \"year-suffix\": { + \"type\": \"string\" + }, + \"custom\": { + \"title\": \"Custom key-value pairs.\", + \"type\": \"object\", + \"description\": \"Used to store additional information that does not have a designated CSL JSON field. The custom field is preferred over the note field for storing custom data, particularly for storing key-value pairs, as the note field is used for user annotations in annotated bibliography styles.\", + \"examples\": [ + { + \"short_id\": \"xyz\", + \"other-ids\": [\"alternative-id\"] + }, + { + \"metadata-double-checked\": true + } + ] + } + }, + \"required\": [\"type\", \"id\"], + \"additionalProperties\": false + }, + \"definitions\": { + \"name-variable\": { + \"anyOf\": [ + { + \"properties\": { + \"family\": { + \"type\": \"string\" + }, + \"given\": { + \"type\": \"string\" + }, + \"dropping-particle\": { + \"type\": \"string\" + }, + \"non-dropping-particle\": { + \"type\": \"string\" + }, + \"suffix\": { + \"type\": \"string\" + }, + \"comma-suffix\": { + \"type\": [\"string\", \"number\", \"boolean\"] + }, + \"static-ordering\": { + \"type\": [\"string\", \"number\", \"boolean\"] + }, + \"literal\": { + \"type\": \"string\" + }, + \"parse-names\": { + \"type\": [\"string\", \"number\", \"boolean\"] + } + }, + \"additionalProperties\": false + } + ] + }, + \"date-variable\": { + \"title\": \"Date content model.\", + \"description\": \"The CSL input model supports two different date representations: an EDTF string (preferred), and a more structured alternative.\", + \"anyOf\": [ + { + \"properties\": { + \"date-parts\": { + \"type\": \"array\", + \"items\": { + \"type\": \"array\", + \"items\": { + \"type\": [\"string\", \"number\"] + }, + \"minItems\": 1, + \"maxItems\": 3 + }, + \"minItems\": 1, + \"maxItems\": 2 + }, + \"season\": { + \"type\": [\"string\", \"number\"] + }, + \"circa\": { + \"type\": [\"string\", \"number\", \"boolean\"] + }, + \"literal\": { + \"type\": \"string\" + }, + \"raw\": { + \"type\": \"string\" + } + }, + \"additionalProperties\": false + } + ] + } + } +} +""", +]] +schema = """ +{ + \"$id\": \"https://eips.ethereum.org/assets/eip-1/schema/json/citation.json\", + \"description\": \"Citation format for EIPs\", + \"$schema\": \"http://json-schema.org/draft-07/schema#\", + \"allOf\": [ + { + \"$ref\": \"https://resource.citationstyles.org/schema/v1.0/input/json/csl-data.json#/items\" + }, + { + \"required\": [ + \"DOI\", + \"URL\" + ], + \"properties\": { + \"URL\": { + \"format\": \"uri\" + }, + \"custom\": { + \"properties\": { + \"additional-urls\": { + \"type\": \"array\", + \"items\": { + \"format\": \"uri\" + } + } + } + } + } + } + ] +} +""" +help = "see https://github.com/ethereum/eipw/blob/master/eipw-lint/src/lints/markdown/json_schema/citation.json" + +[lints.preamble-no-dup] +kind = "preamble-no-duplicates" + +[lints.preamble-requires-ref-description] +kind = "preamble-require-referenced" +name = "description" +requires = "requires" + +[lints.preamble-re-title] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = '(?i)standar\w*\b' +message = "preamble header `title` should not contain `standard` (or similar words.)" + +[lints.preamble-re-title-eip-dash] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = '(?i)eip[\s]*[0-9]+' +message = "proposals must be referenced with the form `EIP-N` (not `EIPN` or `EIP N`)" + +[lints.preamble-date-last-call-deadline] +kind = "preamble-date" +name = "last-call-deadline" + +[lints.markdown-req-section] +kind = "markdown-section-required" +sections = [ + "Abstract", + "Specification", + "Rationale", + "Security Considerations", + "Copyright", +] + +[lints.markdown-link-status] +prefix = "erc-" +suffix = ".md" +kind = "markdown-link-status" +status = "status" +flow = [ + [ + "Draft", + "Stagnant", +], + ["Review"], + ["Last Call"], + [ + "Final", + "Withdrawn", + "Living", +], +] + +[lints.preamble-re-title-colon] +kind = "preamble-regex" +name = "title" +mode = "excludes" +pattern = ":" +message = "preamble header `title` should not contain `:`" + +[lints.preamble-list-requires] +kind = "preamble-list" +name = "requires" + +[lints.preamble-len-description] +kind = "preamble-length" +name = "description" +min = 2 +max = 140 + +[lints.preamble-requires-ref-title] +kind = "preamble-require-referenced" +name = "title" +requires = "requires" + +[lints.markdown-html-comments] +kind = "markdown-html-comments" +name = "status" +warn_for = [ + "Draft", + "Withdrawn", +] + +[lints.preamble-author] +kind = "preamble-author" +name = "author" + +[lints.preamble-uint-requires] +kind = "preamble-uint-list" +name = "requires" + +[lints.preamble-len-requires] +kind = "preamble-length" +name = "requires" +min = 1 + +[lints.markdown-link-first] +kind = "markdown-link-first" +pattern = "(?i)(?:eip|erc)-[0-9]+" + +[lints.markdown-re-erc-dash] +kind = "markdown-regex" +mode = "excludes" +pattern = '(?i)erc[\s]*[0-9]+' +message = "proposals must be referenced with the form `ERC-N` (not `ERCN` or `ERC N`)" + +[lints.preamble-list-author] +kind = "preamble-list" +name = "author" + +[lints.preamble-enum-type] +kind = "preamble-one-of" +name = "type" +values = [ + "Standards Track", +] + +[lints.preamble-len-title] +kind = "preamble-length" +name = "title" +min = 2 +max = 44 + +[lints.preamble-discussions-to] +kind = "preamble-url" +name = "discussions-to" + +[lints.preamble-req] +kind = "preamble-required" +names = [ + "eip", + "title", + "description", + "author", + "discussions-to", + "status", + "type", + "created", +] + +[lints.preamble-re-discussions-to] +kind = "preamble-regex" +name = "discussions-to" +mode = "includes" +pattern = "^https://ethereum-magicians.org/t/[^/]+/[0-9]+$" +message = "preamble header `discussions-to` should point to a thread on ethereum-magicians.org" + +[lints.preamble-refs-title] +kind = "preamble-proposal-ref" +name = "title" +prefix = "erc-" +suffix = ".md" + +[lints.preamble-enum-status] +kind = "preamble-one-of" +name = "status" +values = [ + "Draft", + "Review", + "Last Call", + "Final", + "Stagnant", + "Withdrawn", + "Living", +] + +[lints.preamble-trim] +kind = "preamble-trim" + +[lints.preamble-req-last-call-deadline] +kind = "preamble-required-if-eq" +when = "status" +equals = "Last Call" +then = "last-call-deadline" + +[lints.preamble-file-name] +kind = "preamble-file-name" +name = "eip" +prefix = "erc-" +suffix = ".md" + + diff --git a/config/mlc_config.json b/config/mlc_config.json new file mode 100644 index 0000000..ed1f966 --- /dev/null +++ b/config/mlc_config.json @@ -0,0 +1,15 @@ +{ + "ignorePatterns": [ + "[`]*csl-json" + ], + "replacementPatterns": [ + { + "pattern": "^/", + "replacement": "/github/workspace/" + } + ], + "aliveStatusCodes": [ + 200, + 429 + ] +} diff --git a/core.html b/core.html new file mode 100644 index 0000000..29cceb2 --- /dev/null +++ b/core.html @@ -0,0 +1,7 @@ +--- +layout: page +title: Core +--- + +{% assign eips=site.pages|where:"type","Standards Track"|where:"category","Core" %} +{% include eiptable.html eips=eips %} diff --git a/index.html b/index.html new file mode 100644 index 0000000..eef163f --- /dev/null +++ b/index.html @@ -0,0 +1,52 @@ +--- +layout: default +title: Home +--- + +

EIPs + Discord channel for ECH eip-editer + Discord channel for Eth R&D eip-editing + Discord server for discussions about proposals that impact Ethereum wallets + + RSS + RSS + RSS +

+

Ethereum Improvement Proposals (EIPs) describe standards for the Ethereum platform, including core protocol specifications, client APIs, and contract standards. Network upgrades are discussed separately in the Ethereum Project Management repository.

+ +

Contributing

+

First review EIP-1. Then clone the repository and add your EIP to it. There is a template EIP here. Then submit a Pull Request to Ethereum's EIPs repository.

+ +

EIP status terms

+
    +
  • Idea - An idea that is pre-draft. This is not tracked within the EIP Repository. +
  • Draft - The first formally tracked stage of an EIP in development. An EIP is merged by an EIP Editor into the EIP repository when properly formatted.
  • +
  • Review - An EIP Author marks an EIP as ready for and requesting Peer Review.
  • +
  • Last Call - This is the final review window for an EIP before moving to FINAL. An EIP editor will assign Last Call status and set a review end date (`last-call-deadline`), typically 14 days later. If this period results in necessary normative changes it will revert the EIP to Review.
  • +
  • Final - This EIP represents the final standard. A Final EIP exists in a state of finality and should only be updated to correct errata and add non-normative clarifications.
  • +
  • Stagnant - Any EIP in Draft or Review if inactive for a period of 6 months or greater is moved to Stagnant. An EIP may be resurrected from this state by Authors or EIP Editors through moving it back to Draft.
  • +
  • Withdrawn - The EIP Author(s) have withdrawn the proposed EIP. This state has finality and can no longer be resurrected using this EIP number. If the idea is pursued at later date it is considered a new proposal.
  • +
  • Living - A special status for EIPs that are designed to be continually updated and not reach a state of finality. This includes most notably EIP-1.
  • +
+ +

EIP Types

+ +

EIPs are separated into a number of types, and each has its own list of EIPs.

+ +

Standard Track ({{site.pages|where:"type","Standards Track"|size}})

+

Describes any change that affects most or all Ethereum implementations, such as a change to the network protocol, a change in block or transaction validity rules, proposed application standards/conventions, or any change or addition that affects the interoperability of applications using Ethereum. Furthermore Standard EIPs can be broken down into the following categories.

+ +

Core ({{site.pages|where:"type","Standards Track"|where:"category","Core"|size}})

+

Improvements requiring a consensus fork (e.g. EIP-5, EIP-211), as well as changes that are not necessarily consensus critical but may be relevant to “core dev” discussions (for example, the PoA algorithm for testnets described in EIP-225).

+ +

Networking ({{site.pages|where:"type","Standards Track"|where:"category","Networking"|size}})

+

Includes improvements around devp2p (EIP-8) and Light Ethereum Subprotocol, as well as proposed improvements to network protocol specifications of whisper and swarm.

+ +

Interface ({{site.pages|where:"type","Standards Track"|where:"category","Interface"|size}})

+

Includes improvements around client API/RPC specifications and standards, and also certain language-level standards like method names (EIP-6) and contract ABIs. The label “interface” aligns with the interfaces repo and discussion should primarily occur in that repository before an EIP is submitted to the EIPs repository.

+ +

ERC ({{site.pages|where:"type","Standards Track"|where:"category","ERC"|size}})

+

Application-level standards and conventions, including contract standards such as token standards (EIP-20), name registries (EIP-137), URI schemes (EIP-681), library/package formats (EIP-190), and account abstraction (EIP-4337).

+ +

Meta ({{site.pages|where:"type","Meta"|size}})

+

Describes a process surrounding Ethereum or proposes a change to (or an event in) a process. Process EIPs are like Standards Track EIPs but apply to areas other than the Ethereum protocol itself. They may propose an implementation, but not to Ethereum's codebase; they often require community consensus; unlike Informational EIPs, they are more than recommendations, and users are typically not free to ignore them. Examples include procedures, guidelines, changes to the decision-making process, and changes to the tools or environment used in Ethereum development. Any meta-EIP is also considered a Process EIP.

diff --git a/rss/all.xml b/rss/all.xml new file mode 100644 index 0000000..b5be0a9 --- /dev/null +++ b/rss/all.xml @@ -0,0 +1,27 @@ +--- +layout: null +--- + + + + Ethereum EIPs + A feed of all EIPs + {{ site.url }} + + {{ site.time | date_to_rfc822 }} + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + + {{ eip.title | xml_escape }} + {{ eip.type | xml_escape }}/{{ eip.category | xml_escape }} + {% if eip.discussions-to %} + {{ eip.discussions-to | xml_escape }} + {% endif %} + {{ eip.content | xml_escape }} + {{ eip.created | date_to_rfc822 }} + {{ site.url }}{{ eip.url }} + {{ site.url }}{{ eip.url }} + + {% endfor %} + + diff --git a/rss/erc-last-call.xml b/rss/erc-last-call.xml new file mode 100644 index 0000000..5ba15cf --- /dev/null +++ b/rss/erc-last-call.xml @@ -0,0 +1,35 @@ +--- +layout: null +--- + + + + Ethereum EIPs - Last Call Review + All EIPs which are in the "last call" status, please help review these and provide your feedback! + {{ site.url }} + + {{ site.time | date_to_rfc822 }} + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% if eip.category == "ERC" %} + {% if eip.status == "Last Call" %} + {% capture description %} +

EIP #{{ eip.eip }} - {{eip.title }} is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.

+ {% if eip.discussions-to %} +

The author has requested that discussions happen at the following URL: {{ eip.discussions-to }}

+ {% endif %} +
+ {{ eip.content }} + {% endcapture %} + + {{ eip.title | xml_escape }} + {{ description | xml_escape }} + {{ eip.created | date_to_rfc822 }} + {{ site.url }}/{{ eip.url }} + {{ site.url }}/{{ eip.url }} + + {% endif %} + {% endif %} + {% endfor %} +
+
diff --git a/rss/erc.xml b/rss/erc.xml new file mode 100644 index 0000000..48f58f5 --- /dev/null +++ b/rss/erc.xml @@ -0,0 +1,33 @@ +--- +layout: null +--- + + + + Ethereum ERCs + All updates for ERCs + {{ site.url }} + + {{ site.time | date_to_rfc822 }} + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% if eip.category == "ERC" %} + {% capture description %} +

EIP #{{ eip.eip }} - {{eip.title }} is in the {{ eip.category }} category of type {{ eip.type }} and was just updated.

+ {% if eip.discussions-to %} +

The author has requested that discussions happen at the following URL: {{ eip.discussions-to }}

+ {% endif %} +
+ {{ eip.content }} + {% endcapture %} + + {{ eip.title | xml_escape }} + {{ description | xml_escape }} + {{ eip.created | date_to_rfc822 }} + {{ site.url }}/{{ eip.url }} + {{ site.url }}/{{ eip.url }} + + {% endif %} + {% endfor %} +
+
diff --git a/rss/last-call.xml b/rss/last-call.xml new file mode 100644 index 0000000..da06188 --- /dev/null +++ b/rss/last-call.xml @@ -0,0 +1,33 @@ +--- +layout: null +--- + + + + Ethereum EIPs - Last Call Review + All EIPs which are in the two-week "last call" status, please help review these and provide your feedback! + {{ site.url }} + + {{ site.time | date_to_rfc822 }} + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% if eip.status == "Last Call" %} + {% capture description %} +

EIP #{{ eip.eip }} - {{eip.title }} is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.

+ {% if eip.discussions-to %} +

The author has requested that discussions happen at the following URL: {{ eip.discussions-to }}

+ {% endif %} +
+ {{ eip.content }} + {% endcapture %} + + {{ eip.title | xml_escape }} + {{ description | xml_escape }} + {{ eip.created | date_to_rfc822 }} + {{ site.url }}/{{ eip.url }} + {{ site.url }}/{{ eip.url }} + + {% endif %} + {% endfor %} +
+
diff --git a/rss/nonerc-last-call.xml b/rss/nonerc-last-call.xml new file mode 100644 index 0000000..17f0939 --- /dev/null +++ b/rss/nonerc-last-call.xml @@ -0,0 +1,35 @@ +--- +layout: null +--- + + + + Ethereum EIPs - Last Call Review + All EIPs which are in the two-week "last call" status, please help review these and provide your feedback! + {{ site.url }} + + {{ site.time | date_to_rfc822 }} + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% unless eip.category == "ERC" %} + {% if eip.status == "Last Call" %} + {% capture description %} +

EIP #{{ eip.eip }} - {{eip.title }} is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.

+ {% if eip.discussions-to %} +

The author has requested that discussions happen at the following URL: {{ eip.discussions-to }}

+ {% endif %} +
+ {{ eip.content }} + {% endcapture %} + + {{ eip.title | xml_escape }} + {{ description | xml_escape }} + {{ eip.created | date_to_rfc822 }} + {{ site.url }}/{{ eip.url }} + {{ site.url }}/{{ eip.url }} + + {% endif %} + {% endunless %} + {% endfor %} +
+
diff --git a/rss/nonerc.xml b/rss/nonerc.xml new file mode 100644 index 0000000..327e478 --- /dev/null +++ b/rss/nonerc.xml @@ -0,0 +1,35 @@ +--- +layout: null +--- + + + + Ethereum EIPs + All EIPs that are not ERCs + {{ site.url }} + + {{ site.time | date_to_rfc822 }} + {% assign eips = site.pages | sort: 'eip' %} + {% for eip in eips %} + {% unless eip.category == "ERC" %} + {% if eip.status == "Last Call" %} + {% capture description %} +

EIP #{{ eip.eip }} - {{eip.title }} is in Last Call status. It is authored by {{ eip.author }} and was originally created {{ eip.created }}. It is in the {{ eip.category }} category of type {{ eip.type }}. Please review and note any changes that should block acceptance.

+ {% if eip.discussions-to %} +

The author has requested that discussions happen at the following URL: {{ eip.discussions-to }}

+ {% endif %} +
+ {{ eip.content }} + {% endcapture %} + + {{ eip.title | xml_escape }} + {{ description | xml_escape }} + {{ eip.created | date_to_rfc822 }} + {{ site.url }}/{{ eip.url }} + {{ site.url }}/{{ eip.url }} + + {% endif %} + {% endunless %} + {% endfor %} +
+