/godwoken-polyjuice

polyjuice for godwoken

Primary LanguageC

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.

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)
    info_data_hash     : [u8; 20]   (The information to be hashed is depend on how the account been created: [normal, create2], 
                                      the 20 bytes value is keccak256(info_data)[12..])

Normal contract account script

info_content:
    sender_address  : [u8; 20]   (the msg.sender: blake128(sender_script) + account id)
    sender_nonce    : u32 
    
info_data: rlp_encode(sender_address, sender_nonce)

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

Create2 contract account script

info_data:
    special_byte    : u8         (value is '0xff', refer to ethereum)
    sender_address  : [u8; 20]   (the msg.sender: blake128(sender_script) + account id)
    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.

Address used in polyjuice

The calculate method of contract eth address is the same as the method in Ethereum, the data is equals to contract_script.args[36..56].

The EoA eth address is:

blake128(account_script) + account_id