Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Module 0x1::decryption

This module provides a decryption key unique to every block. This resource is updated in every block prologue. The decryption key is the key used to decrypt the encrypted transactions in the block.

use 0x1::config_buffer;
use 0x1::option;
use 0x1::system_addresses;

Resource PerBlockDecryptionKey

Decryption key unique to every block. This resource is updated in every block prologue.

struct PerBlockDecryptionKey has drop, key
Fields
epoch: u64
round: u64
decryption_key: option::Option<vector<u8>>

Resource PerEpochEncryptionKey

Encryption key derived from the DKG result, valid for one epoch.

struct PerEpochEncryptionKey has drop, store, key
Fields
epoch: u64
encryption_key: option::Option<vector<u8>>

Function initialize

Called during genesis initialization.

public fun initialize(framework: &signer)
Implementation
public fun initialize(framework: &signer) {
    system_addresses::assert_aptos_framework(framework);
    if (!exists<PerBlockDecryptionKey>(@aptos_framework)) {
        move_to(
            framework,
            PerBlockDecryptionKey { epoch: 0, round: 0, decryption_key: option::none() }
        );
    };
    if (!exists<PerEpochEncryptionKey>(@aptos_framework)) {
        move_to(
            framework,
            PerEpochEncryptionKey { epoch: 0, encryption_key: option::none() }
        );
    }
}

Function on_new_block

Invoked in block prologues to update the block decryption key.

public(friend) fun on_new_block(vm: &signer, epoch: u64, round: u64, decryption_key_for_new_block: option::Option<vector<u8>>)
Implementation
public(friend) fun on_new_block(
    vm: &signer,
    epoch: u64,
    round: u64,
    decryption_key_for_new_block: Option<vector<u8>>
) acquires PerBlockDecryptionKey {
    system_addresses::assert_vm(vm);
    if (exists<PerBlockDecryptionKey>(@aptos_framework)) {
        let decryption_key =
            borrow_global_mut<PerBlockDecryptionKey>(@aptos_framework);
        decryption_key.epoch = epoch;
        decryption_key.round = round;
        decryption_key.decryption_key = decryption_key_for_new_block;
    }
}

Function set_for_next_epoch

Buffer the encryption key for the next epoch.

public(friend) fun set_for_next_epoch(epoch: u64, encryption_key: vector<u8>)
Implementation
public(friend) fun set_for_next_epoch(epoch: u64, encryption_key: vector<u8>) {
    config_buffer::upsert(PerEpochEncryptionKey {
        epoch,
        encryption_key: option::some(encryption_key)
    });
}

Function on_new_epoch

Apply buffered PerEpochEncryptionKey on epoch transition.

public(friend) fun on_new_epoch(framework: &signer)
Implementation
public(friend) fun on_new_epoch(framework: &signer) acquires PerEpochEncryptionKey {
    system_addresses::assert_aptos_framework(framework);
    if (config_buffer::does_exist<PerEpochEncryptionKey>()) {
        let new_key = config_buffer::extract_v2<PerEpochEncryptionKey>();
        if (exists<PerEpochEncryptionKey>(@aptos_framework)) {
            *borrow_global_mut<PerEpochEncryptionKey>(@aptos_framework) = new_key;
        } else {
            move_to(framework, new_key);
        }
    }
}