LIP: 0001 Title: LIP purpose and guidelines Author: Lisk Foundation <email@example.com> Status: Active Type: Process Created: 2018-06-14 Updated: 2018-11-21
A Lisk Improvement Proposal (LIP) is a design document providing information to the Lisk community, or describing a new feature for Lisk or its processes or environment. The LIP should provide a concise technical specification of the feature and a rationale for the feature.
We intend LIPs to be the primary mechanisms for proposing new features, for collecting community input on an issue, and for documenting the design decisions that have gone into Lisk. The LIP author is responsible for building consensus within the community and documenting dissenting opinions.
Because the LIPs are maintained as text files in a versioned repository, their revision history is the historical record of the feature proposal.
This LIP is licensed under the GNU General Public License, version 3.
LIP Work Flow
The LIP process begins with a new idea for Lisk. Each potential LIP must have a champion—someone who writes the LIP using the style and format described below, shepherds the discussions in the appropriate forums, and attempts to build community consensus around the idea. The LIP champion (a.k.a. Author) should first attempt to ascertain whether the idea is LIP-able.
Small enhancements or patches to a particular piece of software often don't require standardisation between multiple projects; these don't need a LIP and should be injected into the relevant project-specific development workflow with a patch submission to the applicable issue tracker. Additionally, many ideas have been brought forward for changing Lisk that have been rejected for various reasons. The first step should be to search past discussions to see if an idea has been considered before, and if so, what issues arose in its progression. After investigating past work, the best way to proceed is by posting about the new idea to the LIPs mailing list.
Vetting an idea publicly before going as far as writing a LIP is meant to save both the potential author and the wider community time. Asking the Lisk community first if an idea is original helps prevent too much time being spent on something that is guaranteed to be rejected based on prior discussions (searching the internet does not always do the trick). It also helps to make sure the idea is applicable to the entire community and not just the author. Just because an idea sounds good to the author does not mean it will work for most people in most areas where Lisk is used.
Once the champion has asked the Lisk community as to whether an idea has any chance of acceptance, a draft LIP should be presented to the LIPs mailing list. This gives the author a chance to flesh out the draft LIP to make it properly formatted, of high quality, and to address additional concerns about the proposal. Following a discussion, the proposal should be submitted to the LIPs git repository as a pull request. This draft must be written in LIP style as described below, and named with an alias such as "lip-johndoe-infinitelisks" until the editor has assigned it a LIP number (authors MUST NOT self-assign LIP numbers).
LIP authors are responsible for collecting community feedback on both the initial idea and the LIP before submitting it for review. However, wherever possible, long open-ended discussions on public mailing lists should be avoided. Strategies to keep the discussions efficient include: setting up a separate special interest group mailing list for the topic, having the LIP author accept private comments in the early design phases, setting up a wiki page or git repository, etc. LIP authors should use their discretion here.
It is highly recommended that a single LIP contain a single key proposal or new idea. The more focused the LIP, the more successful it tends to be. If in doubt, split your LIP into several well-focused ones.
When the LIP draft is complete, the LIP editor will assign the LIP a number, label it as Standards Track, Informational, or Process, and merge the pull request to the LIPs git repository. The LIP editor will not unreasonably reject a LIP. Reasons for rejecting LIPs include duplication of effort, disregard for formatting rules, being too unfocused or too broad, being technically unsound, not providing proper motivation or addressing backwards compatibility, or not in keeping with the Lisk philosophy. For a LIP to be accepted it must meet certain minimum criteria. It must be a clear and complete description of the proposed enhancement. The enhancement must represent a net improvement. The proposed implementation, if applicable, must be solid and must not complicate the protocol unduly.
The LIP author may update the draft as necessary in the git repository. Updates to drafts should also be submitted by the author as pull requests. In particular, unless there is a specific dependency on another LIP, LIPs should be written without assuming the success of any other outstanding LIP. Therefore updates to certain LIPs may be required in the event that another LIP progresses to Final or Active status.
Transferring LIP Ownership
It occasionally becomes necessary to transfer ownership of LIPs to a new champion. In general, we'd like to retain the original author as a co-author of the transferred LIP, but that's really up to the original author. A good reason to transfer ownership is because the original author no longer has the time or interest in updating it or following through with the LIP process, or has fallen off the face of the 'net (i.e. is unreachable or not responding to email). A bad reason to transfer ownership is because you don't agree with the direction of the LIP. We try to build consensus around a LIP, but if that's not possible, you can always submit a competing LIP.
If you are interested in assuming ownership of a LIP, send a message asking to take over, addressed to both the original author and the LIP editor. If the original author doesn't respond to email in a timely manner, the LIP editor will make a unilateral decision (it's not like such decisions can't be reversed :).
The current LIP editor is the Lisk Foundation, who can be contacted at firstname.lastname@example.org.
LIP Editor Responsibilities & Workflow
For each new LIP that comes in an editor does the following:
- Reads the LIP to check if it is ready: sound and complete. The ideas must make technical sense, even if they don't seem likely to be accepted.
- Edits the LIP for language (spelling, grammar, sentence structure, etc.), as well as markup and code style.
- Checks the LIP title accurately describes the content.
- Checks the LIP draft has been sent to the LIPs mailing list for discussion.
- Checks the motivation and backward compatibility (when applicable) has been addressed.
- Checks the defined Module header has been correctly assigned for the given specification.
- Checks the licensing terms are acceptable for a LIP.
If the LIP isn't ready, the editor will send it back to the author for revision, with specific instructions.
Once the LIP is ready for the repository it should be submitted as a "pull request" to the LIPs git repository where it may get further feedback.
The LIP editor will:
Assign a LIP number in the pull request.
Merge the pull request when it is ready.
List the LIP in the README.
The LIP editors are intended to fulfil administrative and editorial responsibilities. The LIP editors monitor LIP changes, and update LIP headers as appropriate.
LIP Format and Structure
Each LIP should have the following parts:
Preamble—Headers containing metadata about the LIP.
Abstract—A short (~200 word) description of the technical issue being addressed.
Copyright—Each LIP must be licensed under the GNU General Public License, version 3.
Specification—The technical specification should describe the syntax and semantics of any new feature. The specification should be detailed enough to allow competing, interoperable implementations for any of the current Lisk platforms. In the special case where the choice of a library is critical (e.g. security), a recommendation about libraries and reasoning should be included.
Motivation—The motivation is critical for LIPs that want to change the Lisk protocol. It should clearly explain why the existing protocol is inadequate to address the problem that the LIP solves.
Rationale—The rationale fleshes out the specification by describing what motivated the design and why particular design decisions were made. It should describe alternative designs that were considered and related work. The rationale should provide evidence of consensus within the community and discuss important objections or concerns raised during discussion.
Backwards compatibility—All LIPs that introduce backwards incompatibilities must include a section describing these incompatibilities and their severity. The LIP must explain how the author proposes to deal with these incompatibilities.
Reference implementation—The reference implementation must be completed before any LIP is given status "Final", but it need not be completed before the LIP is accepted. It is better to finish the specification and rationale first and reach consensus on it before writing code. As long as the reference implementation is not finished, the reference implementation section can simply state “TBD”. Once the reference implementation has been completed, the corresponding pull request, issue or a milestone should be linked from the reference implementation section.
LIP Header Preamble
Each LIP must begin with an RFC 822 style header preamble. The headers must appear in the following order. Headers marked with "?" are optional and are described below. All other headers are required.
LIP: <LIP number> Title: <LIP title> Author: <List of authors' real names including email address> ? Discussions-To: <Email address> ? Comments-Summary: <Summary tone> Comments-URI: <Link(s) to wiki page for comments> ? Status: <Draft | Active | Proposed | Deferred | Rejected | Withdrawn | Final | Replaced> Type: <Standards Track | Informational | Process> Module: <Affected modules e.g. Accounts | Blocks | Transactions> Created: <YYYY-MM-DD> Updated: <YYYY-MM-DD> ? Requires: <LIP number(s)> ? Replaces: <LIP number> ? Superseded-By: <LIP number>
The LIP header contains the unique identifier of the LIP. Assigned by the LIP editor.
The Title header gives a brief and precise description of the proposal. An example of a good title is “Change to byte based block size limit”. Generic titles such as “Improve P2P Layer” should be avoided as there could be multiple improvements of this aspect of the protocol in the future and it is unclear which specific aspect of the protocol the proposal suggests changing. Note that once a pull request is opened on GitHub, the LIP editor will also confirm that the title of a LIP satisfies these guidelines and adjust it at his/her discretion.
The Author header lists the names, and optionally the email addresses of all the authors/owners of the LIP. The format of the Author header value must be
Random J. User <email@example.com>
If there are multiple authors, each should be on a separate line following RFC 2822 continuation line conventions.
The Discussions-To header lists the email address for which discussions on the LIP should be sent to.
The Comments-Summary header gives a summary tone of the comments the LIP has received from the community. (See the Specification section for LIP Comments below for possible summary tones.)
The Comments-URI contains one or more links to a wiki page where comments on the LIP have been made.
The Status header indicates the current state of the LIP. Assigned by the LIP editor.
The Type header specifies the type of LIP: Standards Track, Informational, or Process.
The Module headers lists the modules affected by the LIP, e.g. Accounts, Blocks, or Transactions.
If there are multiple modules, each should be on a separate line following RFC 2822 continuation line conventions.
The Created header records the date that the LIP was assigned a number, while the Updated header is used to record the date of the last modification. Both headers should be in YYYY-MM-DD format, e.g. 2001-08-14.
LIPs may have a Requires header, indicating the LIP numbers that this LIP depends on.
LIPs may have a Replaces header, indicating the LIP number that this LIP renders obsolete.
LIPs may also have a Superseded-By header indicating that a LIP has been rendered obsolete by a later document; the value is the number of the LIP that replaces the current document. The newer LIP must have a Replaces header containing the number of the LIP that it rendered obsolete.
LIPs may include auxiliary files such as diagrams. Image files should be included in a subdirectory for that LIP. Auxiliary files must be named LIP-XXXX-Y.ext, where "XXXX" is the LIP champion's name, or the LIP's number (once it has been assigned), "Y" is a serial number (starting at 1), and "ext" is replaced by the actual file extension (e.g. "png").
There are three kinds of LIP:
- A Standards Track LIP describes any change that affects most or all Lisk implementations, such as a change to the network protocol, a change in block or transaction validity rules, or any change or addition that affects the interoperability of applications using Lisk. Standards Track LIPs consist of two parts, a design document and a reference implementation.
- An Informational LIP describes a Lisk design issue, or provides general guidelines or information to the Lisk community, but does not propose a new feature. Informational LIPs do not necessarily represent a Lisk community consensus or recommendation, so users and implementors are free to ignore Informational LIPs or follow their advice. Information LIPs are typically concerned with decisions specific to an implementation.
- A Process LIP describes a process surrounding Lisk, or proposes a change to (or an event in) a process. Process LIPs are like Standards Track LIPs but apply to areas other than the Lisk protocol itself. They may propose an implementation, but not to Lisk's codebase; they often require community consensus; unlike Informational LIPs, 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 Lisk development. Any meta-LIP is also considered a Process LIP.
LIP Status Field
The typical paths of the status of LIPs are as follows:
Champions of a LIP may decide on their own to change the status between Draft, Deferred, or Withdrawn. The LIP editor may also change the status to Deferred when no progress is being made on the LIP.
A LIP may only change status from Draft (or Rejected) to Proposed, when the author deems it is complete, has a working implementation (where applicable), and has community plans to progress it to the Final status.
LIPs should be changed from Draft or Proposed status, to Rejected status, upon request by any person, if they have not made progress in three years. Such a LIP may be changed to Draft status if the champion provides revisions that meaningfully address public criticism of the proposal, or to Proposed status if it meets the criteria required as described in the previous paragraph.
A Proposed LIP may progress to Final only when specific criteria reflecting real-world adoption has occurred. This is different for each LIP depending on the nature of its proposed changes. Evaluation of this status change should be objectively verifiable, and/or be discussed on the LIPs mailing list.
When a Final LIP is no longer relevant, its status should be changed to Replaced. This change must also be objectively verifiable and/or discussed.
A process LIP may change status from Draft to Active when it achieves rough consensus on the mailing list. Such a proposal is said to have rough consensus if it has been open to discussion on the LIPs mailing list for at least one month, and no person maintains any unaddressed substantiated objections to it. Addressed or obstructive objections may be ignored/overruled by general agreement that they have been sufficiently addressed, but clear reasoning must be given in such circumstances.
Each LIP should, in its preamble, link to a public wiki page with a summary tone of the comments on that page (see below for possible summary tones). Reviewers of the LIP who consider themselves qualified, should post their own comments on this wiki page. The comments page should generally only be used to post final comments for a completed LIP. If a LIP is not yet completed, reviewers should instead post on the applicable development mailing list thread to allow the LIP author(s) to address any concerns or problems pointed out by the review.
Some LIPs receive exposure outside the development community prior to completion, and other LIPs might not be completed at all. To avoid a situation where critical LIP reviews may go unnoticed during this period, reviewers may, at their option, still post their review on the comments page, provided they first post it to the mailing list and plan to later remove or revise it as applicable based on the completed version. Such revisions should be made by editing the previous review and updating the timestamp. Reviews made prior to the complete version may be removed if they are no longer applicable and have not been updated in a timely manner (e.g., within one month).
Pages must be named after the full LIP number (e.g., "LIP 0001") and placed in the "Comments" namespace. For example, the link for LIP 1 will be https://github.com/LiskHQ/lips/wiki/Comments:LIP-0001.
Comments posted to this wiki should use the following format:
<Your opinion> —<Your name>, <Date of posting, as YYYY-MM-DD>
LIPs may also choose to list a second forum for LIP comments, in addition to the LIPs wiki. In this case, the second forum's URI should be listed below the primary wiki's URI.
After some time, the LIP itself may be updated with a summary tone of the comments. Summary tones may be chosen from the following, but this LIP does not intend to cover all possible nuances and other summaries may be used as needed:
- No comments yet
- Unanimously Recommended for implementation
- Unanimously Discouraged for implementation
- Mostly Recommended for implementation, with some Discouragement
- Mostly Discouraged for implementation, with some Recommendation
For example, the preamble to LIP 0001 might be updated to include the line:
Comments-Summary: No comments yet. Comments-URI: https://github.com/LiskHQ/lips/wiki/Comments:LIP-0001 https://some-other-wiki.org/LIP_0001_Comments
These fields must follow the "Discussions-To" header (if that header is not present, it should follow the position where it would be present; generally this is immediately above the Status header).
To avoid doubt: comments and status are unrelated metrics to judge a LIP, and neither should be directly influencing the other.
What is the purpose of LIP comments?
- There is a danger that some people will regard LIPs as a "good idea" simply by virtue of them being assigned a LIP number. Due to the low barrier of entry for submission of new LIPs, it seems advisable for a way for reviewers to express their opinions on them in a way that is consumable to the public without needing to review the entire development discussion.
Will LIP comments be censored or limited to particular participants/"experts"?
- Participants should freely refrain from commenting outside of their area of knowledge or expertise. However, comments should not be censored, and participation should be open to the public.