update serializations
parent
5094db8a21
commit
c7e5881a6d
@ -1,5 +1,13 @@
|
||||
# API Encoding (`xy_ABCD` strings)
|
||||
|
||||
## Links
|
||||
|
||||
- [GMSerialization API Encoder](https://git.qpq.swiss/QPQ-AG/gmserialization/src/commit/ac64e01b0f675c1a34c70a827062f381920742db/src/gmser_api_encoder.erl)
|
||||
- [[BaseN]]
|
||||
- [[RLP]]
|
||||
|
||||
## Introduction
|
||||
|
||||
When you are interacting with Gajumaru you often encounter garbage strings like
|
||||
|
||||
```
|
||||
|
10
BaseN.md
10
BaseN.md
@ -2,7 +2,7 @@
|
||||
|
||||

|
||||
|
||||
# Quick Reference
|
||||
## Quick Reference
|
||||
|
||||
1. Original article: <https://zxq9.com/archives/2688>
|
||||
2. Base64 Erlang:
|
||||
@ -14,7 +14,7 @@
|
||||
5. Base58 TypeScript:
|
||||
<https://github.com/aeternity/Vanillae/blob/829dd2930ff20ea0473cf2ad562e0a1c2aba0411/bindings/typescript/src/b58.ts>
|
||||
|
||||
# tl;dr
|
||||
## tl;dr
|
||||
|
||||
Base64 and Base58 are two schema for taking binary data and encoding it
|
||||
to and from plain text.
|
||||
@ -64,7 +64,7 @@ to and from plain text.
|
||||
2. likely to be entered manually (e.g. wallet/contract
|
||||
addresses)
|
||||
|
||||
# Base64
|
||||
## Base64
|
||||
|
||||
The term "binary" is misleading, because it leads people to think that
|
||||
the basic unit in computing is a bit (a 1 or a 0).
|
||||
@ -222,7 +222,7 @@ This is marginally trickier because
|
||||
1. it needs an accumulator
|
||||
2. the order of the cases matters
|
||||
|
||||
# Long Division
|
||||
## Long Division
|
||||
|
||||
As mentioned above, Base58 is the "general" BaseN algorithm applied to
|
||||
the case `N=58`. This general algorithm I am calling the
|
||||
@ -370,7 +370,7 @@ agrees:
|
||||
Our Base58 code is going to contain exactly this idea modulo an
|
||||
unpleasant volume of edge case stupidity.
|
||||
|
||||
# Base58 algorithm
|
||||
## Base58 algorithm
|
||||
|
||||
Conceptually, we are doing the following:
|
||||
|
||||
|
25
Home.md
25
Home.md
@ -7,3 +7,28 @@
|
||||
3. [[RLP]]: If the binary `ABCD` is some data with fields (e.g. a transaction),
|
||||
how to destructure the binary data to fields
|
||||
4. [[Serializations]]: Conventions for field order in Gajumaru data structures
|
||||
|
||||
## Principles
|
||||
|
||||
- ~Every article should have a "YouTube Thumbnail" diagram at the top that
|
||||
visually illustrates whatever is explained in the page
|
||||
- Things should be illustrated with code examples that work when possible
|
||||
- Move links to aeternity things to QPQ repos
|
||||
- Every article should have a "I just need to get a thing to work and don't
|
||||
have time to read a whole article" section that links to which things you
|
||||
should just use in practice and maybe a short example of how to use them.
|
||||
|
||||
## TODOs
|
||||
|
||||
- API-Encoding:
|
||||
- needs practical reference (which functions to call)
|
||||
- maybe could use a diagram
|
||||
- BaseN:
|
||||
- needs practical reference
|
||||
- don't link to things in aeternity repos
|
||||
- RLP:
|
||||
- practical reference
|
||||
- don't link to aeternity repos
|
||||
- Serializations:
|
||||
- write
|
||||
- need exhaustive reference
|
||||
|
143
Serialization.md
143
Serialization.md
@ -0,0 +1,143 @@
|
||||
# Serializations Reference
|
||||
|
||||
## Links
|
||||
|
||||
- [[RLP]]
|
||||
- [[API Encoding]]
|
||||
- [GMSerialization lib](https://git.qpq.swiss/QPQ-AG/gmserialization)
|
||||
- [`gmser_id` module](https://git.qpq.swiss/QPQ-AG/gmserialization/src/commit/ac64e01b0f675c1a34c70a827062f381920742db/src/gmser_id.erl)
|
||||
- [`gmserialization` module](https://git.qpq.swiss/QPQ-AG/gmserialization/src/commit/ac64e01b0f675c1a34c70a827062f381920742db/src/gmserialization.erl)
|
||||
- [Gajumaru repo](https://git.qpq.swiss/QPQ-AG/gajumaru/)
|
||||
|
||||
## Introduction/Summary
|
||||
|
||||
- Chain objects are encoded into binary, using [[RLP]], according to the RLP templates here
|
||||
- Those binary representations may further be encoded into plain text using the [[API Encoding]]
|
||||
- As of 2025-03-23, this document is **NOT** exhaustive
|
||||
- Things with multiple fields are encoded as `[Tag, Version | Fields]`
|
||||
- This page is meant to succeed [the serializations page in the protocol](https://git.qpq.swiss/QPQ-AG/protocol/src/commit/d6ad171aba76aa34f4763ecd5f3a096475384271/serializations.md)
|
||||
- That page is out of date
|
||||
- This page is meant to be a more up-to-date version written in a way that it's easier to
|
||||
1. keep up-to-date
|
||||
2. detect when it's out of date
|
||||
- Every part of the documentation here should have a permalink reference to
|
||||
the source file. This way a reader can click on the reference and check if
|
||||
it is out of date
|
||||
- Each primary object type generally has an "app" dedicated to it in [the
|
||||
Gajumaru repo](https://git.qpq.swiss/QPQ-AG/gajumaru) which also defines a
|
||||
sort of namespace like the `aect_*` prefix.
|
||||
- The serializers and things are defined in terms of those modules, which
|
||||
serve an an interface to the type as an ADT so that everything can be
|
||||
called in a regular way (roughly `Type:serialize(This)`).
|
||||
- Example:
|
||||
- [`aect_contracts` contract record](https://git.qpq.swiss/QPQ-AG/gajumaru/src/commit/7b3cc1db3bb36053023167b86f7d6f2d5dcbd01d/apps/aecontract/src/aect_contracts.erl#L72-L85)
|
||||
- [`aect_contracts` serialization template](https://git.qpq.swiss/QPQ-AG/gajumaru/src/commit/7b3cc1db3bb36053023167b86f7d6f2d5dcbd01d/apps/aecontract/src/aect_contracts.erl#L294-L303)
|
||||
|
||||
|
||||
|
||||
## The `id()` type
|
||||
|
||||
Any account or contract etc that is somehow party to a transaction is encoded
|
||||
using this convention:
|
||||
|
||||
```erlang
|
||||
<<IdTag:8, PubKey:32/bytes>>
|
||||
```
|
||||
|
||||
The Tags are ([source](https://git.qpq.swiss/QPQ-AG/gmserialization/src/commit/ac64e01b0f675c1a34c70a827062f381920742db/src/gmser_id.erl#L111-L118))
|
||||
|
||||
```erlang
|
||||
decode_tag(1) -> account;
|
||||
decode_tag(2) -> name;
|
||||
decode_tag(3) -> commitment;
|
||||
decode_tag(5) -> contract;
|
||||
decode_tag(6) -> channel;
|
||||
decode_tag(7) -> associate_chain;
|
||||
decode_tag(8) -> native_token;
|
||||
decode_tag(9) -> entry;
|
||||
```
|
||||
|
||||
## Table of object tags
|
||||
|
||||
[Source](https://git.qpq.swiss/QPQ-AG/gmserialization/src/commit/ac64e01b0f675c1a34c70a827062f381920742db/src/gmser_chain_objects.erl#L120-L197)
|
||||
|
||||
```
|
||||
rev_tag(10) -> account;
|
||||
rev_tag(11) -> signed_tx;
|
||||
rev_tag(12) -> spend_tx;
|
||||
rev_tag(13) -> data_extend_tx;
|
||||
rev_tag(30) -> name;
|
||||
rev_tag(31) -> name_commitment;
|
||||
rev_tag(32) -> name_claim_tx;
|
||||
rev_tag(33) -> name_preclaim_tx;
|
||||
rev_tag(34) -> name_update_tx;
|
||||
rev_tag(35) -> name_revoke_tx;
|
||||
rev_tag(36) -> name_transfer_tx;
|
||||
rev_tag(37) -> name_auction;
|
||||
rev_tag(40) -> contract;
|
||||
rev_tag(41) -> contract_call;
|
||||
rev_tag(42) -> contract_create_tx;
|
||||
rev_tag(43) -> contract_call_tx;
|
||||
rev_tag(44) -> contract_source;
|
||||
rev_tag(50) -> channel_create_tx;
|
||||
rev_tag(501) -> channel_set_delegates_tx;
|
||||
rev_tag(502) -> channel_delegates;
|
||||
rev_tag(51) -> channel_deposit_tx;
|
||||
rev_tag(52) -> channel_withdraw_tx;
|
||||
rev_tag(521) -> channel_force_progress_tx;
|
||||
rev_tag(53) -> channel_close_mutual_tx;
|
||||
rev_tag(54) -> channel_close_solo_tx;
|
||||
rev_tag(55) -> channel_slash_tx;
|
||||
rev_tag(56) -> channel_settle_tx;
|
||||
rev_tag(57) -> channel_offchain_tx;
|
||||
rev_tag(570) -> channel_offchain_update_transfer;
|
||||
rev_tag(571) -> channel_offchain_update_deposit;
|
||||
rev_tag(572) -> channel_offchain_update_withdraw;
|
||||
rev_tag(573) -> channel_offchain_update_create_contract;
|
||||
rev_tag(574) -> channel_offchain_update_call_contract;
|
||||
rev_tag(576) -> channel_offchain_update_meta;
|
||||
rev_tag(575) -> channel_client_reconnect_tx;
|
||||
rev_tag(58) -> channel;
|
||||
rev_tag(59) -> channel_snapshot_solo_tx;
|
||||
rev_tag(60) -> trees_poi;
|
||||
rev_tag(61) -> trees_db;
|
||||
rev_tag(62) -> state_trees;
|
||||
rev_tag(63) -> mtree;
|
||||
rev_tag(64) -> mtree_value;
|
||||
rev_tag(621) -> contracts_mtree;
|
||||
rev_tag(622) -> calls_mtree;
|
||||
rev_tag(623) -> channels_mtree;
|
||||
rev_tag(624) -> nameservice_mtree;
|
||||
rev_tag(626) -> accounts_mtree;
|
||||
rev_tag(627) -> acs_mtree;
|
||||
rev_tag(628) -> entries_mtree;
|
||||
rev_tag(70) -> compiler_sophia;
|
||||
rev_tag(80) -> ga_attach_tx;
|
||||
rev_tag(81) -> ga_meta_tx;
|
||||
rev_tag(82) -> paying_for_tx;
|
||||
rev_tag(810) -> ga_meta_tx_auth_data;
|
||||
rev_tag(90) -> associate_chain;
|
||||
rev_tag(91) -> ac_state;
|
||||
rev_tag(92) -> ac_burn;
|
||||
rev_tag(93) -> ac_create_tx;
|
||||
rev_tag(94) -> ac_deposit_tx;
|
||||
rev_tag(95) -> ac_update_cops_tx;
|
||||
rev_tag(96) -> ac_rollup_tx;
|
||||
rev_tag(97) -> ac_proposal_tx;
|
||||
rev_tag(100) -> key_block;
|
||||
rev_tag(101) -> micro_block;
|
||||
rev_tag(102) -> light_micro_block;
|
||||
rev_tag(110) -> testimony;
|
||||
rev_tag(111) -> testimony_tx;
|
||||
rev_tag(120) -> nt_native_token;
|
||||
rev_tag(121) -> nt_create_tx;
|
||||
rev_tag(122) -> nt_mint_tx;
|
||||
rev_tag(123) -> nt_finalize_tx;
|
||||
rev_tag(124) -> nt_trade_tx;
|
||||
rev_tag(125) -> nt_burn_tx;
|
||||
rev_tag(140) -> entry;
|
||||
rev_tag(141) -> entry_create_tx;
|
||||
rev_tag(142) -> entry_transfer_tx;
|
||||
rev_tag(143) -> entry_destroy_tx;
|
||||
rev_tag(200) -> pof.
|
||||
```
|
Loading…
x
Reference in New Issue
Block a user