Skip to content

Commit 9c5ebb7

Browse files
committed
Check move reciprocity
1 parent f8ab642 commit 9c5ebb7

File tree

2 files changed

+106
-46
lines changed

2 files changed

+106
-46
lines changed

src/referee.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::common::types::{
2323
pub const REM_CONDITION_FIELDS: usize = 4;
2424

2525
#[derive(Debug, Clone)]
26-
pub struct RefereeMakerMoveResult {
26+
pub struct MyMoveWireData {
2727
pub puzzle_hash_for_unroll: PuzzleHash,
2828
pub move_made: Vec<u8>,
2929
/// sha256 of the concatenation of two hashes:
@@ -284,7 +284,7 @@ impl RefereeMaker {
284284
rng: &mut R,
285285
allocator: &mut AllocEncoder,
286286
readable_move: &ReadableMove,
287-
) -> Result<RefereeMakerMoveResult, Error> {
287+
) -> Result<MyMoveWireData, Error> {
288288
let new_entropy: Hash = rng.gen();
289289
let game_handler = {
290290
let current_state = self.current_state();
@@ -374,7 +374,7 @@ impl RefereeMaker {
374374
])
375375
.hash();
376376

377-
Ok(RefereeMakerMoveResult {
377+
Ok(MyMoveWireData {
378378
puzzle_hash_for_unroll: new_curried_referee_puzzle_hash,
379379
move_made: result.move_data.clone(),
380380
validation_info_hash,

src/tests/referee.rs

+103-43
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use rand::prelude::*;
44
use rand::SeedableRng;
55
use rand_chacha::ChaCha8Rng;
66

7+
use clvmr::NodePtr;
78
use clvm_tools_rs::classic::clvm_tools::binutils::{assemble, disassemble};
89

910
use crate::channel_handler::game_handler::GameHandler;
@@ -14,30 +15,61 @@ use crate::common::types::{
1415
};
1516
use crate::referee::RefereeMaker;
1617

17-
fn make_debug_game_handler(allocator: &mut AllocEncoder, amount: &Amount) -> GameHandler {
18+
struct DebugGamePrograms {
19+
my_validation_program: NodePtr,
20+
their_validation_program: NodePtr,
21+
my_turn_handler: GameHandler,
22+
their_turn_handler: GameHandler,
23+
}
24+
25+
fn make_debug_game_handler(allocator: &mut AllocEncoder, amount: &Amount) -> DebugGamePrograms {
1826
let debug_game_handler =
1927
read_hex_puzzle(allocator, "resources/debug_game_handler.hex").expect("should be readable");
2028
let game_handler_mod_hash = debug_game_handler.sha256tree(allocator);
21-
let aggsig = Aggsig::default();
22-
let curried_game_handler = CurriedProgram {
23-
program: debug_game_handler.clone(),
24-
args: clvm_curried_args!(
25-
(game_handler_mod_hash,
26-
(debug_game_handler,
27-
(amount.clone(),
28-
(true,
29-
(((), (aggsig, ())), ()) // slash info
30-
)
31-
)
32-
)
33-
)
34-
),
29+
let make_curried_game_handler = |my_turn: bool| {
30+
let aggsig = Aggsig::default();
31+
CurriedProgram {
32+
program: debug_game_handler.clone(),
33+
args: clvm_curried_args!(
34+
(game_handler_mod_hash.clone(),
35+
(debug_game_handler.clone(),
36+
(amount.clone(),
37+
(my_turn,
38+
(((), (aggsig, ())), ()) // slash info
39+
)
40+
)
41+
)
42+
)
43+
),
44+
}
3545
};
36-
GameHandler::my_driver_from_nodeptr(
37-
curried_game_handler
46+
47+
let my_turn_handler = GameHandler::my_driver_from_nodeptr(
48+
make_curried_game_handler(true)
3849
.to_clvm(allocator)
3950
.expect("should curry"),
40-
)
51+
);
52+
let my_validation_program = CurriedProgram {
53+
program: Node(my_turn_handler.to_nodeptr()),
54+
args: clvm_curried_args!(1337)
55+
}.to_clvm(allocator).expect("should curry");
56+
57+
let their_turn_handler = GameHandler::their_driver_from_nodeptr(
58+
make_curried_game_handler(false)
59+
.to_clvm(allocator)
60+
.expect("should curry"),
61+
);
62+
let their_validation_program = CurriedProgram {
63+
program: Node(their_turn_handler.to_nodeptr()),
64+
args: clvm_curried_args!(1337)
65+
}.to_clvm(allocator).expect("should curry");
66+
67+
DebugGamePrograms {
68+
my_validation_program,
69+
my_turn_handler,
70+
their_validation_program,
71+
their_turn_handler
72+
}
4173
}
4274

4375
#[test]
@@ -61,57 +93,84 @@ fn test_referee_smoke() {
6193

6294
let amount = Amount::new(100);
6395

64-
let debug_game_handler = make_debug_game_handler(&mut allocator, &amount);
65-
let validation_program = CurriedProgram {
66-
program: Node(debug_game_handler.to_nodeptr()),
67-
args: clvm_curried_args!(1337)
68-
}.to_clvm(&mut allocator).expect("should curry");
96+
let debug_game = make_debug_game_handler(&mut allocator, &amount);
6997
let init_state =
7098
assemble(
7199
allocator.allocator(),
72100
"(0 . 0)"
73101
).expect("should assemble");
74102

75-
let validation_program_hash = Node(validation_program).sha256tree(&mut allocator);
103+
let my_validation_program_hash =
104+
Node(debug_game.my_validation_program).sha256tree(&mut allocator);
76105

77106
let amount = Amount::new(100);
78-
let game_start_info = GameStartInfo {
107+
let my_game_start_info = GameStartInfo {
79108
game_id: GameID::from_bytes(b"test"),
80109
amount: amount.clone(),
81-
game_handler: debug_game_handler,
110+
game_handler: debug_game.my_turn_handler,
82111
timeout: Timeout::new(1000),
83112
is_my_turn: true,
84-
initial_validation_puzzle: validation_program,
85-
initial_validation_puzzle_hash: validation_program_hash,
113+
initial_validation_puzzle: debug_game.my_validation_program,
114+
initial_validation_puzzle_hash: my_validation_program_hash,
86115
initial_state: init_state,
87116
initial_move: vec![0, 0],
88117
initial_max_move_size: 0,
89118
initial_mover_share: Amount::default(),
90119
};
120+
91121
let mut referee = RefereeMaker::new(
92122
&mut allocator,
93123
referee_coin_puzzle_hash.clone(),
94-
&game_start_info,
124+
&my_game_start_info,
95125
&my_private_key,
96126
&their_puzzle_hash,
97127
1,
98128
)
99129
.expect("should construct");
130+
131+
let their_validation_program_hash =
132+
Node(debug_game.their_validation_program).sha256tree(&mut allocator);
133+
134+
let their_game_start_info = GameStartInfo {
135+
game_id: GameID::from_bytes(b"test"),
136+
amount: amount.clone(),
137+
game_handler: debug_game.their_turn_handler,
138+
timeout: Timeout::new(1000),
139+
is_my_turn: false,
140+
initial_validation_puzzle: debug_game.their_validation_program,
141+
initial_validation_puzzle_hash: their_validation_program_hash,
142+
initial_state: init_state,
143+
initial_move: vec![0, 0],
144+
initial_max_move_size: 0,
145+
initial_mover_share: Amount::default(),
146+
};
147+
148+
let mut their_referee = RefereeMaker::new(
149+
&mut allocator,
150+
referee_coin_puzzle_hash,
151+
&their_game_start_info,
152+
&their_private_key,
153+
&my_puzzle_hash,
154+
1,
155+
)
156+
.expect("should construct");
157+
100158
referee.enable_debug_run(true);
101159
let readable_move = assemble(allocator.allocator(), "(0 . 0)").expect("should assemble");
102-
let my_move_result = referee
160+
let my_move_wire_data = referee
103161
.my_turn_make_move(
104162
&mut rng,
105163
&mut allocator,
106164
&ReadableMove::from_nodeptr(readable_move),
107165
)
108166
.expect("should move");
109-
assert!(my_move_result.move_made.is_empty());
167+
168+
assert!(my_move_wire_data.move_made.is_empty());
110169
let mut off_chain_slash_gives_error = referee.clone();
111170
let their_move_result = off_chain_slash_gives_error.their_turn_move_off_chain(
112171
&mut allocator,
113172
&[1],
114-
&my_move_result.validation_info_hash,
173+
&my_move_wire_data.validation_info_hash,
115174
100,
116175
&Amount::default(),
117176
);
@@ -123,13 +182,22 @@ fn test_referee_smoke() {
123182
assert!(false);
124183
}
125184

126-
let on_chain_cheat = referee.clone();
185+
let their_move_wire_data = their_referee.their_turn_move_off_chain(
186+
&mut allocator,
187+
&my_move_wire_data.move_made,
188+
&my_move_wire_data.validation_info_hash,
189+
my_move_wire_data.max_move_size,
190+
&my_move_wire_data.mover_share
191+
).expect("should move");
192+
193+
eprintln!("their_move_wire_data {their_move_wire_data:?}");
127194

195+
assert!(!referee.is_my_turn);
128196
let their_move_result = referee
129197
.their_turn_move_off_chain(
130198
&mut allocator,
131199
&[],
132-
&my_move_result.validation_info_hash,
200+
&my_move_wire_data.validation_info_hash,
133201
100,
134202
&Amount::default(),
135203
)
@@ -139,13 +207,5 @@ fn test_referee_smoke() {
139207
disassemble(allocator.allocator(), their_move_result.readable_move, None),
140208
"(())"
141209
);
142-
143-
let mut their_referee = RefereeMaker::new(
144-
&mut allocator,
145-
referee_coin_puzzle_hash,
146-
&game_start_info,
147-
&their_private_key,
148-
&their_puzzle_hash,
149-
1,
150-
);
210+
assert!(referee.is_my_turn);
151211
}

0 commit comments

Comments
 (0)