@@ -15,144 +15,43 @@ pub mod pattern;
15
15
pub mod types;
16
16
pub mod value;
17
17
18
- use std:: { collections :: HashMap , path :: Path , sync:: Arc } ;
18
+ use std:: sync:: Arc ;
19
19
20
- use named:: { ConstructExt , Named } ;
21
- use pest:: Parser ;
22
- use pest_derive:: Parser ;
23
- use simplicity:: {
24
- dag:: { NoSharing , PostOrderIterItem } ,
25
- jet:: Elements ,
26
- node:: { Commit , Converter , Inner , Node , Redeem , RedeemData } ,
27
- BitIter , CommitNode , RedeemNode ,
28
- } ;
20
+ use named:: ConstructExt ;
21
+ use simplicity:: { dag:: NoSharing , jet:: Elements , node:: Redeem , CommitNode , RedeemNode } ;
29
22
30
23
pub extern crate simplicity;
31
24
pub use simplicity:: elements;
25
+ use simplicity:: node:: SimpleFinalizer ;
32
26
33
- use crate :: {
34
- error:: { RichError , WithFile } ,
35
- named:: { NamedCommitNode , NamedExt } ,
36
- parse:: PestParse ,
37
- } ;
27
+ use crate :: { error:: WithFile , named:: NamedExt } ;
38
28
39
- #[ derive( Parser ) ]
40
- #[ grammar = "minimal.pest" ]
41
- pub struct IdentParser ;
42
-
43
- pub fn _compile ( file : & Path ) -> Result < Arc < Node < Named < Commit < Elements > > > > , String > {
44
- let file = Arc :: from ( std:: fs:: read_to_string ( file) . unwrap ( ) ) ;
45
- let parse_program = IdentParser :: parse ( Rule :: program, & file)
46
- . map_err ( RichError :: from)
47
- . and_then ( |mut pairs| parse:: Program :: parse ( pairs. next ( ) . unwrap ( ) ) )
48
- . with_file ( file. clone ( ) ) ?;
49
- let ast_program = ast:: Program :: analyze ( & parse_program) . with_file ( file. clone ( ) ) ?;
50
- let simplicity_named_commit = ast_program. compile ( ) . with_file ( file. clone ( ) ) ?;
51
- let simplicity_redeem = simplicity_named_commit
29
+ pub fn compile ( prog_text : & str ) -> Result < Arc < CommitNode < Elements > > , String > {
30
+ let parse_program = parse:: Program :: parse ( prog_text) ?;
31
+ let ast_program = ast:: Program :: analyze ( & parse_program) . with_file ( prog_text) ?;
32
+ let simplicity_named_construct = ast_program. compile ( ) . with_file ( prog_text) ?;
33
+ let simplicity_named_commit = simplicity_named_construct
52
34
. finalize_types_main ( )
53
- . expect ( "Type check error" ) ;
54
- Ok ( simplicity_redeem)
55
- }
56
-
57
- pub fn compile ( file : & Path ) -> Result < CommitNode < Elements > , String > {
58
- let simplicity_named_commit = _compile ( file) ?;
59
- Ok ( Arc :: try_unwrap ( simplicity_named_commit. to_commit_node ( ) ) . unwrap ( ) )
35
+ . expect ( "Failed to set program source and target type to unit" ) ;
36
+ Ok ( simplicity_named_commit. to_commit_node ( ) )
60
37
}
61
38
62
- pub fn satisfy ( prog : & Path , wit_file : & Path ) -> Result < RedeemNode < Elements > , String > {
63
- #[ derive( serde:: Serialize , serde:: Deserialize ) ]
64
- #[ serde( transparent) ]
65
- struct WitFileData {
66
- map : HashMap < String , String > ,
67
- }
68
-
69
- impl Converter < Named < Commit < Elements > > , Redeem < Elements > > for WitFileData {
70
- type Error = std:: convert:: Infallible ;
71
-
72
- fn convert_witness (
73
- & mut self ,
74
- data : & PostOrderIterItem < & NamedCommitNode > ,
75
- _witness : & <Named < Commit < Elements > > as simplicity:: node:: Marker >:: Witness ,
76
- ) -> Result < <Redeem < Elements > as simplicity:: node:: Marker >:: Witness , Self :: Error > {
77
- let key = data. node . name ( ) ;
78
- let ty = & data. node . arrow ( ) . target ;
79
- match self . map . get ( key. as_ref ( ) ) {
80
- Some ( wit) => {
81
- let bytes: Vec < u8 > = hex_conservative:: FromHex :: from_hex ( wit) . unwrap ( ) ;
82
- let total_bit_len = bytes. len ( ) * 8 ;
83
- let mut bit_iter = BitIter :: new ( bytes. into_iter ( ) ) ;
84
- let value = bit_iter. read_value ( & data. node . arrow ( ) . target ) ;
85
- let v = match value {
86
- Ok ( v) => v,
87
- Err ( e) => panic ! ( "Error reading witness: {:?}" , e) ,
88
- } ;
89
- // TODO: Make sure that remaining iterator is empty or all zeros till the specified remaining len.
90
- let bit_len = ty. bit_width ( ) ;
91
- let remaining = total_bit_len - bit_len;
92
- assert ! ( remaining < 8 ) ;
93
- for _ in 0 ..remaining {
94
- assert ! ( !bit_iter. next( ) . unwrap( ) ) ;
95
- }
96
- assert ! ( bit_iter. next( ) . is_none( ) ) ;
97
- Ok ( v)
98
- }
99
- None => panic ! ( "Value not found{}" , key) ,
100
- }
101
- }
102
-
103
- fn convert_disconnect (
104
- & mut self ,
105
- _data : & PostOrderIterItem < & NamedCommitNode > ,
106
- _maybe_converted : Option < & Arc < simplicity:: node:: Node < Redeem < Elements > > > > ,
107
- _disconnect : & <Named < Commit < Elements > > as simplicity:: node:: Marker >:: Disconnect ,
108
- ) -> Result < <Redeem < Elements > as simplicity:: node:: Marker >:: Disconnect , Self :: Error >
109
- {
110
- todo ! ( )
111
- }
112
-
113
- fn convert_data (
114
- & mut self ,
115
- data : & PostOrderIterItem < & NamedCommitNode > ,
116
- inner : Inner <
117
- & Arc < simplicity:: node:: Node < Redeem < Elements > > > ,
118
- <Redeem < Elements > as simplicity:: node:: Marker >:: Jet ,
119
- & <Redeem < Elements > as simplicity:: node:: Marker >:: Disconnect ,
120
- & <Redeem < Elements > as simplicity:: node:: Marker >:: Witness ,
121
- > ,
122
- ) -> Result < <Redeem < Elements > as simplicity:: node:: Marker >:: CachedData , Self :: Error >
123
- {
124
- let converted_data = inner
125
- . map ( |node| node. cached_data ( ) )
126
- . map_disconnect ( |node| node. cached_data ( ) )
127
- . map_witness ( Arc :: clone) ;
128
- Ok ( Arc :: new ( RedeemData :: new (
129
- data. node . arrow ( ) . shallow_clone ( ) ,
130
- converted_data,
131
- ) ) )
132
- }
133
- }
134
-
135
- let simplicity_named_commit = _compile ( prog) ?;
136
- let simplicity_named_commit =
137
- Arc :: < _ > :: try_unwrap ( simplicity_named_commit) . expect ( "Only one reference to commit node" ) ;
138
-
139
- let file = std:: fs:: File :: open ( wit_file) . expect ( "Error opening witness file" ) ;
140
- let rdr = std:: io:: BufReader :: new ( file) ;
141
- let mut wit_data: WitFileData =
142
- serde_json:: from_reader ( rdr) . expect ( "Error reading witness file" ) ;
143
-
144
- let simplicity_redeem = simplicity_named_commit
145
- . convert :: < NoSharing , Redeem < Elements > , _ > ( & mut wit_data)
146
- . unwrap ( ) ;
147
- Ok ( Arc :: try_unwrap ( simplicity_redeem) . unwrap ( ) )
39
+ pub fn satisfy ( prog_text : & str ) -> Result < Arc < RedeemNode < Elements > > , String > {
40
+ let simplicity_named_commit = compile ( prog_text) ?;
41
+ let mut finalizer = SimpleFinalizer :: new ( std:: iter:: empty ( ) ) ;
42
+ simplicity_named_commit
43
+ . convert :: < NoSharing , Redeem < Elements > , _ > ( & mut finalizer)
44
+ . map_err ( |_| {
45
+ "Witness expressions are temporarily not supported. Cannot satisfy." . to_string ( )
46
+ } )
148
47
}
149
48
150
49
#[ cfg( test) ]
151
50
mod tests {
152
51
use base64:: display:: Base64Display ;
153
52
use base64:: engine:: general_purpose:: STANDARD ;
154
- use simplicity:: node :: { CoreConstructible as _ , JetConstructible as _ } ;
155
- use simplicity :: { encode , BitMachine , BitWriter , Cmr , Value } ;
53
+ use simplicity:: { encode , BitMachine , BitWriter } ;
54
+ use std :: path :: Path ;
156
55
157
56
use crate :: * ;
158
57
@@ -171,71 +70,21 @@ mod tests {
171
70
_test_progs ( "./example_progs/sighash_all.simf" ) ;
172
71
_test_progs ( "./example_progs/sighash_all_anyprevoutanyscript.simf" ) ;
173
72
_test_progs ( "./example_progs/sighash_none.simf" ) ;
174
- _test_progs ( "./example_progs/test.simf" ) ;
175
73
_test_progs ( "./example_progs/tuple.simf" ) ;
176
74
_test_progs ( "./example_progs/unwrap.simf" ) ;
177
75
}
178
76
179
77
fn _test_progs ( file : & str ) {
180
78
println ! ( "Testing {file}" ) ;
181
- let file = Path :: new ( file) ;
182
- let simplicity_named_commit = match _compile ( file) {
79
+ let path = Path :: new ( file) ;
80
+ let text = std:: fs:: read_to_string ( path) . unwrap ( ) ;
81
+ let redeem_prog = match satisfy ( & text) {
183
82
Ok ( commit) => commit,
184
83
Err ( error) => {
185
84
panic ! ( "{error}" ) ;
186
85
}
187
86
} ;
188
87
189
- struct MyConverter ;
190
-
191
- impl Converter < Named < Commit < Elements > > , Redeem < Elements > > for MyConverter {
192
- type Error = std:: convert:: Infallible ;
193
-
194
- fn convert_witness (
195
- & mut self ,
196
- _data : & PostOrderIterItem < & NamedCommitNode > ,
197
- _witness : & <Named < Commit < Elements > > as simplicity:: node:: Marker >:: Witness ,
198
- ) -> Result < <Redeem < Elements > as simplicity:: node:: Marker >:: Witness , Self :: Error >
199
- {
200
- Ok ( Value :: u32 ( 20 ) )
201
- }
202
-
203
- fn convert_disconnect (
204
- & mut self ,
205
- _data : & PostOrderIterItem < & NamedCommitNode > ,
206
- _maybe_converted : Option < & Arc < simplicity:: node:: Node < Redeem < Elements > > > > ,
207
- _disconnect : & <Named < Commit < Elements > > as simplicity:: node:: Marker >:: Disconnect ,
208
- ) -> Result < <Redeem < Elements > as simplicity:: node:: Marker >:: Disconnect , Self :: Error >
209
- {
210
- todo ! ( )
211
- }
212
-
213
- fn convert_data (
214
- & mut self ,
215
- data : & PostOrderIterItem < & NamedCommitNode > ,
216
- inner : Inner <
217
- & Arc < simplicity:: node:: Node < Redeem < Elements > > > ,
218
- <Redeem < Elements > as simplicity:: node:: Marker >:: Jet ,
219
- & <Redeem < Elements > as simplicity:: node:: Marker >:: Disconnect ,
220
- & <Redeem < Elements > as simplicity:: node:: Marker >:: Witness ,
221
- > ,
222
- ) -> Result < <Redeem < Elements > as simplicity:: node:: Marker >:: CachedData , Self :: Error >
223
- {
224
- let converted_data = inner
225
- . map ( |node| node. cached_data ( ) )
226
- . map_disconnect ( |node| node. cached_data ( ) )
227
- . map_witness ( Arc :: clone) ;
228
- Ok ( Arc :: new ( RedeemData :: new (
229
- data. node . arrow ( ) . shallow_clone ( ) ,
230
- converted_data,
231
- ) ) )
232
- }
233
- }
234
-
235
- let redeem_prog = simplicity_named_commit
236
- . convert :: < NoSharing , Redeem < Elements > , _ > ( & mut MyConverter )
237
- . unwrap ( ) ;
238
-
239
88
let mut vec = Vec :: new ( ) ;
240
89
let mut writer = BitWriter :: new ( & mut vec) ;
241
90
let _encoded = encode:: encode_program ( & redeem_prog, & mut writer) . unwrap ( ) ;
@@ -248,27 +97,4 @@ mod tests {
248
97
. exec ( & redeem_prog, & env)
249
98
. expect ( "Machine execution failure" ) ;
250
99
}
251
-
252
- #[ test]
253
- fn temp_progs ( ) {
254
- let inp = ProgNode :: const_word ( Value :: u32 ( 10 ) ) ;
255
- let node = ProgNode :: jet ( Elements :: ParseLock ) ;
256
- println ! ( "l1: {}" , node. arrow( ) ) ;
257
- let node = ProgNode :: comp ( & inp, & node) . unwrap ( ) ;
258
- println ! ( "l2: {}" , node. arrow( ) ) ;
259
- let node = ProgNode :: pair ( & node, & ProgNode :: unit ( ) ) . unwrap ( ) ;
260
- println ! ( "l3: {}" , node. arrow( ) ) ;
261
- let later_operation = ProgNode :: take ( & ProgNode :: unit ( ) ) ;
262
- println ! ( "l4: {}" , later_operation. arrow( ) ) ;
263
- let assert_node = ProgNode :: assertl ( & later_operation, Cmr :: unit ( ) ) . unwrap ( ) ;
264
- println ! ( "l5: {}" , assert_node. arrow( ) ) ;
265
- let comp = ProgNode :: comp ( & node, & assert_node) . unwrap ( ) ;
266
- println ! ( "l6: {}" , comp. arrow( ) ) ;
267
- // let node2 = ProgNode::assert(&node, Cmr::unit()).unwrap();
268
- // println!("l3: {}", node2.arrow());
269
- // let node3 = ProgNode::comp(&ProgNode::pair(&ProgNode::unit(), &ProgNode::unit()).unwrap(), &node2).unwrap();
270
- // println!("l4: {}", node3.arrow());
271
- let res = comp. finalize_types_main ( ) . unwrap ( ) ;
272
- dbg ! ( & res) ;
273
- }
274
100
}
0 commit comments