From 28725ddadb126fac1c97e09537045c5caf75fdd8 Mon Sep 17 00:00:00 2001 From: David Ansermino <14164624+ansermino@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:47:18 -0400 Subject: [PATCH 1/7] Initial draft for publishing --- FIPS/fip-common_node_api.md | 194 ++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 FIPS/fip-common_node_api.md diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md new file mode 100644 index 00000000..689abe76 --- /dev/null +++ b/FIPS/fip-common_node_api.md @@ -0,0 +1,194 @@ +--- +fip: "" +title: Filecoin Common Node Interface V1 +author: "David Ansermino (@ansermino), Aatif Syed (@aatifsyed)" +discussions-to: +status: Draft +type: FTP +category (*only required for Standard Track): Interface +created: 2024-06-25 + +--- + + + + +# FIP-Number: Filecoin Common Node API + +## Simple Summary +Establish an basic specification for the common JSON-RPC API provided by Filecoin node implementations. + +## Abstract + + +Lacking a common API for all node implementations, client diversity is hindered as applications are unlikely to be interoperable with different node implementations. Lotus is the defacto reference implementation, but lacks a sufficiently specified interface for other implementers to replicate. + +In this FIP a subset of existing RPC methods are formally specified to enable consistency across implementations, and provide clarity on the methods users can expect when interacting with a node. + +## Change Motivation + + + +The JSON-RPC interface provided by Filecoin node implementations is the primary interaction point for many systems, however a standard interface has yet to be established definitively. Lacking such standards, builders are forced to invest additional time and resources in reverse engineering implementations. Node interoperability is hindered as there are no gurantees about what APIs will be encountered in the wild. A proper specification will enable the development of applications that are implementation-agnostic. + +Ultimately the [Lotus RPC API](https://github.com/filecoin-project/lotus/blob/b73d4e0481517b395a0e9aa9af5dab8bedc18285/documentation/en/api-v1-unstable-methods.md#mpoolpushmessage) is the defacto specification currently, which includes 280+ methods. Based on our exploration and discussions with the Lotus team we have established that some methods provide duplicated functionality (eg. `ChainGetGenesis()` is equivalent to`ChainGetTipSetByHeight(0)`). Another subset of methods are related to implementation-specific internals (eg. `ChainHotGC`). And yet another subset are for the purpose of configuring the instance, which could be exposed through other means (eg. CLI, config file) depending on the design principles of a node implementation. This leads us to conclude that the canonical RPC interface should only include a subset of the methods currently supported by Lotus. + +The defacto Lotus specification is lacking in several features: complete JSON schemas, descriptions for each method, and reliable consistency with the implementation. This motivates us to propose a normative OpenRPC schema for the purpose of defining this interface in a machine readable format. This format in turn enables: +1. Compliance checks - enable implementations of the interface to verify the syntax +2. Specificity - it provides a language agnostic format for defining the ABI of the methods in the interface +3. Discoverability - allow consumers to dynamically interact with providers +4. Lack of desire to reinvent the wheel - It's not perfect, but it works... + +Additionally, by establishing a specification we seek to establish a greater responsibility on implementers and encourage more discourse for future iterations and further interfaces. The present API shows signs of rapid iteration and the resulting technical debt. + +## Specification + + +Using the OpenRPC specification format we define several groups of methods. These methods are defined in the OpenRPC specification found here: https://github.com/ChainSafe/filecoin-openrpc-spec. A list of the methods is included below for posterity. + +All methods are reproduced identically to their present implementation in Lotus 1.26.1. + +Categories have been assigned to indicate the identified use case (see Design Rationale). + +Node implementers must include all specified methods in their API without any modifications. Implementers may choose to provide additional methods beyond what is included in this specification. The endpoint used to serve RPC requests must be versioned acccording the majo + +## Subscription methods +The `ChainNotify` method is not a simple request/response, but rather a bidirectional exchange of JSON-RPC-like messages as follows: + +1. Caller sends a JSON-RPC request to the endpoint, with no parameters. + ```json + { "jsonrpc": "2.0", "id": 1, "method": "Filecoin.ChainNotify" } + ``` +2. Callee sends a JSON-RPC response with an integer Channel ID + ```json + { "jsonrpc": "2.0", "id": 1, "result": 2} + ``` +3. Callee sends JSON-RPC notifications, with a pair of positional parameters. The first is the Channel ID, the second is the actual payload + ```json + { "jsonrpc": "2.0", "method": "xrpc.ch.val", params: [2, {}] } + ``` +4. Caller sends a JSON-RPC request to cancel the subscription, with their Channel ID + ```json + { "jsonrpc": "2.0", "id": 1, "method": "xrpc.cancel", params: [2] } + ``` +5. Callee responds with a JSON-RPC notification of cancellation + ```json + { "jsonrpc": "2.0", "id": 1, "method": "xrpc.ch.close", params: [2] } + ``` + + +## Methods + +> Current list here (TBC): https://docs.google.com/spreadsheets/d/1fFkQuEjvFAd2s1dGX5zGmhxsEMLMUZ4uQFnIXgSZA5w/edit?usp=drivesdk + +| Method | Tag | Description | +|---|---|---| +|MethodName|Tags | Description of method| + + + +## Design Rationale + + +This interface is contrived from the existing [Lotus RPC V1 interface](https://github.com/filecoin-project/lotus/blob/48287574d82c81ffc50f259134c6596add32a2f5/documentation/en/api-v1-unstable-methods.md). Due to the large number of methods presently supported, we have limited the scope of this specification to include methods with a well established use case. We have observed the requirements of Lotus-miner, Curio, Web3Mine and Boost to inform which methods are actively used. We have also considered insights from Glif based on the usage of their RPC service. + +We target two groups of users: *end users* and *node operators*. These each have their own requirements for particular data and access control. While no attempt is made in this FIP to specify considerations for these groups (eg. access control), these groups are used to justify the need for particular methods. + + +Methods included in the API fall into one of these categories: + +- State Queries + - These primarily concern the chain state, actor state or network (p2p) state. They are read-only methods that are necessary to expose all elements of global state. + +- Miner Operations + - A small set of specialized methods miner applications require to participate in consensus. + +- Transactions + - Necessary methods to submit new transaction for inclusion in the chain, including inspecting the mempool and estimating gas parameters. + +- Node Operation + - Several methods are included to enable remote management and inspection of a node instance via RPC. These have been restricted to commonly used, implementation-agnostic methods. + +### Additional Notes + +#### `Eth` Methods +`Eth` methods have been excluded as they are inferred from the [Ethereum JSON-RPC specification](https://ethereum.org/en/developers/docs/apis/json-rpc/), with some changes. We intend for these differences to specified in a later FIP. + +### Future Revisions +It is expected that changes to this API will be made at some point in the future. All non-breaking changes should be introduced within the spec repo, at the discretion of node implementation teams (presently Lotus, Forest, Venus). Rough consensus should be followed, with implementation teams that adhere to the specification as the primary decision makers. + +Breaking changes must be submitted as an FIP before being introduced to the latest spec. + +In all cases valid semantic versioning must be used. + +## Backwards Compatibility - Review + + +The methods in this specification are a subset of methods from the existing defacto specification (ie. Lotus API), which all implementation follow, thus backwards compatibility is maintained. + +## Test Cases + + +[TODO] + +We may want to consider three types of testing: +- Schema conformance (request/response structure in OpenRPC document is valid) +- Implementation conformance (implementation adheres to schemas) +- Functional conformance (request returns expected response values) + + +## Security Considerations + + +Node implementers must consider the security implications of all methods and ensure sufficient access controls are implemented. This is beyond the scope of this FIP. + +## Incentive Considerations + + +Not relevant to this FIP. + +## Product Considerations + + +A better API, one that is well defined and carefully constructed, will ease the development of many types of applications. This FIP is only sufficient in ensuring the API is well defined, additional work is needed in future to refine the API. + +## Implementation + + +- [ ] Lotus + - [ ] Implementation of Common Node API methods + - [ ] OpenRPC document available + - [ ] Automated testing of conformance to schema + - [ ] Common Node API methods conform to schema +- [ ] Forest + - [ ] Implementation of Common Node API methods + - [ ] OpenRPC document available + - [ ] Automated testing of conformance to schema + - [ ] Common Node API methods conform to schema +- [ ] Venus + - [ ] Implementation of Common Node API methods + - [ ] OpenRPC document available + - [ ] Automated testing of conformance to schema + - [ ] Common Node API methods conform to schema + +## TODO + + +- [ ] Confirm methods that are included +- [ ] Improve descriptions for included methods +- [ ] Change link to be an issue for the inconsistency +- [ ] Add a note on URIs (eg. `/rpc/v1`) +- [ ] Publish two versions of the document, one per URI +- [ ] Describe ChainNotify in OpenRPC +- [ ] Make ChainNotify definition more generic +- [ ] Add link to playground +- [ ] @ansermino look into contentdescriptors +- [ ] Perform proper spellcheck +- [ ] Review https://github.com/filecoin- +- [ ] Setup discussion forum and add to header +- [ ] Reach out to Venus to establish the state of their RPC +- [ ] Transfer spec repo to filecoin-project and update links above +- [ ] Add examples to all methods in spec + +## Copyright +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). \ No newline at end of file From fc21a754eb963699397af77d5c2989626af323e0 Mon Sep 17 00:00:00 2001 From: David Ansermino <14164624+ansermino@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:53:40 -0400 Subject: [PATCH 2/7] Update FIP table --- FIPS/fip-common_node_api.md | 2 +- README.md | 183 ++++++++++++++++++------------------ 2 files changed, 93 insertions(+), 92 deletions(-) diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md index 689abe76..55791cb9 100644 --- a/FIPS/fip-common_node_api.md +++ b/FIPS/fip-common_node_api.md @@ -13,7 +13,7 @@ created: 2024-06-25 -# FIP-Number: Filecoin Common Node API +# FIP-Number: Common Node API ## Simple Summary Establish an basic specification for the common JSON-RPC API provided by Filecoin node implementations. diff --git a/README.md b/README.md index 69ec8992..01c74755 100644 --- a/README.md +++ b/README.md @@ -38,94 +38,95 @@ This improvement protocol helps achieve that objective for all members of the Fi ## FIPs -| FIP # | Title | Type | Author | Status | -|-------------------------------------------------------------------------------|-------|------|--------|--------| -| [0001](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0001.md) | FIP Purpose and Guidelines | FIP | @Whyrusleeping | Active | -| [0002](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0002.md) | Free Faults on Newly Faulted Sectors of a Missed WindowPoSt | FIP | @anorth, @davidad, @miyazono, @irenegia, @lucaniz, @nicola, @zixuanzh | Final | -| [0003](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0003.md) | Filecoin Plus Principles | FIP | @feerst, @jbenet, @jnthnvctr, @tim-murmuration, @mzargham, @zixuanzh | Active | -| [0004](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0004.md) | Liquidity Improvement for Storage Miners | FIP | @davidad, @jbenet, @zenground0, @zixuanzh, @danlessa | Final | -| [0005](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0005.md) | Remove ineffective reward vesting | FIP | @anorth, @Zenground | Final | -| [0006](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0006.md) | No repay debt requirement for DeclareFaultsRecovered | FIP | @nicola, @irenegia | Deferred | -| [0007](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0007.md) | h/amt-v3 | FIP | @rvagg, @Stebalien, @anorth, @Zenground0 | Final | -| [0008](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0008.md) | Add miner batched sector pre-commit method | FIP | @anorth, @ZenGround0, @nicola | Final | -| [0009](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0009.md) | Exempt Window PoSts from BaseFee burn | FIP | @Stebalien, @momack2, @magik6k, @zixuanzh | Final | -| [0010](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0010.md) | Off-Chain Window PoSt Verification | FIP | @Stebalien, @anorth | Final | -| [0011](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0011.md) | Remove reward auction from reporting consensus faults | FIP | @Kubuxu | Final | -| [0012](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0012.md) | DataCap Top up for FIL+ Client Addresses | FIP | @dshoy, @jnthnvctr, @zx | Final | -| [0013](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0013.md) | Add ProveCommitSectorAggregated method to reduce on-chain congestion | FIP | @ninitrava @nicola | Final | -| [0014](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0014.md) | Allow V1 proof sectors to be extended up to a maximum of 540 days | FIP | @deltazxm, @neogeweb3 | Final | -| [0015](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0015.md) | Revert FIP-0009(Exempt Window PoSts from BaseFee burn) | FIP | @jennijuju, @arajasek | Final | -| [0016](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0016.md) | Pack arbitrary data in CC sectors | FIP | donghengzhao (@1475) | Deferred | -| [0017](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0017.md) | Three-messages lightweight sector updates | FIP | @nicole, @lucaniz, @irenegia | Deferred | -| [0018](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0018.md) | New miner terminology proposal | FIP | @Stefaan-V | Final | -| [0019](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) | Snap Deals | FIP | @Kubuxu, @lucaniz, @nicola, @rosariogennaro, @irenegia | Final | -| [0020](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0020.md) | Add return value to WithdrawBalance | FIP | @Stefaan-V | Final | -| [0021](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0021.md) | Correct quality calculation on expiration | FIP | @Steven004, @Zenground0 | Final | -| [0022](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0022.md) | Bad deals don't fail PublishStorageDeals | FIP | @Zenground0 | Final | -| [0023](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0023.md) | Break ties between tipsets of equal weights | FIP | @sa8, @arajasek | Final | -| [0024](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0024.md) | BatchBalancer & BatchDiscount Post -Hyperdrive adjustment | FIP | @zx, @jbenet, @zenground0, @momack2 | Final | -| [0025](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0025.md) | Handle expired deals in ProveCommit | FIP | @ZenGround0 | Deferred | -| [0026](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0026.md) | Extend sector fault cutoff period from 2 weeks to 6 weeks | FIP | @IPFSUnion | Final | -| [0027](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0027.md) | Change type of DealProposal Label field from a (Golang) String to a Union | FIP | @laudiacay, @Stebalien, @arajasek | Final | -| [0028](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0028.md) | Remove DataCap and verified client status from client address | FIP | @jennijuju, @dkkapur | Final | -| [0029](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0029.md) | Beneficiary address for storage providers | FIP | @steven004 | Final | -| [0030](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0030.md) | Introducing the Filecoin Virtual Machine (FVM) | FIP | @raulk, @stebalien | Final | -| [0031](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0031.md) | Atomic switch to non-programmable FVM | FIP | @raulk, @stebalien | Final | -| [0032](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0032.md) | Gas model adjustment for non-programmable FVM | FIP | @raulk, @stebalien | Final | -| [0033](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0033.md) | Explicit premium for FIL+ verified deals | FIP | @anorth | Deferred | -| [0034](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0034.md) | Fix pre-commit deposit independent of sector content | FIP | @anorth, @Kubuxu | Final | -| [0035](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0035.md) | Support actors as built-in storage market clients | FIP | @anorth | Withdrawn | -| [0036](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0036.md) | Introducing a Sector Duration Multiple for Longer Term Sector Commitment | FIP | @AxCortesCubero, @jbenet, @misilva73, @momack2, @tmellan, @vkalghatgi, @zixuanzh | Rejected | -| [0037](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0037.md) | Gas model adjustment for user programmability | FIP | @raulk, @stebalien | Draft | -| [0038](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0038.md) | Indexer Protocol for Filecoin Content Discovery | FRC | @willscott, @gammazero, @honghaoq | Draft | -| [0039](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0039.md) | Filecoin Message Replay Protection | FIP | @q9f | Draft | -| [0040](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0040.md) | Boost - Filecoin Storage Deals Market Protocol | FRC | @dirkmc, @nonsense, @jacobheun, @brendalee | Draft | -| [0041](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0041.md) | Forward Compatibility for PreCommit and ReplicaUpdate | FIP | @Kubuxu | Final | -| [0042](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0042.md) | Calling Convention for Hashed Method Name | FRC | @Kubuxu, @anorth | Draft | -| [0044](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0044.md) | Standard Authentication Method for Actors | FIP | @arajasek, @anorth | Final | -| [0045](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0045.md) | De-couple verified registry from markets | FIP | @anorth, @zenground0 | Final | -| [0046](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0046.md) | Fungible token standard | FRC | @anorth, @jsuresh, @alexytsu | Draft | -| [0047](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0047.md) | Proof Expiration & PoRep Security Policy | FIP | @Kubuxu, @irenegia, @anorth | Superseded | -| [0048](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0048.md) | f4 Address Class | FIP | @stebalien, @mriise, @raulk | Final | -| [0049](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0049.md) | Actor Events | FIP | @stebalien, @raulk | Final | -| [0050](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0050.md) | API Between User-Programmed Actors and Built-In Actors | FIP | @anorth, @arajasek | Final | -| [0051](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0051.md) | Synchronous Consistent Block Broadcast for EC Security | FRC | Guy Goren , Alfonso de la Rocha | Draft | -| [0052](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0052.md) | Increase max sector commitment to 3.5 years | FIP | @anorth | Final | -| [0053](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0053.md) | Non-Fungible Token Standard | FRC | @alexytsu, @abright, @anorth | Draft | -| [0054](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0054.md) | Filecoin EVM Runtime (FEVM) | FIP | @raulk, @stebalien | Final | -| [0055](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0055.md) | Supporting Ethereum Accounts, Addresses, and Transactions | FIP | @raulk, @stebalien | Final | -| [0056](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0056.md) | Sector Duration Multiplier | FIP | @AxCortesCubero, @jbenet, @misilva73, @momack2, @tmellan, @vkalghatgi, @zixuanzh | Rejected | -| [0057](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0057.md) | Update Gas Charging Schedule and System Limits for FEVM | FIP | @raulk, @stebalien, @aakoshh, @kubuxu| Final | -| [0058](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0058.md) | Verifiable Data Aggregation | FRC | Jakub Sztandera (@Kubuxu), Nicola Greco (@nicola), Peter Rabbitson (@ribasushi)| Draft | -| [0059](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0059.md) | Synthetic PoRep | FIP | @Kubuxu @Luca @Rosario Gennaro @Nicola @Irene| Final | -| [0060](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0060.md) | Set market deal maintenance interval to 30 days | FIP | Jakub Sztandera (@Kubuxu), @Zenground0, Alex North (@anorth)| Final | -| [0061](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0061.md) | WindowPoSt Grindability Fix | FIP | @cryptonemo @Kubuxu @DrPeterVanNostrand @Nicola @porcuquine @vmx @arajasek| Final | -| [0062](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0062.md) | Fallback Method Handler for the Multisig Actor | FIP | Dimitris Vyzovitis (@vyzo), Raúl Kripalani (@raulk)| Final | -| [0063](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0063.md) | Switching to new Drand mainnet network | FIP | @yiannisbot, @CluEleSsUK, @AnomalRoil, @nikkolasg, @willscott | Final | -| [0065](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0065.md) | Ignore built-in market locked balance in circulating supply calculation | FIP | @anorth | Accepted | -| [0066](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0066.md) | Piece Retrieval Gateway | FRC | @willscott, @dirkmc | Draft | -| [0067](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0067.md) | PoRep Security Policy & Replacement Sealing Enforcement | FIP | @Kubuxu, @anorth, @irenegia, @lucaniz | Accepted | -| [0068](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0068.md) | Deal-Making Between SPs and FVM Smart Contracts | FRC | @aashidham, @raulk, @skottie86, @jennijuju, @nonsense, @shrenujbansal | Draft | -| [0069](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0069.md) | Piece Multihash and v2 Piece CID | FRC | @aschmahmann, @ribasushi | Draft | -| [0070](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0070.md) | Allow SPs to move partitions between deadlines | FIP | Steven Li (@steven004), Alan Xu (@zhiqiangxu), Mike Li (@hunjixin), Alex North (@anorth), Nicola (@nicola)| Rejected | -| [0071](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0071.md) | Deterministic State Access (IPLD Reachability) | FIP | @stebalien| Final | -| [0072](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0072.md) | Improved event syscall API | FIP | @fridrik01, @Stebalien | Final | -| [0073](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0073.md) | Remove beneficiary from the self_destruct syscall | FIP | @Stebalien | Final | -| [0074](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0074.md) | Remove cron-based automatic deal settlement | FIP | @anorth, @alexytsu| Final | -| [0075](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0075.md) | Improvements to the FVM randomness syscalls | FIP | @arajasek, @Stebalien | Final | -| [0076](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0076.md) | Direct data onboarding | FIP | @anorth, @zenground0 | Final | -| [0077](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0077.md) | Add Cost Opportunity For New Miner Creation | FIP | Zac (@remakeZK), Mike Li (@hunjixin)| Draft | -| [0078](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0078.md) | Remove Restrictions on the Minting of Datacap | FIP | Fatman13 (@Fatman13), flyworker (@flyworker), stuberman (@stuberman), Eliovp (@Eliovp), dcasem (@dcasem), and The-Wayvy (@The-Wayvy)| Draft | -| [0079](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0079.md) | Add BLS Aggregate Signatures to FVM | FIP | Jake (@drpetervannostrand) | Accepted | -| [0080](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0080.md) | Phasing Out Fil+ and Restoring Deal Quality Multiplier to 1x | FIP | @Fatman13, @ArthurWang1255, @stuberman, @Eliovp, @dcasem, @The-Wayvy | Draft | -| [0081](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0081.md) | Introduce lower bound for sector initial pledge | FIP | @anorth, @vkalghatgi | Draft | -| [0082](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0082.md) | Add support for aggregated replica update proofs | FIP | nemo (@cryptonemo), Jake (@drpetervannostrand), @anorth | Accepted | -| [0083](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0083.md) | Add built-in Actor events in the Verified Registry, Miner and Market Actors | FIP | Aarsh (@aarshkshah1992)| Final | -| [0084](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0084.md) | Remove Storage Miner Actor Method `ProveCommitSectors` | FIP | Jennifer Wang (@jennijuju)| Accepted | -| [0085](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0085.md) | Convert f090 Mining Reserve actor to a keyless account actor | FIP | Jennifer Wang (@jennijuju), Jon Victor (@jnthnvctr)| Accepted | -| [0086](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0086.md) | Fast Finality in Filecoin (F3) | FIP | @stebalien, @masih, @mb1896, @hmoniz, @anorth, @matejpavlovic, @arajasek, @ranchalp, @jsoares, @Kubuxu, @vukolic, @jennijuju | Draft | -| [0087](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0087.md) | FVM-Enabled Deal Aggregation | FRC | @aashidham, @honghao, @raulk, @nonsense | Draft | -| [0089](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0089.md) | A Finality Calculator for Filecoin | FRC | @guy-goren, @jsoares | Draft | -| [0090](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0090.md) | Non-Interactive PoRep | FIP | luca (@lucaniz), kuba (@Kubuxu), nicola (@nicola), nemo (@cryptonemo), volker (@vmx), irene (@irenegia) | Accepted | -| [0091](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0091.md) | Add support for Homestead and EIP-155 Ethereum Transactions ("legacy" Ethereum Transactions) | FIP | Aarsh (@aarshkshah1992)| Accepted | -| [0092](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0092.md) | Non-Interactive PoRep | FIP | luca (@lucaniz), kuba (@Kubuxu), nicola (@nicola), nemo (@cryptonemo), volker (@vmx), irene (@irenegia), Alex North (@anorth), orjan (@Phi-rjan) | Last Call | +| FIP # | Title | Type | Author | Status | +|-------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|------|--------------------------------------------------------------------------------------------------------------------------------------------------|------------| +| [0001](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0001.md) | FIP Purpose and Guidelines | FIP | @Whyrusleeping | Active | +| [0002](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0002.md) | Free Faults on Newly Faulted Sectors of a Missed WindowPoSt | FIP | @anorth, @davidad, @miyazono, @irenegia, @lucaniz, @nicola, @zixuanzh | Final | +| [0003](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0003.md) | Filecoin Plus Principles | FIP | @feerst, @jbenet, @jnthnvctr, @tim-murmuration, @mzargham, @zixuanzh | Active | +| [0004](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0004.md) | Liquidity Improvement for Storage Miners | FIP | @davidad, @jbenet, @zenground0, @zixuanzh, @danlessa | Final | +| [0005](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0005.md) | Remove ineffective reward vesting | FIP | @anorth, @Zenground | Final | +| [0006](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0006.md) | No repay debt requirement for DeclareFaultsRecovered | FIP | @nicola, @irenegia | Deferred | +| [0007](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0007.md) | h/amt-v3 | FIP | @rvagg, @Stebalien, @anorth, @Zenground0 | Final | +| [0008](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0008.md) | Add miner batched sector pre-commit method | FIP | @anorth, @ZenGround0, @nicola | Final | +| [0009](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0009.md) | Exempt Window PoSts from BaseFee burn | FIP | @Stebalien, @momack2, @magik6k, @zixuanzh | Final | +| [0010](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0010.md) | Off-Chain Window PoSt Verification | FIP | @Stebalien, @anorth | Final | +| [0011](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0011.md) | Remove reward auction from reporting consensus faults | FIP | @Kubuxu | Final | +| [0012](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0012.md) | DataCap Top up for FIL+ Client Addresses | FIP | @dshoy, @jnthnvctr, @zx | Final | +| [0013](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0013.md) | Add ProveCommitSectorAggregated method to reduce on-chain congestion | FIP | @ninitrava @nicola | Final | +| [0014](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0014.md) | Allow V1 proof sectors to be extended up to a maximum of 540 days | FIP | @deltazxm, @neogeweb3 | Final | +| [0015](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0015.md) | Revert FIP-0009(Exempt Window PoSts from BaseFee burn) | FIP | @jennijuju, @arajasek | Final | +| [0016](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0016.md) | Pack arbitrary data in CC sectors | FIP | donghengzhao (@1475) | Deferred | +| [0017](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0017.md) | Three-messages lightweight sector updates | FIP | @nicole, @lucaniz, @irenegia | Deferred | +| [0018](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0018.md) | New miner terminology proposal | FIP | @Stefaan-V | Final | +| [0019](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) | Snap Deals | FIP | @Kubuxu, @lucaniz, @nicola, @rosariogennaro, @irenegia | Final | +| [0020](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0020.md) | Add return value to WithdrawBalance | FIP | @Stefaan-V | Final | +| [0021](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0021.md) | Correct quality calculation on expiration | FIP | @Steven004, @Zenground0 | Final | +| [0022](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0022.md) | Bad deals don't fail PublishStorageDeals | FIP | @Zenground0 | Final | +| [0023](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0023.md) | Break ties between tipsets of equal weights | FIP | @sa8, @arajasek | Final | +| [0024](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0024.md) | BatchBalancer & BatchDiscount Post -Hyperdrive adjustment | FIP | @zx, @jbenet, @zenground0, @momack2 | Final | +| [0025](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0025.md) | Handle expired deals in ProveCommit | FIP | @ZenGround0 | Deferred | +| [0026](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0026.md) | Extend sector fault cutoff period from 2 weeks to 6 weeks | FIP | @IPFSUnion | Final | +| [0027](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0027.md) | Change type of DealProposal Label field from a (Golang) String to a Union | FIP | @laudiacay, @Stebalien, @arajasek | Final | +| [0028](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0028.md) | Remove DataCap and verified client status from client address | FIP | @jennijuju, @dkkapur | Final | +| [0029](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0029.md) | Beneficiary address for storage providers | FIP | @steven004 | Final | +| [0030](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0030.md) | Introducing the Filecoin Virtual Machine (FVM) | FIP | @raulk, @stebalien | Final | +| [0031](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0031.md) | Atomic switch to non-programmable FVM | FIP | @raulk, @stebalien | Final | +| [0032](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0032.md) | Gas model adjustment for non-programmable FVM | FIP | @raulk, @stebalien | Final | +| [0033](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0033.md) | Explicit premium for FIL+ verified deals | FIP | @anorth | Deferred | +| [0034](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0034.md) | Fix pre-commit deposit independent of sector content | FIP | @anorth, @Kubuxu | Final | +| [0035](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0035.md) | Support actors as built-in storage market clients | FIP | @anorth | Withdrawn | +| [0036](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0036.md) | Introducing a Sector Duration Multiple for Longer Term Sector Commitment | FIP | @AxCortesCubero, @jbenet, @misilva73, @momack2, @tmellan, @vkalghatgi, @zixuanzh | Rejected | +| [0037](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0037.md) | Gas model adjustment for user programmability | FIP | @raulk, @stebalien | Draft | +| [0038](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0038.md) | Indexer Protocol for Filecoin Content Discovery | FRC | @willscott, @gammazero, @honghaoq | Draft | +| [0039](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0039.md) | Filecoin Message Replay Protection | FIP | @q9f | Draft | +| [0040](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0040.md) | Boost - Filecoin Storage Deals Market Protocol | FRC | @dirkmc, @nonsense, @jacobheun, @brendalee | Draft | +| [0041](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0041.md) | Forward Compatibility for PreCommit and ReplicaUpdate | FIP | @Kubuxu | Final | +| [0042](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0042.md) | Calling Convention for Hashed Method Name | FRC | @Kubuxu, @anorth | Draft | +| [0044](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0044.md) | Standard Authentication Method for Actors | FIP | @arajasek, @anorth | Final | +| [0045](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0045.md) | De-couple verified registry from markets | FIP | @anorth, @zenground0 | Final | +| [0046](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0046.md) | Fungible token standard | FRC | @anorth, @jsuresh, @alexytsu | Draft | +| [0047](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0047.md) | Proof Expiration & PoRep Security Policy | FIP | @Kubuxu, @irenegia, @anorth | Superseded | +| [0048](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0048.md) | f4 Address Class | FIP | @stebalien, @mriise, @raulk | Final | +| [0049](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0049.md) | Actor Events | FIP | @stebalien, @raulk | Final | +| [0050](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0050.md) | API Between User-Programmed Actors and Built-In Actors | FIP | @anorth, @arajasek | Final | +| [0051](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0051.md) | Synchronous Consistent Block Broadcast for EC Security | FRC | Guy Goren , Alfonso de la Rocha | Draft | +| [0052](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0052.md) | Increase max sector commitment to 3.5 years | FIP | @anorth | Final | +| [0053](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0053.md) | Non-Fungible Token Standard | FRC | @alexytsu, @abright, @anorth | Draft | +| [0054](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0054.md) | Filecoin EVM Runtime (FEVM) | FIP | @raulk, @stebalien | Final | +| [0055](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0055.md) | Supporting Ethereum Accounts, Addresses, and Transactions | FIP | @raulk, @stebalien | Final | +| [0056](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0056.md) | Sector Duration Multiplier | FIP | @AxCortesCubero, @jbenet, @misilva73, @momack2, @tmellan, @vkalghatgi, @zixuanzh | Rejected | +| [0057](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0057.md) | Update Gas Charging Schedule and System Limits for FEVM | FIP | @raulk, @stebalien, @aakoshh, @kubuxu | Final | +| [0058](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0058.md) | Verifiable Data Aggregation | FRC | Jakub Sztandera (@Kubuxu), Nicola Greco (@nicola), Peter Rabbitson (@ribasushi) | Draft | +| [0059](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0059.md) | Synthetic PoRep | FIP | @Kubuxu @Luca @Rosario Gennaro @Nicola @Irene | Final | +| [0060](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0060.md) | Set market deal maintenance interval to 30 days | FIP | Jakub Sztandera (@Kubuxu), @Zenground0, Alex North (@anorth) | Final | +| [0061](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0061.md) | WindowPoSt Grindability Fix | FIP | @cryptonemo @Kubuxu @DrPeterVanNostrand @Nicola @porcuquine @vmx @arajasek | Final | +| [0062](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0062.md) | Fallback Method Handler for the Multisig Actor | FIP | Dimitris Vyzovitis (@vyzo), Raúl Kripalani (@raulk) | Final | +| [0063](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0063.md) | Switching to new Drand mainnet network | FIP | @yiannisbot, @CluEleSsUK, @AnomalRoil, @nikkolasg, @willscott | Final | +| [0065](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0065.md) | Ignore built-in market locked balance in circulating supply calculation | FIP | @anorth | Accepted | +| [0066](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0066.md) | Piece Retrieval Gateway | FRC | @willscott, @dirkmc | Draft | +| [0067](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0067.md) | PoRep Security Policy & Replacement Sealing Enforcement | FIP | @Kubuxu, @anorth, @irenegia, @lucaniz | Accepted | +| [0068](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0068.md) | Deal-Making Between SPs and FVM Smart Contracts | FRC | @aashidham, @raulk, @skottie86, @jennijuju, @nonsense, @shrenujbansal | Draft | +| [0069](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0069.md) | Piece Multihash and v2 Piece CID | FRC | @aschmahmann, @ribasushi | Draft | +| [0070](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0070.md) | Allow SPs to move partitions between deadlines | FIP | Steven Li (@steven004), Alan Xu (@zhiqiangxu), Mike Li (@hunjixin), Alex North (@anorth), Nicola (@nicola) | Rejected | +| [0071](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0071.md) | Deterministic State Access (IPLD Reachability) | FIP | @stebalien | Final | +| [0072](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0072.md) | Improved event syscall API | FIP | @fridrik01, @Stebalien | Final | +| [0073](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0073.md) | Remove beneficiary from the self_destruct syscall | FIP | @Stebalien | Final | +| [0074](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0074.md) | Remove cron-based automatic deal settlement | FIP | @anorth, @alexytsu | Final | +| [0075](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0075.md) | Improvements to the FVM randomness syscalls | FIP | @arajasek, @Stebalien | Final | +| [0076](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0076.md) | Direct data onboarding | FIP | @anorth, @zenground0 | Final | +| [0077](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0077.md) | Add Cost Opportunity For New Miner Creation | FIP | Zac (@remakeZK), Mike Li (@hunjixin) | Draft | +| [0078](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0078.md) | Remove Restrictions on the Minting of Datacap | FIP | Fatman13 (@Fatman13), flyworker (@flyworker), stuberman (@stuberman), Eliovp (@Eliovp), dcasem (@dcasem), and The-Wayvy (@The-Wayvy) | Draft | +| [0079](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0079.md) | Add BLS Aggregate Signatures to FVM | FIP | Jake (@drpetervannostrand) | Accepted | +| [0080](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0080.md) | Phasing Out Fil+ and Restoring Deal Quality Multiplier to 1x | FIP | @Fatman13, @ArthurWang1255, @stuberman, @Eliovp, @dcasem, @The-Wayvy | Draft | +| [0081](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0081.md) | Introduce lower bound for sector initial pledge | FIP | @anorth, @vkalghatgi | Draft | +| [0082](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0082.md) | Add support for aggregated replica update proofs | FIP | nemo (@cryptonemo), Jake (@drpetervannostrand), @anorth | Accepted | +| [0083](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0083.md) | Add built-in Actor events in the Verified Registry, Miner and Market Actors | FIP | Aarsh (@aarshkshah1992) | Final | +| [0084](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0084.md) | Remove Storage Miner Actor Method `ProveCommitSectors` | FIP | Jennifer Wang (@jennijuju) | Accepted | +| [0085](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0085.md) | Convert f090 Mining Reserve actor to a keyless account actor | FIP | Jennifer Wang (@jennijuju), Jon Victor (@jnthnvctr) | Accepted | +| [0086](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0086.md) | Fast Finality in Filecoin (F3) | FIP | @stebalien, @masih, @mb1896, @hmoniz, @anorth, @matejpavlovic, @arajasek, @ranchalp, @jsoares, @Kubuxu, @vukolic, @jennijuju | Draft | +| [0087](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0087.md) | FVM-Enabled Deal Aggregation | FRC | @aashidham, @honghao, @raulk, @nonsense | Draft | +| [0089](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0089.md) | A Finality Calculator for Filecoin | FRC | @guy-goren, @jsoares | Draft | +| [0090](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0090.md) | Non-Interactive PoRep | FIP | luca (@lucaniz), kuba (@Kubuxu), nicola (@nicola), nemo (@cryptonemo), volker (@vmx), irene (@irenegia) | Accepted | +| [0091](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0091.md) | Add support for Homestead and EIP-155 Ethereum Transactions ("legacy" Ethereum Transactions) | FIP | Aarsh (@aarshkshah1992) | Accepted | +| [0092](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0092.md) | Non-Interactive PoRep | FIP | luca (@lucaniz), kuba (@Kubuxu), nicola (@nicola), nemo (@cryptonemo), volker (@vmx), irene (@irenegia), Alex North (@anorth), orjan (@Phi-rjan) | Last Call | +| To be assigned | Common Node API | FIP | David Ansermino (@ansermino), Aatif Syed (@aatifsyed) | Draft | \ No newline at end of file From dac055205c9c44dcdb968981b2d62fc1e01738c7 Mon Sep 17 00:00:00 2001 From: Aatif Syed <38045910+aatifsyed@users.noreply.github.com> Date: Fri, 5 Jul 2024 02:46:14 +0100 Subject: [PATCH 3/7] feat: specify subscriptions as a series of OpenRPC fragments (#2) * mark: aatifsyed/common-node-api * feat: describe subscriptions as a bunch of OpenRPC fragments * fix: link to lotus issue --- FIPS/fip-common_node_api.md | 115 +++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 29 deletions(-) diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md index 55791cb9..31c62239 100644 --- a/FIPS/fip-common_node_api.md +++ b/FIPS/fip-common_node_api.md @@ -33,12 +33,14 @@ The JSON-RPC interface provided by Filecoin node implementations is the primary Ultimately the [Lotus RPC API](https://github.com/filecoin-project/lotus/blob/b73d4e0481517b395a0e9aa9af5dab8bedc18285/documentation/en/api-v1-unstable-methods.md#mpoolpushmessage) is the defacto specification currently, which includes 280+ methods. Based on our exploration and discussions with the Lotus team we have established that some methods provide duplicated functionality (eg. `ChainGetGenesis()` is equivalent to`ChainGetTipSetByHeight(0)`). Another subset of methods are related to implementation-specific internals (eg. `ChainHotGC`). And yet another subset are for the purpose of configuring the instance, which could be exposed through other means (eg. CLI, config file) depending on the design principles of a node implementation. This leads us to conclude that the canonical RPC interface should only include a subset of the methods currently supported by Lotus. -The defacto Lotus specification is lacking in several features: complete JSON schemas, descriptions for each method, and reliable consistency with the implementation. This motivates us to propose a normative OpenRPC schema for the purpose of defining this interface in a machine readable format. This format in turn enables: +The defacto Lotus specification is lacking in several features: complete JSON schemas, descriptions for each method, and reliable consistency with the implementation[^1]. This motivates us to propose a normative OpenRPC schema for the purpose of defining this interface in a machine readable format. This format in turn enables: 1. Compliance checks - enable implementations of the interface to verify the syntax 2. Specificity - it provides a language agnostic format for defining the ABI of the methods in the interface 3. Discoverability - allow consumers to dynamically interact with providers 4. Lack of desire to reinvent the wheel - It's not perfect, but it works... +[^1]: https://github.com/filecoin-project/lotus/issues/12164 + Additionally, by establishing a specification we seek to establish a greater responsibility on implementers and encourage more discourse for future iterations and further interfaces. The present API shows signs of rapid iteration and the resulting technical debt. ## Specification @@ -53,37 +55,93 @@ Categories have been assigned to indicate the identified use case (see Design Ra Node implementers must include all specified methods in their API without any modifications. Implementers may choose to provide additional methods beyond what is included in this specification. The endpoint used to serve RPC requests must be versioned acccording the majo ## Subscription methods -The `ChainNotify` method is not a simple request/response, but rather a bidirectional exchange of JSON-RPC-like messages as follows: - -1. Caller sends a JSON-RPC request to the endpoint, with no parameters. - ```json - { "jsonrpc": "2.0", "id": 1, "method": "Filecoin.ChainNotify" } - ``` -2. Callee sends a JSON-RPC response with an integer Channel ID - ```json - { "jsonrpc": "2.0", "id": 1, "result": 2} - ``` -3. Callee sends JSON-RPC notifications, with a pair of positional parameters. The first is the Channel ID, the second is the actual payload - ```json - { "jsonrpc": "2.0", "method": "xrpc.ch.val", params: [2, {}] } - ``` -4. Caller sends a JSON-RPC request to cancel the subscription, with their Channel ID - ```json - { "jsonrpc": "2.0", "id": 1, "method": "xrpc.cancel", params: [2] } - ``` -5. Callee responds with a JSON-RPC notification of cancellation - ```json - { "jsonrpc": "2.0", "id": 1, "method": "xrpc.ch.close", params: [2] } - ``` - +Certain methods like `ChainNotify` are not oneshot request/response exchanges, +but bidirectional method calls and [notifications](https://www.jsonrpc.org/specification#notification). + +We intend to provide schemas for these exchanges as an [OpenRPC extension](https://spec.open-rpc.org/#specification-extensions) in a future iteration of this FIP. +The following is an outline of the protocol for subscriptions as a set of +[Method Object](https://spec.open-rpc.org/#method-object) fragments. +Both the `User` and the `Node` act as JSON-RPC [Client and Server](https://www.jsonrpc.org/specification#conventions) +simulataneously, with transport-level correlation agreed out-of-band. + +1. Initial subscription (bidirectional JSON-RPC method call). + `User` acts as a JSON-RPC Client, and `Node` as a JSON-RPC Server. + ```json + { + "name": "", + "params": [ + /* */ + ], + "paramStructure": "by-position", + "result": { + "name": "channelID", + "required": true, + "schema": { + "type": "int" + } + } + } + ``` + `subscriptionMethod` and `subscriptionParams` will vary by method. +2. Subscription item delivery (JSON-RPC notification). + `User` acts as a JSON-RPC Server, and `Node` as a JSON-RPC Client. + ```json + { + "name": "xrpc.ch.val", + "params": [ + { + "name": "channelID", + "required": true, + "schema": { "type": "int" } + }, + { + "name": "channelContent", + "required": true, + "schema": { "$ref": "" } + } + ], + "paramStructure": "by-position" + } + ``` + `notificationSchema>` will vary by method. +3. Initiate subscription cancellation (JSON-RPC notification). + `User` acts as a JSON-RPC Client, and `Node` as a JSON-RPC Server. + ```json + { + "name": "xrpc.cancel", + "params": [ + { + "name": "channelID", + "required": true, + "schema": { "type": "int" } + } + ], + "paramStructure": "by-position" + } + ``` +4. Complete subscription cancellation (JSON-RPC notification). + `User` acts as a JSON-RPC Server, and `Node` as a JSON-RPC Client. + ```json + { + "name": "xrpc.ch.close", + "params": [ + { + "name": "channelID", + "required": true, + "schema": { "type": "int" } + } + ], + "paramStructure": "by-position" + } + ``` ## Methods > Current list here (TBC): https://docs.google.com/spreadsheets/d/1fFkQuEjvFAd2s1dGX5zGmhxsEMLMUZ4uQFnIXgSZA5w/edit?usp=drivesdk -| Method | Tag | Description | -|---|---|---| -|MethodName|Tags | Description of method| +| Method | Tag | Description | +| ---------- | ---- | --------------------- | +| MethodName | Tags | Description of method | @@ -179,7 +237,6 @@ A better API, one that is well defined and carefully constructed, will ease the - [ ] Change link to be an issue for the inconsistency - [ ] Add a note on URIs (eg. `/rpc/v1`) - [ ] Publish two versions of the document, one per URI -- [ ] Describe ChainNotify in OpenRPC - [ ] Make ChainNotify definition more generic - [ ] Add link to playground - [ ] @ansermino look into contentdescriptors @@ -191,4 +248,4 @@ A better API, one that is well defined and carefully constructed, will ease the - [ ] Add examples to all methods in spec ## Copyright -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). \ No newline at end of file +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 88f04f87bdf369c2b95db4ca5d31e2fbf243e1eb Mon Sep 17 00:00:00 2001 From: David Ansermino <14164624+ansermino@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:47:25 -0400 Subject: [PATCH 4/7] Add list of methods, update todos --- FIPS/fip-common_node_api.md | 115 +++++++++++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 9 deletions(-) diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md index 31c62239..63594a2b 100644 --- a/FIPS/fip-common_node_api.md +++ b/FIPS/fip-common_node_api.md @@ -137,11 +137,109 @@ simulataneously, with transport-level correlation agreed out-of-band. ## Methods -> Current list here (TBC): https://docs.google.com/spreadsheets/d/1fFkQuEjvFAd2s1dGX5zGmhxsEMLMUZ4uQFnIXgSZA5w/edit?usp=drivesdk - -| Method | Tag | Description | -| ---------- | ---- | --------------------- | -| MethodName | Tags | Description of method | +> Working document: https://docs.google.com/spreadsheets/d/1fFkQuEjvFAd2s1dGX5zGmhxsEMLMUZ4uQFnIXgSZA5w/edit?usp=drivesdk + + +| Method | Category | Description | +| ----------------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ChainGetBlock | State query | Returns the block with the specified CID | +| ChainGetEvents | State query | Returns the events under an event AMT root CID | +| ChainGetMessage | State query | Returns the message with the specified CID | +| ChainGetParentMessages | State query | Returns the messages included in the blocks of the parent tipset | +| ChainGetPath | State query | Returns the path between the specified tipsets | +| ChainGetTipSet | State query | Returns the tipset with the specified CID | +| ChainGetTipSetAfterHeight | State query | Looks back for a tipset at the specified epoch. If there are no blocks at the specified epoch, the first non-nil tipset at a later epoch will be returned. A fork can be specified, or null for the heaviest chain | +| ChainGetTipSetByHeight | State query | Returns the tipset at the specified height | +| ChainHasObj | State query | checks if a given CID exists in the chain blockstore | +| ChainHead | State query | Returns the chain head (ie. the heaviest tipset) | +| ChainNotify | State query | Subscribe to changes to the chain head | +| ChainPutObj | | Puts a given object into the block store | +| ChainReadObj | State query | Reads IPLD nodes referenced by the specified CID from chain blockstore and returns raw bytes. | +| ChainTipSetWeight | State query | Returns the weight of the specified tipset | +| GasEstimateFeeCap | Transactions | Returns the estimated fee cap for the given parameters | +| GasEstimateGasLimit | Transactions | Returns the estimated gas limit for the given parameters | +| GasEstimateGasPremium | Transactions | Returns the estimated gas premium for the given parameters | +| GasEstimateMessageGas | Transactions | Returns the estimated gas for the given parameters | +| GetActorEventsRaw | State query | Returns all user-programmed and built-in actor events that match the given filter. This is a request/response API. Results available from this API may be limited by the MaxFilterResults and MaxFilterHeightRange configuration options and also the amount of historical data available in the node. | +| MinerCreateBlock | Miner operations | Fill and sign a block template on behalf of the given miner, returning a suitable block header | +| MinerGetBaseInfo | Miner operations | Looks up the Miner Actor at the given address (and tipset), returning basic information like their power, eligibility to mine etc | +| MpoolBatchPush | Transactions | Adds a set of signed messages to the message pool | +| MpoolBatchPushUntrusted | Transactions | Adds a set of messages to the message pool with additional verification checks | +| MpoolGetNonce | Transactions | Returns the current nonce for the specified address | +| MpoolPending | Transactions | Returns the pending messages for a given tipset | +| MpoolPush | Transactions | Adds a signed message into the message pool | +| MpoolPushMessage | Miner Operations | Assigns a nonce, signs, and pushes a message to the mempool | +| MpoolPushUntrusted | Transactions | Adds a message to the message pool with verification checks | +| MpoolSelect | Transactions | returns a list of pending messages for inclusion in the next block | +| NetAddrsListen | Node operation | Return list of listening addresses and peer ID | +| NetAgentVersion | | Returns agent version string | +| NetConnect | Node operation | Connect to a specified peer | +| NetDisconnect | Node operation | Disconnect from the specified peer | +| NetFindPeer | State query | Returns dialable addresses for the specified peer | +| NetPeers | Node operation | Return list of currently connected peers | +| NetProtectAdd | Node operation | | +| NetProtectList | Node operation | | +| NetProtectRemove | Node operation | | +| StateAccountKey | State query | Returns the public key address of the given ID address for secp and bls accounts | +| StateCall | State query | Runs the given message and returns its result without any persisted changes. StateCall applies the message to the tipset's parent state. The message is not applied on-top-of the messages in the passed-in tipset. | +| StateCirculatingSupply | State query | Returns the exact circulating supply of Filecoin at the given tipset. | +| StateDealProviderCollateralBounds | State query | Returns the min and max collateral a storage provider can issue. It takes the deal size and verified status as parameters. | +| StateGetActor | State query | Returns the specified actor's nonce and balance. | +| StateGetAllAllocations | State query | returns the all the allocations available in verified registry actor | +| StateGetAllClaims | State query | returns the all the claims available in verified registry actor | +| StateGetAllocation | State query | Returns the allocation for a given address and allocation ID. | +| StateGetAllocationForPendingDeal | State query | Returns the allocation for the specified pending deal. Returns nil if pending allocation is not found. | +| StateGetAllocationIdForPendingDeal | State query | Identical to StateGetAllocationForPendingDeal except it returns the allocation ID | +| StateGetAllocations | | returns the all the allocations for a given client | +| StateGetBeaconEntry | State query | Returns the claim for a given address and claim ID | +| StateGetClaim | State query | Returns the claim for a given address and claim ID | +| StateGetClaims | State query | returns the all the claims for a given provider | +| StateGetNetworkParams | State query | Returns current network params | +| StateGetRandomnessDigestFromBeacon | State query | samples the beacon for randomness | +| StateGetRandomnessDigestFromTickets | State query | sample the chain for randomness | +| StateGetRandomnessFromBeacon | State query | Returns the beacon entry for the given filecoin epoch. If the entry has not yet been produced, the call will block until the entry becomes available | +| StateGetRandomnessFromTickets | State query | sample the chain for randomness | +| StateListActors | State query | returns the addresses of every actor in the state | +| StateListMessages | State query | looks back and returns all messages with a matching to or from address, stopping at the given height. | +| StateListMiners | State query | Returns the addresses of every miner that has claimed power in the Power Actor | +| StateLookupID | State query | retrieves the ID address of the given address | +| StateLookupRobustAddress | State query | Returns the public key address of the given ID address for non-account addresses (multisig, miners etc) | +| StateMarketBalance | State query | looks up the Escrow and Locked balances of the given address in the Storage Market | +| StateMarketDeals | State query | returns information about every deal in the Storage Market | +| StateMarketParticipants | State query | returns the Escrow and Locked balances of every participant in the Storage Market | +| StateMarketStorageDeal | State query | returns information about the specified deal | +| StateMinerActiveSectors | State query | Returns info about sectors that a given miner is actively proving | +| StateMinerAllocated | State query | Returns info about sectors that a given miner is actively proving | +| StateMinerAvailableBalance | State query | Returns the portion of a miner's balance that can be withdrawn or spent | +| StateMinerDeadlines | State query | Returns all the proving deadlines for the given miner | +| StateMinerFaults | State query | Returns a bitfield indicating the faulty sectors of the given miner | +| StateMinerInfo | State query | returns info about the specified miner | +| StateMinerInitialPledgeCollateral | State query | returns the initial pledge collateral for the specified miner's sector | +| StateMinerPartitions | State query | returns all partitions in the specified deadline | +| StateMinerPower | State query | returns the power of the indicated miner | +| StateMinerPreCommitDepositForPower | State query | | +| StateMinerProvingDeadline | State query | calculates the deadline at some epoch for a proving period and returns the deadline-related calculations. | +| StateMinerRecoveries | State query | returns a bitfield indicating the recovering sectors of the given miner | +| StateMinerSectorAllocated | State query | checks if a sector number is marked as allocated | +| StateMinerSectorCount | State query | returns the number of sectors in a miner's sector set and proving set | +| StateMinerSectors | State query | returns info about the given miner's sectors. If the filter bitfield is nil, all sectors are included | +| StateReadState | State query | Returns the indicated actor's state | +| StateReplay | State query | [https://github.com/filecoin-project/lotus/blob/286fadaca4d2af81bedf4213daebfbbdbcd5e337/api/api_full.go#L356-L373](https://github.com/filecoin-project/lotus/blob/286fadaca4d2af81bedf4213daebfbbdbcd5e337/api/api_full.go#L356-L373) | +| StateSearchMsg | State query | [https://github.com/filecoin-project/lotus/blob/286fadaca4d2af81bedf4213daebfbbdbcd5e337/api/api_full.go#L431-L447](https://github.com/filecoin-project/lotus/blob/286fadaca4d2af81bedf4213daebfbbdbcd5e337/api/api_full.go#L431-L447) | +| StateSectorExpiration | State query | Returns the epoch at which given sector will expire | +| StateSectorGetInfo | State query | Returns the on-chain info for the specified miner's sector. Returns null in case the sector info isn't found. NOTE: returned info.Expiration may not be accurate in some cases, use StateSectorExpiration to get accurate expiration epoch. | +| StateSectorPartition | State query | Finds deadline/partition with the specified sector | +| StateSectorPreCommitInfo | State query | Returns the PreCommit info for the specified miner's sector. Returns null and no error if the sector isn't precommitted. Note that the sector number may be allocated while PreCommitInfo is nil. This means that either allocated sector numbers were compacted, and the sector number was marked as allocated in order to reduce size of the allocated sectors bitfield, or that the sector was precommitted, but the precommit has expired. | +| StateVerifiedClientStatus | State query | Returns the data cap for the given address. Returns nil if there is no entry in the data cap table for the address. | +| StateVerifiedRegistryRootKey | State query | returns the address of the Verified Registry's root key | +| StateVerifierStatus | State query | Returns the data cap for the given address. Returns nil if there is no entry in the data cap table for the address. | +| StateVMCirculatingSupplyInternal | State query | returns an approximation of the circulating supply of Filecoin at the given tipset. This is the value reported by the runtime interface to actors code. | +| StateWaitMsg | State query | [https://github.com/filecoin-project/lotus/blob/286fadaca4d2af81bedf4213daebfbbdbcd5e337/api/api_full.go#L448-L466](https://github.com/filecoin-project/lotus/blob/286fadaca4d2af81bedf4213daebfbbdbcd5e337/api/api_full.go#L448-L466) | +| WalletBalance | Miner operations | Returns balance of a wallet | +| WalletHas | Miner operations | indicates whether the given address is in the wallet | +| WalletList | Miner operations | Returns a list of all the addresses in the wallet. | +| WalletSign | Miner operations | signs the given bytes using the given address | +| WalletSignMessage | Miner operations | signs the given message using the given address. | @@ -232,16 +330,15 @@ A better API, one that is well defined and carefully constructed, will ease the ## TODO -- [ ] Confirm methods that are included +- [x] Confirm methods that are included - [ ] Improve descriptions for included methods - [ ] Change link to be an issue for the inconsistency - [ ] Add a note on URIs (eg. `/rpc/v1`) - [ ] Publish two versions of the document, one per URI -- [ ] Make ChainNotify definition more generic +- [x] Make ChainNotify definition more generic - [ ] Add link to playground -- [ ] @ansermino look into contentdescriptors - [ ] Perform proper spellcheck -- [ ] Review https://github.com/filecoin- +- [ ] Determine if this should be FIP or FRC - [ ] Setup discussion forum and add to header - [ ] Reach out to Venus to establish the state of their RPC - [ ] Transfer spec repo to filecoin-project and update links above From 7eedf6372a15a16525872f27801726603835564b Mon Sep 17 00:00:00 2001 From: David Ansermino <14164624+ansermino@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:24:52 -0400 Subject: [PATCH 5/7] Update FIP type Co-authored-by: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> --- FIPS/fip-common_node_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md index 63594a2b..b511134c 100644 --- a/FIPS/fip-common_node_api.md +++ b/FIPS/fip-common_node_api.md @@ -4,7 +4,7 @@ title: Filecoin Common Node Interface V1 author: "David Ansermino (@ansermino), Aatif Syed (@aatifsyed)" discussions-to: status: Draft -type: FTP +type: FIP - Interface category (*only required for Standard Track): Interface created: 2024-06-25 From 990c96fb2c95618be030fd090247f3171afc3043 Mon Sep 17 00:00:00 2001 From: David Ansermino <14164624+ansermino@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:25:22 -0400 Subject: [PATCH 6/7] Add discussion URL --- FIPS/fip-common_node_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md index b511134c..665cc351 100644 --- a/FIPS/fip-common_node_api.md +++ b/FIPS/fip-common_node_api.md @@ -2,7 +2,7 @@ fip: "" title: Filecoin Common Node Interface V1 author: "David Ansermino (@ansermino), Aatif Syed (@aatifsyed)" -discussions-to: +discussions-to: https://github.com/filecoin-project/FIPs/discussions/1032 status: Draft type: FIP - Interface category (*only required for Standard Track): Interface From b6ea9a71febbfcc3f457d891b2fd24ed2752822b Mon Sep 17 00:00:00 2001 From: Aatif Syed <38045910+aatifsyed@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:52:10 +0100 Subject: [PATCH 7/7] doc: remove todos, add note on URLs (#4) * doc: remove todos * doc: note on URLs * review: todos * review: v1 only --- FIPS/fip-common_node_api.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/FIPS/fip-common_node_api.md b/FIPS/fip-common_node_api.md index 665cc351..0ab439df 100644 --- a/FIPS/fip-common_node_api.md +++ b/FIPS/fip-common_node_api.md @@ -49,6 +49,9 @@ Additionally, by establishing a specification we seek to establish a greater res Using the OpenRPC specification format we define several groups of methods. These methods are defined in the OpenRPC specification found here: https://github.com/ChainSafe/filecoin-openrpc-spec. A list of the methods is included below for posterity. All methods are reproduced identically to their present implementation in Lotus 1.26.1. +Note that Lotus hosts two different API's at HTTP paths [`/rpc/v0`](https://github.com/filecoin-project/lotus/blob/v1.28.0-rc5/documentation/en/api-v0-methods.md) and [`/rpc/v1`](https://github.com/filecoin-project/lotus/blob/v1.28.0-rc5/documentation/en/api-v1-unstable-methods.md), +with the latter being marked as _unstable_. +This document aims to specify the `v1` API. Categories have been assigned to indicate the identified use case (see Design Rationale). @@ -330,17 +333,7 @@ A better API, one that is well defined and carefully constructed, will ease the ## TODO -- [x] Confirm methods that are included - [ ] Improve descriptions for included methods -- [ ] Change link to be an issue for the inconsistency -- [ ] Add a note on URIs (eg. `/rpc/v1`) -- [ ] Publish two versions of the document, one per URI -- [x] Make ChainNotify definition more generic -- [ ] Add link to playground -- [ ] Perform proper spellcheck -- [ ] Determine if this should be FIP or FRC -- [ ] Setup discussion forum and add to header -- [ ] Reach out to Venus to establish the state of their RPC - [ ] Transfer spec repo to filecoin-project and update links above - [ ] Add examples to all methods in spec