LNP/BP Standards Association is happy to announce the sixth beta release of RGB version 0.11.
The release marks a reference point for public audit of RGB v0.11. The APIs are now stable, and
feature-freeze has been reached: no further consensus-level or standard library breaking changes are
planned (unless they would become required as a result of newly discovered bugs/issues by the
community or auditors).
Our main focus with Beta 6 was:
- ensure with end-to-end tests that any execution routes and user stories doesn't contain bugs and
preform correctly; - refactor consensus and security-critical code in order to decrease its size and reduce potential
attack surface as much as possible; - make sure that RGB will be able to evolve in the future without introducing backward-incompatible
changes.
All developers working with RGB are urged to update to the new version and use it to ensure
cross-application interoperability between assets, invoices, consignments and other RGB exchange
data.
Unless required, no further beta releases are planned and RGB v0.11 enters public testing and
pre-production preview cycle.
What's new in Beta 6
Beta 6 contain one of the largest changelog: we have fixed, closed and merged more than 120 issues
and pull requests. More than 20 engineers, both from LNP/BP Standards Association member companies
and independent third-parties has contributed since last Beta 5 release by reviewing, discussing and
proposing PRs to the RGB codebase across ~50 repositories related to the project.
The complete list of all closed issues and pull requests can be found on the public RGB roadmap
page; below we review the most important of them:
Consensus-level changes
Beta 6 implements four proposals for consensus-level changes coming from the
RGB change proposals:
- RCP-240227A: Make timestamp part of genesis
- RCP-240227B: Make issuer identity part of genesis
- RCP-240313B: Move script and type libraries outside of schema, interfaces and operations
- RCP-240326A: Multiple metadata fields in contract operations
Other than that, we have:
- Moved information about asset tags, used in homomorphic encryption of the contract state, from
standard library to contract genesis and adding them to the contract commitments; also
significantly simplifying making contract operations which involve these tags; - Improved multichain support, such that RGB contracts can run on top of multiple layer 1 soultions.
This gives contract users ability to do cheaper and faster transactions using Liquid network,
and benefit from the new client-side validated layer 1 called Prime, scheduled for the release
later; - New virtual machine op-codes for introspecting smart contract state and simplified branching
op-codes making scripts more streamlined; - More RGB macro assembly instructions allowing to write complex verification code;
- Improved checking and handling of strings with restricted character set, like the ones used for
RGB20 asset tickers and names; - Refactored mechanism for combining different types of single-use seals (like tapret- and
opret-based) in inputs of a state transitions; - Removed legacy schema inheritance feature in favor of new advanced interface inheritance, which
is implemented outside of consensus code (see below).
Additionally, we have put a consensus changes required to make the following proposals
fast-forwards, which means that they can be implemented in a future releases (like v0.12 etc)
without consensus-breaking changes:
- RCP-240313A: SPV proofs for anchor transactions
- RCP-240327A: Computed state
- RCP-240406A: Fallback single-use-seal
We have also adjusted the complexity counter for reserved RGB op-code values, which ensures that
adding more op-codes to the virtual machine can be done in a backward-compatible manner.
Overall, with all those changes the size of consensus code in RGB Core library has decreased from
7170 to 6726 lines of Rust code (LORC), excluding comments and blank lines, which is
>6% reduction.
Interfaces and inheritance
Interface inheritance is the brand-new way of designing RGB smart contract interfaces which brings
much better modularity, audibility and upgradeability for the contracts.
Interfaces are defined at the level above consensus and specify how software or a user can interact
with a given contract. Interface defines a semantic for a business logic of a contract, and
contract developers write an implementations linking that business logic to the semantics. In
other words, interface explains to the user the meaning of a smart contract. One example is RGB20:
an interface (which becomes a family of interfaces in beta 6) which all contracts with a fungible
tokens can implement to be supported by any RGB wallet. The fact that interfaces are not a part of
the consensus level allows contract developers to gradually provide more and more advanced APIs
without a need to re-issue an assets or create new contract versions. On the other hand, users may
interact with smart contracts using newly released interfaces without the need of a wallet software
to be upgraded.
Previously RGB v0.11 beta 6 there were no interface inheritance, meaning that a contract can
implement a given interface only once; and must provide all of its functionality at once. Now, with
interface inheritance, this can become a gradual process. For instance, today RGB20 standard defines
what fungible assets can do. In a future a new features can be added to the standard (like reserves
or vesting), implemented as a new interfaces inheriting existing RGB20 interfaces and implemented
by existing assets which had that functionality in their business logic – and wallets will be able
to handle them in a correct way without any software upgrades.
As a part of the work on interfaces and inheritance, we have refactored the way errors can be
reported from smart contract validation scripts. Now, you can provide detailed error messages as
strings inside interface definitions and link them to raised errors via integer codes in
implementations.
At the same time interface inheritance brings much better modularity and audibility: you can compare
RGB20 standard
before the inheritance was introduced
and now.
We have re-implemented all previosly-defined interface standards (RGB-20, 21 and 25) as standard
sets ("families") of related interfaces and re-designed the APIs for working with them.
Finally, with beta 6 we added a number of interface and implementation integrity and validity
checks, which should simplify the work of developers and debugging.
The details of how the inheritance works can be found in
RCP-240325A: Interface inheritance proposal.
Invoicing
We also have made few changes to the invoicing. In RGB, invoices are form of URIs (like URLs), and
thus can be opened with one-click in your favorite wallet.
With beta 6 we changed the format for displaying asset amount inside the invoice. RGB20 standard,
like many other asset standards in other systems (ERC20 etc) allow to specify a precision for asset
amounts. Invoices contain information about the amount with no precision, creating a lot of
confusion for users, as well as a attack surface. Starting from the current release we hide the
amounts behind custom latin letter encoding (modified Base32 encoding with no numbers used),
removing the problem. To read an invoice a user must use wallet or other software, which will parse
it for the user using correct precision from the contract information. To simplify working with such
amounts we provide a new CoinAmount
type which embeds information about precision and is handy for
presenting asset values in the UI.
Finally, invoices has changed they way a pay-to-address requests are handled. Previously, an
explicit bitcoin address was used; now we standardized that with usual blind seal definitions using
the same encoding, chunking and supporting incorporation of custom seal close method information.
Last, but not least, we have optimized identities we use across RGB (like contracts, interfaces etc)
– it was switched from Baid58 to Baid64 encoding, which resulted in shorter fixed-length identifiers,
robust chunking, and solved few issues with its URI standard compatibility and chunking.
Data containers
With client-side validation, all the contract state, new state transitions and history are sent
between peers, in a P2P way. This is quite different from the blockchain-bases systems and require
specific methods of storing and sharing the data: data containers.
There are several types of data containers in RGB. In v0.11 beta 6 we have put a lot of
optimizations into the way containers work, making them more compact and secure.
Previously, information for smart contract developers – interfaces, schemata and interface
implementations were always present as a separate files. With beta 6 we introduce kits: new data
container type which may store multiple interfaces, schemata, implementations and other data in one
single package. We have also made sure that repeated information – like data type or script
libraries which can be re-used by different interfaces and contracts – is shipped only once,
reducing the size of data containers for about a dozen of percents.
Another type of data containers are consignments, used to distribute smart contracts, assets and do
transfers. Consignments has also become smaller, since they also include all related interfaces and
implementations and thus do benefit from aggregation of data type and script libraries.
Previosly containers were packed with mechanism called bindles. With beta 6, we deprecate bindles,
which simplify the standard library API.
Special attention was paid to supplements: non-consensus meta information added to consignments,
and kits – like custom icons for assets etc. We have rewritten supplement API and made them really
extensible, such that new types of information and annotations can be added without requiring
updates to the standard library.
Data containers are binary files, but RGB supports a special ASCII-armored text representation using
Base85 encoding. We added few improvements to the ASCII armoring, like more informative headers,
which now may contain lists; verification of checksums and increased number of characters per line
to reduce file size and text length of the armored data.
Last, but not least: we are introducing ability for developers and contract issuers to provide their
identities and sign interfaces, contracts and other parts of the information, such that wallets can
use decentralized web of trust-like functionality to filter trusted and non-trusted sources and
protect users. The new identity system is flexible: it can support multiple standards, with PGP/GPG,
SSH are in pipeline. We also plan to use self-sovereign identities (SSI) developed by LNP/BP
Standrards Association in partnership with Cyphernet: a new single-use seal based web-of-trust
standard for compact and easy-to-use identities.
Other standard library changes
There are more improvements in the standard library APIs, including completed deterministic contract
and operation creation; simplified API for working with contracts and consignments; many new
interface-related APIs and support for accessing and adding metadata and state extension-related
information to the contracts and operations.
Application-level changes
For the first time, RGB v0.11 comes with embedded wallet support right out of the box. This was one
of the major pain points for the users and developers. Beta 6 extends and simplifies RGB wallet
APIs, as well as improves Electrum and Esplora support.
Toolchain and dev tools
On top of standard and wallet libraries RGB v0.11 include a new high-level RGB runtime for software
integration and simple command-line tool rgb
made with it. In beta 6 we put a lot of effort in
improving them further, providing new APIs and commands, as well as improving output presentation
and information details, including presenting non-asset smart contract state like digital rights,
attachments and arbitrary structured data. Also, we added commands for debugging and testing smart
contracts, like those converting data consignments and stash information into human-readable and
editable YAML format, also allowing to import it back with some changes; which can be useful for
penetration testing.
Client-side-validated data are now kept not as a single file, but as three independent files:
stash.dat
, with critical non-recoverable consensus information; index.dat
– indexes and
state.dat
- cache of the contract state for faster access.
We are continuing our work on providing high-level programming language Contractum for RGB
interface and contract developers. In beta 6 we included a reverse compiler which translates any
binary interface, iterface implementation or a contract into Contractum representation. For
instance, all standard interface families, like RGB20 etc, were generated with it.
One of the most security-important things coming with beta 6 is the integration end-to-end tests
developed and contributed by Bitfinex RGB team. They cover about a hunderd of different user
stories, involving assets issuance and complex multi-asset multi-wallet transfers, involving
different forms of single use seals and their combination. This tests were the major tool of
debugging the new release and with them passing we can now proceed to the next stage: audit and
penetration testing.
What's next
With Beta 6 release RGB development enters a new phase of preparation for a public preview of
the RGB v0.11. Beta 6 is recommended to be used by all parties integrating RGB, and after gathering
their feedback (and fixing all newly discovered issues) we will release the public preview version.
In parallel, with support from Bitfinex, we are starting working on audit and petentration testing
of RGB, ensuring the system security and safety before the final release.
We continue an ongoing effort of documenting RGB, and with beta 6 stabilizing consensus and standard
APIs we plan to review, update and extend all existing documentation and prepare it for a reliease
alongside the v0.11.
You can track us on our journey towards v0.11 release with this GitHub dashboard.
About RGB v0.11
RGB v0.11 is an evolution of the protocol coming with a lot of bug fixes and improvements, further
enhancing RGB smart contracting capabilities. It will be the first version which will be audited by
independent auditors, after which it can be considered by third-party issuers for the use in
production.
The main features shipping in v0.11 are:
- Wallet integration right into RGB runtime and command-line tool;
- Basic support for Liquid sidechain, with ability to add more alternative scalability layers in the
future; - Scripting, with new state introspection codes and RGB assembly compiler;
- Initial support for Contractum language;
- Ability to inherit interfaces (multiple inheritance!);
- Support of Electrum RPC additionally to Esplora REST, present before;
- Commitments to issuer and developer identities embedded into contracts, interfaces, libraries;
- More compact consignments and better ASCII armoring.
Contributing
RGB is a free software and opensourc effort, built by community. The development is supervised by
a non-profit LNP/BP Standards Association, which uses open approach: anybody from the
community can propose a request for RGB change (RCP), ask a question in discussions, open an
issue in GitHub, propose a pull request or review pull requests of others. The association also
maintains public roadmap summarizing the current development progress and listing all issues
and pull requests across multiple repositories and github organizations related to the RGB.
Specifically, starting from the beta 6 release, we are also looking for qualified auditors and
penetration testers who can contribute into making RGB more secure and robust. We plan a grant
program to facilitate this process; with any enquiries please contact us via info@lnp-bp.org.
Acknowledgements
We are grateful to Fulgur Ventures, providing another year of support for our efforts in
developing RGB. This year they were joined by Bitlight Labs, who had become a new full member of
the Association.
We have received a number of important contributions and bugfixes coming from commercial
companies, such as Pandora Prime, Bitfinex and DIBA. We are also grateful for individual
contributors, who do their small -- but still highly valuable and welcomed input in making RGB
better.