@@ -9,6 +9,9 @@ const Slot = ssz.primitive.Slot.Type;
9
9
10
10
const CachedBeaconStateAllForks = @import ("cache/state_cache.zig" ).CachedBeaconStateAllForks ;
11
11
pub const SignedBeaconBlock = @import ("types/beacon_block.zig" ).SignedBeaconBlock ;
12
+ const verifyProposerSignature = @import ("./signature_sets/proposer.zig" ).verifyProposerSignature ;
13
+ const processBlock = @import ("./block/process_block.zig" ).processBlock ;
14
+ const BlockExternalData = @import ("./block/external_data.zig" ).BlockExternalData ;
12
15
const BeaconBlock = @import ("types/beacon_block.zig" ).BeaconBlock ;
13
16
const BlindedBeaconBlock = @import ("types/beacon_block.zig" ).BlindedBeaconBlock ;
14
17
const SignedBlindedBeaconBlock = @import ("types/beacon_block.zig" ).SignedBlindedBeaconBlock ;
@@ -35,7 +38,7 @@ pub const SignedBlock = union(enum) {
35
38
signed_beacon_block : * const SignedBeaconBlock ,
36
39
signed_blinded_beacon_block : * const SignedBlindedBeaconBlock ,
37
40
38
- fn getMessage (self : * const SignedBlock ) Block {
41
+ pub fn getMessage (self : * const SignedBlock ) Block {
39
42
return switch (self .* ) {
40
43
.signed_beacon_block = > | b | Block { .block = b .getBeaconBlock () },
41
44
.signed_blinded_beacon_block = > | b | Block { .blinded_block = b .getBeaconBlock () },
@@ -87,21 +90,70 @@ pub fn stateTransition(
87
90
allocator : std.mem.Allocator ,
88
91
state : * CachedBeaconStateAllForks ,
89
92
signed_block : SignedBlock ,
90
- options : Options ,
93
+ opts : Options ,
91
94
) ! * CachedBeaconStateAllForks {
92
- _ = options ;
93
-
94
- //TODO(bing): deep clone
95
- // const post_state = state.clone();
96
- //
97
- const post_state = state ;
98
95
const block = signed_block .getMessage ();
99
96
const block_slot = switch (block ) {
100
97
.block = > | b | b .getSlot (),
101
98
.blinded_block = > | b | b .getSlot (),
102
99
};
103
100
101
+ //TODO(bing): deep clone
102
+ // const post_state = state.clone();
103
+ const post_state = state ;
104
+
105
+ //TODO(bing): metrics
106
+ //if (metrics) {
107
+ // onStateCloneMetrics(postState, metrics, StateCloneSource.stateTransition);
108
+ //}
109
+
104
110
try processSlotsWithTransientCache (allocator , post_state , block_slot , .{});
105
111
112
+ // Verify proposer signature only
113
+ if (opts .verify_proposer and ! verifyProposerSignature (post_state , & signed_block )) {
114
+ return error .InvalidBlockSignature ;
115
+ }
116
+
117
+ // // Note: time only on success
118
+ // const processBlockTimer = metrics?.processBlockTime.startTimer();
119
+ //
120
+ processBlock (
121
+ allocator ,
122
+ post_state ,
123
+ block ,
124
+ BlockExternalData {},
125
+ .{},
126
+ );
127
+ //
128
+ // TODO(bing): commit
129
+ // const processBlockCommitTimer = metrics?.processBlockCommitTime.startTimer();
130
+ // postState.commit();
131
+ // processBlockCommitTimer?.();
132
+
133
+ // // Note: time only on success. Include processBlock and commit
134
+ // processBlockTimer?.();
135
+ // TODO(bing): metrics
136
+ // if (metrics) {
137
+ // onPostStateMetrics(postState, metrics);
138
+ // }
139
+
140
+ // Verify state root
141
+ if (opts .verify_state_root ) {
142
+ var out : [32 ]u8 = undefined ;
143
+ // const hashTreeRootTimer = metrics?.stateHashTreeRootTime.startTimer({
144
+ // source: StateHashTreeRootSource.stateTransition,
145
+ // });
146
+ try post_state .state .hashTreeRoot (allocator , & out );
147
+ // hashTreeRootTimer?.();
148
+
149
+ const block_state_root = switch (block ) {
150
+ .block = > | b | b .getStateRoot (),
151
+ .blinded_block = > | b | b .getStateRoot (),
152
+ };
153
+ if (! std .mem .eql (u8 , & out , block_state_root )) {
154
+ return error .InvalidStateRoot ;
155
+ }
156
+ }
157
+
106
158
return state ;
107
159
}
0 commit comments