13 releases (4 breaking)

0.6.0 May 6, 2021
0.4.0 Apr 14, 2021
0.2.0 Mar 11, 2021
0.1.4 Mar 30, 2021
0.0.8 Dec 29, 2020

#47 in #rollup

31 downloads per month

MIT license

665KB
81 lines

Contains (ELF exe/lib, 330KB) build/validator_log, (ELF exe/lib, 310KB) build/generator, (ELF exe/lib, 315KB) build/generator_log, (ELF exe/lib, 325KB) build/validator

Godwoken polyjuice

An Ethereum compatible backend for Godwoken rollup framework. It include generator and validator implementations.

Features

  • All op codes
  • Value transfer
  • pre-compiled contracts
    • ecrecover
    • sha256hash
    • ripemd160hash
    • dataCopy
    • bigModExp
    • bn256AddIstanbul
    • bn256ScalarMulIstanbul
    • bn256PairingIstanbul (performance issue)
    • blake2F

Data Structures

Polyjuice arguments

header     : [u8; 8]  (header[0]    = 0xff, 
                       header[1]    = 0xff, 
                       header[2]    = 0xff, 
                       header[3..7] = "POLY"
                       header[7]    = call_kind { 0: CALL, 3: CREATE })
gas_limit  : u64      (little endian)
gas_price  : u128     (little endian)
value      : u128     (little endian)
input_size : u32      (little endian)
input_data : [u8; input_size]   (input data)

Every polyjuice argument fields must been serialized one by one and put into godwoken RawL2Transaction.args for polyjuice to read. If the input_data have 56 bytes, then the serialized data size is 8 + 8 + 16 + 16 + 4 + 56 = 108 bytes.

Creator account script

code_hash: polyjuice_validator_type_script_hash
hash_type: type
args:
    rollup_type_hash : [u8; 32]
    sudt_id          : u32          (little endian, the token id)

Polyjuice creator account is a godwoken account for creating polyjuice contract account. This account can only been created by meta contract, and the account id is used as the chain id in polyjuice. The sudt_id field in script args is the sudt token current polyjuice instance bind to.

Normal contract account script

code_hash: polyjuice_validator_type_script_hash
hash_type: type
args:
    rollup_type_hash   : [u8; 32]
    creator_account_id : u32        (little endian, also chain id, and for reading 'sudt_id' from creator account script)
    sender_account_id  : u32        (little endian)
    sender_nonce       : u32        (little endian)

The polyjuice contract account created in polyjuice by CREATE call kind or op code.

Create2 contract account script

code_hash: polyjuice_validator_type_script_hash
hash_type: type
args:
    rollup_type_hash   : [u8; 32]
    creator_account_id : u32        (little endian, also chain id, and for reading 'sudt_id' from creator account script)
    special_byte       : u8         (value is '0xff', refer to ethereum)
    sender_account_id  : u32        (little endian)
    create2_salt       : [u8; 32]   (create2 salt)
    init_code_hash     : [u8; 32]   (keccak256(init_code))

The polyjuice contract account created in polyjuice by CREATE2 op code.

Dependencies

~0.4–1.5MB
~19K SLoC