Skip to content

Commit 366c548

Browse files
committed
main stf skeleton
1 parent 5922564 commit 366c548

File tree

1 file changed

+60
-8
lines changed

1 file changed

+60
-8
lines changed

src/state_transition/state_transition.zig

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const Slot = ssz.primitive.Slot.Type;
99

1010
const CachedBeaconStateAllForks = @import("cache/state_cache.zig").CachedBeaconStateAllForks;
1111
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;
1215
const BeaconBlock = @import("types/beacon_block.zig").BeaconBlock;
1316
const BlindedBeaconBlock = @import("types/beacon_block.zig").BlindedBeaconBlock;
1417
const SignedBlindedBeaconBlock = @import("types/beacon_block.zig").SignedBlindedBeaconBlock;
@@ -35,7 +38,7 @@ pub const SignedBlock = union(enum) {
3538
signed_beacon_block: *const SignedBeaconBlock,
3639
signed_blinded_beacon_block: *const SignedBlindedBeaconBlock,
3740

38-
fn getMessage(self: *const SignedBlock) Block {
41+
pub fn getMessage(self: *const SignedBlock) Block {
3942
return switch (self.*) {
4043
.signed_beacon_block => |b| Block{ .block = b.getBeaconBlock() },
4144
.signed_blinded_beacon_block => |b| Block{ .blinded_block = b.getBeaconBlock() },
@@ -87,21 +90,70 @@ pub fn stateTransition(
8790
allocator: std.mem.Allocator,
8891
state: *CachedBeaconStateAllForks,
8992
signed_block: SignedBlock,
90-
options: Options,
93+
opts: Options,
9194
) !*CachedBeaconStateAllForks {
92-
_ = options;
93-
94-
//TODO(bing): deep clone
95-
// const post_state = state.clone();
96-
//
97-
const post_state = state;
9895
const block = signed_block.getMessage();
9996
const block_slot = switch (block) {
10097
.block => |b| b.getSlot(),
10198
.blinded_block => |b| b.getSlot(),
10299
};
103100

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+
104110
try processSlotsWithTransientCache(allocator, post_state, block_slot, .{});
105111

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+
106158
return state;
107159
}

0 commit comments

Comments
 (0)