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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//! Contract interface trait definition.
//!
//! This module defines the `ContractInterface` trait which all contracts must implement.
use crateParameters;
use ;
/// Trait to implement for the contract building.
///
/// Contains all necessary methods to interact with the contract.
///
/// # Examples
///
/// Implementing `ContractInterface` on a type:
///
/// ```
/// # use freenet_stdlib::prelude::*;
/// struct Contract;
///
/// #[contract]
/// impl ContractInterface for Contract {
/// fn validate_state(
/// _parameters: Parameters<'static>,
/// _state: State<'static>,
/// _related: RelatedContracts
/// ) -> Result<ValidateResult, ContractError> {
/// Ok(ValidateResult::Valid)
/// }
///
/// fn update_state(
/// _parameters: Parameters<'static>,
/// state: State<'static>,
/// _data: Vec<UpdateData>,
/// ) -> Result<UpdateModification<'static>, ContractError> {
/// Ok(UpdateModification::valid(state))
/// }
///
/// fn summarize_state(
/// _parameters: Parameters<'static>,
/// _state: State<'static>,
/// ) -> Result<StateSummary<'static>, ContractError> {
/// Ok(StateSummary::from(vec![]))
/// }
///
/// fn get_state_delta(
/// _parameters: Parameters<'static>,
/// _state: State<'static>,
/// _summary: StateSummary<'static>,
/// ) -> Result<StateDelta<'static>, ContractError> {
/// Ok(StateDelta::from(vec![]))
/// }
/// }
/// ```
// ANCHOR: contractifce
/// # ContractInterface
///
/// This trait defines the core functionality for managing and updating a contract's state.
/// Implementations must ensure that the state merge operation is *associative*, *commutative*,
/// and *idempotent* — i.e. state forms an idempotent commutative monoid (a join-semilattice),
/// the same algebraic structure used by state-based CRDTs. In other words, when applying
/// multiple delta updates to a state, the order in which these updates are applied should not
/// affect the final state, and applying the same update more than once must not change the
/// result beyond its first application. Once all deltas are applied, the resulting state
/// should be the same, regardless of the order or repetition of application.
///
/// Implementations must also keep the delta negligible when the requesting peer's summary
/// shows it already holds this state: the delta must not contain that state, or approach
/// its size. See [`Self::get_state_delta`].
///
/// Noncompliant behavior, such as failing to obey the associativity, commutativity, or
/// idempotence rules, or returning a state-sized delta to a peer that is already up to date,
/// may result in the contract being deprioritized or removed from the p2p network.
// ANCHOR_END: contractifce