1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use crate::prelude::*;
/// Locks the local chain to commence a countersigning session.
/// The `PreflightRequestAcceptance` MUST be sent back to the session initiator
/// so that the corresponding entry can be built for everyone to sign.
/// This function MUST be called by every signer in the signing session.
/// It doesn't matter how, although concurrent remote calls are probably the
/// simplest mechanism to distribute and accept preflight requests before the
/// session times out.
pub fn accept_countersigning_preflight_request(
preflight_request: PreflightRequest,
) -> ExternResult<PreflightRequestAcceptance> {
// Host should:
// - Check system constraints on request
// - Freeze chain for session end
// - Build response
HDK.with(|h| {
h.borrow()
.accept_countersigning_preflight_request(preflight_request)
})
}
/// Wrapper function around `sys_time` to build `CounterSigningSessionTimes`.
/// These session times are included in the `PreflightRequest` and bound the
/// countersigning session temporally.
/// This function starts the session "now" in the opinion of the session
/// initiator and ends it after `ms` milliseconds relative to "now".
/// The countersigning parties will check these times as part of accepting the
/// preflight request so all system clocks need to be roughly aligned and the
/// ambient network latency must fit comfortably within the session duration.
pub fn session_times_from_millis(ms: u64) -> ExternResult<CounterSigningSessionTimes> {
let start = sys_time()?;
let end = start + core::time::Duration::from_millis(ms);
CounterSigningSessionTimes::try_new(start, end.map_err(|e| WasmError::Guest(e.to_string()))?)
.map_err(|e| WasmError::Guest(e.to_string()))
}