|
| 1 | +# Tasks |
| 2 | + |
| 3 | +## Transient perspective and columns |
| 4 | + |
| 5 | +- `PEEK_AT_TRANSIENT ≡ TRN` |
| 6 | + - it can only be on during `TX_EXEC` |
| 7 | +- transient columns |
| 8 | + ```rust |
| 9 | + transient/ADDRESS_HI |
| 10 | + transient/ADDRESS_LO |
| 11 | + transient/STORAGE_KEY_HI |
| 12 | + transient/STORAGE_KEY_LO |
| 13 | + transient/VALUE_CURR_HI |
| 14 | + transient/VALUE_CURR_LO |
| 15 | + transient/VALUE_NEXT_HI |
| 16 | + transient/VALUE_NEXT_LO |
| 17 | + ``` |
| 18 | +- macros |
| 19 | + ```rust |
| 20 | + sameTransientStorageValue[ relof ] |
| 21 | + undoTransientStorageValueUpdate[ relof_undo, relof_do ] |
| 22 | + ``` |
| 23 | + |
| 24 | +## Instruction handling |
| 25 | + |
| 26 | +- updating the storage family |
| 27 | + - flags, including staticFlag |
| 28 | + - decoded flags |
| 29 | +- processing |
| 30 | + - acceptable exceptions |
| 31 | + - exceptions: |
| 32 | + - SUX |
| 33 | + - OOGX |
| 34 | + ```rust |
| 35 | + STACK |
| 36 | + ``` |
| 37 | + - STATICX (TSTORE only) |
| 38 | + ```rust |
| 39 | + STACK |
| 40 | + CONTEXT |
| 41 | + ``` |
| 42 | + - unexceptional WILL_REVERT |
| 43 | + ```rust |
| 44 | + STACK |
| 45 | + CONTEXT |
| 46 | + TRANSIENT // doing |
| 47 | + TRANSIENT // undoing |
| 48 | + ``` |
| 49 | + - unexceptional WONT_REVERT |
| 50 | + ```rust |
| 51 | + STACK |
| 52 | + CONTEXT |
| 53 | + TRANSIENT // doing |
| 54 | + ``` |
| 55 | + - starting with `STATICX` we check whether the context is static |
| 56 | + - as soon as unexceptional we also retrieve the `context/ACCOUNT_ADDRESS` |
| 57 | + - just as with `SLOAD` we don't print anything on the stack unless the instruction is unexceptional |
| 58 | + - contrary to `SSTORE` / `SLOAD` we don't have to read storage to price it, in particular we don't need to retrieve transient storage data and play with warmth |
| 59 | + - if `CN_WILL_REVERT` we require two rows for `TSTORE` |
| 60 | + |
| 61 | +## Consistency arguments |
| 62 | + |
| 63 | +- permutation according to |
| 64 | +```rust |
| 65 | +( |
| 66 | + // order imposing columns |
| 67 | + + PEEK_AT_TRANSIENT, |
| 68 | + + ABSOLUTE_TRANSACTION_NUMBER, |
| 69 | + + transient/ADDRESS_HI, |
| 70 | + + transient/ADDRESS_LO, |
| 71 | + + transient/STORAGE_KEY_HI, |
| 72 | + + transient/STORAGE_KEY_LO, |
| 73 | + + DOM_STAMP, |
| 74 | + - SUB_STAMP, |
| 75 | + // along for the ride |
| 76 | + transient/VALUE_CURR_HI, |
| 77 | + transient/VALUE_CURR_LO, |
| 78 | + transient/VALUE_NEXT_HI, |
| 79 | + transient/VALUE_NEXT_LO, |
| 80 | +) |
| 81 | +``` |
| 82 | +- extraneous columns |
| 83 | +```rust |
| 84 | +// tcp ≡ transient consistency permutation |
| 85 | +tcp_FIRST_IN_TXN |
| 86 | +tcp_AGAIN_IN_TXN |
| 87 | +// no ``tcp_FINAL_IN_TXN'' column required |
| 88 | +``` |
| 89 | +- constraints |
| 90 | + - standard constraints for FIRST/AGAIN |
| 91 | + - consistency is trivial: FIRST you have zero, when when meeting an [ADDRESS,STORAGE_KEY] pair AGAIN you get the previously updated value |
0 commit comments