github.com/mavryk-network/mvgo@v1.19.9/codec/smart_rollup_refute.go (about)

     1  // Copyright (c) 2023 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc
     3  
     4  package codec
     5  
     6  import (
     7  	"bytes"
     8  
     9  	"github.com/mavryk-network/mvgo/mavryk"
    10  	// "encoding/binary"
    11  	// "io"
    12  	// "strconv"
    13  )
    14  
    15  // Smart_rollup_refute (tag 204)
    16  // =============================
    17  
    18  // | Name          | Size                 | Contents               |
    19  // +===============+======================+========================+
    20  // | Tag           | 1 byte               | unsigned 8-bit integer |
    21  // | source        | 21 bytes             | $public_key_hash       |
    22  // | fee           | Determined from data | $N.t                   |
    23  // | counter       | Determined from data | $N.t                   |
    24  // | gas_limit     | Determined from data | $N.t                   |
    25  // | storage_limit | Determined from data | $N.t                   |
    26  // | rollup        | 20 bytes             | bytes                  |
    27  // | opponent      | 21 bytes             | $public_key_hash       |
    28  // | refutation    | Determined from data | $X_24                  |
    29  
    30  // X_20 (Determined from data, 8-bit tag)
    31  // **************************************
    32  
    33  // raw data proof (tag 0)
    34  // ======================
    35  
    36  // | Name                  | Size     | Contents                |
    37  // +=======================+==========+=========================+
    38  // | Tag                   | 1 byte   | unsigned 8-bit integer  |
    39  // | # bytes in next field | 2 bytes  | unsigned 16-bit integer |
    40  // | raw_data              | Variable | bytes                   |
    41  
    42  // metadata proof (tag 1)
    43  // ======================
    44  
    45  // | Name | Size   | Contents               |
    46  // +======+========+========================+
    47  // | Tag  | 1 byte | unsigned 8-bit integer |
    48  
    49  // X_21 (Determined from data, 8-bit tag)
    50  // **************************************
    51  
    52  // inbox proof (tag 0)
    53  // ===================
    54  
    55  // | Name                  | Size                 | Contents                |
    56  // +=======================+======================+=========================+
    57  // | Tag                   | 1 byte               | unsigned 8-bit integer  |
    58  // | level                 | 4 bytes              | signed 32-bit integer   |
    59  // | message_counter       | Determined from data | $N.t                    |
    60  // | # bytes in next field | 4 bytes              | unsigned 30-bit integer |
    61  // | serialized_proof      | Variable             | bytes                   |
    62  
    63  // reveal proof (tag 1)
    64  // ====================
    65  
    66  // | Name         | Size                 | Contents               |
    67  // +==============+======================+========================+
    68  // | Tag          | 1 byte               | unsigned 8-bit integer |
    69  // | reveal_proof | Determined from data | $X_20                  |
    70  
    71  // first input (tag 2)
    72  // ===================
    73  
    74  // | Name | Size   | Contents               |
    75  // +======+========+========================+
    76  // | Tag  | 1 byte | unsigned 8-bit integer |
    77  
    78  // X_22
    79  // ****
    80  
    81  // | Name                        | Size                 | Contents                            |
    82  // +=============================+======================+=====================================+
    83  // | ? presence of field "state" | 1 byte               | boolean (0 for false, 255 for true) |
    84  // | state                       | 32 bytes             | bytes                               |
    85  // | tick                        | Determined from data | $N.t                                |
    86  
    87  // X_23 (Determined from data, 8-bit tag)
    88  // **************************************
    89  
    90  // Dissection (tag 0)
    91  // ==================
    92  
    93  // | Name                  | Size     | Contents                |
    94  // +=======================+==========+=========================+
    95  // | Tag                   | 1 byte   | unsigned 8-bit integer  |
    96  // | # bytes in next field | 4 bytes  | unsigned 30-bit integer |
    97  // | Unnamed field 0       | Variable | sequence of $X_22       |
    98  
    99  // Proof (tag 1)
   100  // =============
   101  
   102  // | Name                              | Size                 | Contents                            |
   103  // +===================================+======================+=====================================+
   104  // | Tag                               | 1 byte               | unsigned 8-bit integer              |
   105  // | # bytes in next field             | 4 bytes              | unsigned 30-bit integer             |
   106  // | pvm_step                          | Variable             | bytes                               |
   107  // | ? presence of field "input_proof" | 1 byte               | boolean (0 for false, 255 for true) |
   108  // | input_proof                       | Determined from data | $X_21                               |
   109  
   110  // X_24 (Determined from data, 8-bit tag)
   111  // **************************************
   112  
   113  // Start (tag 0)
   114  // =============
   115  
   116  // | Name                     | Size     | Contents               |
   117  // +==========================+==========+========================+
   118  // | Tag                      | 1 byte   | unsigned 8-bit integer |
   119  // | player_commitment_hash   | 32 bytes | bytes                  |
   120  // | opponent_commitment_hash | 32 bytes | bytes                  |
   121  
   122  // Move (tag 1)
   123  // ============
   124  
   125  // | Name   | Size                 | Contents               |
   126  // +========+======================+========================+
   127  // | Tag    | 1 byte               | unsigned 8-bit integer |
   128  // | choice | Determined from data | $N.t                   |
   129  // | step   | Determined from data | $X_23                  |
   130  
   131  // SmartRollupRefute represents "smart_rollup_refute" operation
   132  type SmartRollupRefute struct {
   133  	Manager
   134  	Rollup     mavryk.Address        `json:"rollup"`
   135  	Opponent   mavryk.Address        `json:"opponent"`
   136  	Refutation SmartRollupRefutation `json:"refutation"`
   137  }
   138  
   139  type SmartRollupRefutation struct {
   140  	Kind         string                       `json:"refutation_kind"`
   141  	PlayerHash   mavryk.SmartRollupCommitHash `json:"player_commitment_hash"`
   142  	OpponentHash mavryk.SmartRollupCommitHash `json:"opponent_commitment_hash"`
   143  	Choice       mavryk.Z                     `json:"choice"`
   144  	Step         SmartRollupRefuteStep        `json:"step"`
   145  }
   146  
   147  type SmartRollupRefuteStep struct {
   148  	Ticks []SmartRollupTick
   149  	Proof *SmartRollupProof
   150  }
   151  
   152  type SmartRollupProof struct {
   153  	PvmStep    mavryk.HexBytes       `json:"pvm_step"`
   154  	InputProof SmartRollupInputProof `json:"input_proof"`
   155  }
   156  
   157  type SmartRollupTick struct {
   158  	State mavryk.SmartRollupStateHash `json:"state"`
   159  	Tick  mavryk.Z                    `json:"tick"`
   160  }
   161  
   162  type SmartRollupInputProof struct {
   163  	Kind    string          `json:"input_proof_kind"`
   164  	Level   int64           `json:"level"`
   165  	Counter mavryk.Z        `json:"message_counter"`
   166  	Proof   mavryk.HexBytes `json:"serialized_proof"`
   167  }
   168  
   169  func (o SmartRollupRefute) Kind() mavryk.OpType {
   170  	return mavryk.OpTypeSmartRollupRefute
   171  }
   172  
   173  func (o SmartRollupRefute) MarshalJSON() ([]byte, error) {
   174  	buf := bytes.NewBuffer(nil)
   175  	// TODO if needed
   176  	return buf.Bytes(), nil
   177  }
   178  
   179  func (o SmartRollupRefute) EncodeBuffer(buf *bytes.Buffer, p *mavryk.Params) error {
   180  	buf.WriteByte(o.Kind().TagVersion(p.OperationTagsVersion))
   181  	o.Manager.EncodeBuffer(buf, p)
   182  	// TODO if needed
   183  	return nil
   184  }
   185  
   186  func (o *SmartRollupRefute) DecodeBuffer(buf *bytes.Buffer, p *mavryk.Params) (err error) {
   187  	if err = ensureTagAndSize(buf, o.Kind(), p.OperationTagsVersion); err != nil {
   188  		return
   189  	}
   190  	if err = o.Manager.DecodeBuffer(buf, p); err != nil {
   191  		return
   192  	}
   193  	// TODO if needed
   194  	return
   195  }
   196  
   197  func (o SmartRollupRefute) MarshalBinary() ([]byte, error) {
   198  	buf := bytes.NewBuffer(nil)
   199  	err := o.EncodeBuffer(buf, mavryk.DefaultParams)
   200  	return buf.Bytes(), err
   201  }
   202  
   203  func (o *SmartRollupRefute) UnmarshalBinary(data []byte) error {
   204  	return o.DecodeBuffer(bytes.NewBuffer(data), mavryk.DefaultParams)
   205  }