Awesome
aebytecode
A library and stand alone assembler for aeternity bytecode.
This version supports AEVM bytecode and FATE bytecode.
Build
$ make
Fate Code
Fate code exists in 3 formats:
- Fate byte code. This format is under consensus.
- Fate assembler. This is a text represenation of fate code. This is not under consensus and other implemenation and toolchains could have their own format.
- Internal. This is an Erlang representation of fate code Used by this particular engin implementation.
This library handles all three representations. The byte code format is described in a separate document. The internal format is described in a separate document. The text representation is described below.
Fate Assembler Code
Assembler code can be read from a file. The assembler has the following format:
Comments start with 2 semicolons and runs till end of line
;; This is a comment
Opcode mnemonics start with an upper case letter.
DUP
Identifiers start with a lower case letter
an_identifier
References to function arguments start with arg followed by an integer
arg0
References to variables/registers start with var followed by an integer
var0
References to stack postions is either a (for stack 0)
or start with stack followed by an integer
stack1
a
Immediate values can be of 10 types:
-
Integers as decimals: {Digits} or -{Digits}
42
-2374683271468723648732648736498712634876147
And integers as Hexadecimals:: 0x{Hexdigits}0x0deadbeef0
-
Chain Objects. These are all addresses to different types of chain objects. Each address is a 256 bits number encoded in base58 with checksum with a prefix of "@" plus a type prefix followed by "_".
2a. Account Address: a base58c encoded number starting with @ak_ followed by a number of base58chars '@ak_nv5B93FPzRHrGNmMdTDfGdd5xGZvep3MVSpJqzcQmMp59bBCv`
2b. Contract address: @ct_{base58char}+
@ct_nv5B93FPzRHrGNmMdTDfGdd5xGZvep3MVSpJqzcQmMp59bBCv
2c. Oracle address: @ok_{base58char}+
@ok_nv5B93FPzRHrGNmMdTDfGdd5xGZvep3MVSpJqzcQmMp59bBCv
2d. Oracle query: @oq_{base58char}+
@oq_nv5B93FPzRHrGNmMdTDfGdd5xGZvep3MVSpJqzcQmMp59bBCv
2e. Channel address: @ch_{base58char}+
@ch_nv5B93FPzRHrGNmMdTDfGdd5xGZvep3MVSpJqzcQmMp59bBCv
-
Boolean true or false
true
false
-
Strings "{Characters}"
"Hello"
-
Map { Key => Value }
{}
{ 1 => { "foo" => true, "bar" => false}
-
Lists [ Elements ]
[]
[1, 2]
-
Bit field < Bits > or !< Bits >
<000>
<1010 1010>
<>
!<>
-
Tuples ( Elements )
()
(1, "foo")
-
Variants: (| [Arities] | Tag | ( Elements ) |)
(| [1,3,5,2] | 3 | ( "foo", 12) |)
-
Bytes: #{base64char}+
#AQIDCioLFQ==
-
Contract bytearray (code of another smart contract)
@cb_+PJGA6A4Fz4T2LHV5knITCldR3rqO7HrXO2zhOAR9JWNbhf8Q8C4xbhx/gx8JckANwAXfQBVACAAAP4vhlvZADcABwECgv5E1kQfADcBBzcACwAWMBReAHMAFjBvJFMAFjBvggOoFAAUABQSggABAz/+tIwWhAA3AAdTAAD+1jB5kAQ3AAcLAAD+6MRetgA3AQc3ABoGggABAz+4TS8GEQx8JclFY2FsbGVyX2lzX2NyZWF0b3IRL4Zb2Q1nZXQRRNZEHxFpbml0EbSMFoQdYmFsYW5jZRHWMHmQFXZhbHVlEejEXrYNc2V0gi8AhTQuMy4wAUqQ8s4=
Where
Digits: [0123456789]
Hexdigits: [0123456789abcdef]
base58char: [123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]
base64char: [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789+/=]
Characters: any printable ascii character 0..255 (except " no quoting yet)
Key: any value except for a map
Bits: 01 or space
Elements: Nothing or Value , Elements
Size: Digits (0 < Size < 256)
Tag: Digits (0 =< Tag < Size)