4
4
use fil_actors_runtime:: runtime:: builtins:: Type ;
5
5
use fil_actors_runtime:: runtime:: { ActorCode , Runtime } ;
6
6
use fil_actors_runtime:: {
7
- actor_error, cbor, resolve_to_actor_id , restrict_internal_api, ActorDowncast , ActorError , Array ,
7
+ actor_error, cbor, restrict_internal_api, ActorDowncast , ActorError , Array , AsActorError ,
8
8
} ;
9
9
use fvm_ipld_blockstore:: Blockstore ;
10
10
use fvm_ipld_encoding:: RawBytes ;
@@ -22,6 +22,7 @@ pub use self::types::*;
22
22
#[ cfg( feature = "fil-actor" ) ]
23
23
fil_actors_runtime:: wasm_trampoline!( Actor ) ;
24
24
25
+ pub mod ext;
25
26
mod state;
26
27
pub mod testing;
27
28
mod types;
@@ -42,17 +43,25 @@ pub const ERR_CHANNEL_STATE_UPDATE_AFTER_SETTLED: ExitCode = ExitCode::new(32);
42
43
43
44
/// Payment Channel actor
44
45
pub struct Actor ;
46
+
45
47
impl Actor {
46
48
/// Constructor for Payment channel actor
47
49
pub fn constructor ( rt : & mut impl Runtime , params : ConstructorParams ) -> Result < ( ) , ActorError > {
48
50
// Only InitActor can create a payment channel actor. It creates the actor on
49
51
// behalf of the payer/payee.
50
52
rt. validate_immediate_caller_type ( std:: iter:: once ( & Type :: Init ) ) ?;
51
53
52
- // Check both parties are capable of signing vouchers
53
- let to = Self :: resolve_account ( rt, & params. to ) ?;
54
+ // Resolve both parties if necessary.
55
+ // Note that this does NOT guarantee that the parties exist in state yet.
56
+ let to =
57
+ rt. resolve_address ( & params. to ) . with_context_code ( ExitCode :: USR_NOT_FOUND , || {
58
+ format ! ( "to address not found {}" , params. to)
59
+ } ) ?;
54
60
55
- let from = Self :: resolve_account ( rt, & params. from ) ?;
61
+ let from =
62
+ rt. resolve_address ( & params. from ) . with_context_code ( ExitCode :: USR_NOT_FOUND , || {
63
+ format ! ( "to address not found {}" , params. to)
64
+ } ) ?;
56
65
57
66
let empty_arr_cid =
58
67
Array :: < ( ) , _ > :: new_with_bit_width ( rt. store ( ) , LANE_STATES_AMT_BITWIDTH )
@@ -65,28 +74,6 @@ impl Actor {
65
74
Ok ( ( ) )
66
75
}
67
76
68
- /// Resolves an address to a canonical ID address and requires it to address an account actor.
69
- fn resolve_account ( rt : & mut impl Runtime , raw : & Address ) -> Result < Address , ActorError > {
70
- let resolved = resolve_to_actor_id ( rt, raw) ?;
71
-
72
- let code_cid = rt
73
- . get_actor_code_cid ( & resolved)
74
- . ok_or_else ( || actor_error ! ( illegal_argument, "no code for address {}" , resolved) ) ?;
75
-
76
- let typ = rt. resolve_builtin_actor_type ( & code_cid) ;
77
- if typ != Some ( Type :: Account ) {
78
- Err ( actor_error ! (
79
- forbidden,
80
- "actor {} must be an account, was {} ({:?})" ,
81
- raw,
82
- code_cid,
83
- typ
84
- ) )
85
- } else {
86
- Ok ( Address :: new_id ( resolved) )
87
- }
88
- }
89
-
90
77
pub fn update_channel_state (
91
78
rt : & mut impl Runtime ,
92
79
params : UpdateChannelStateParams ,
@@ -98,10 +85,11 @@ impl Actor {
98
85
let sv = params. sv ;
99
86
100
87
// Pull signature from signed voucher
101
- let sig = sv
88
+ let sig = & sv
102
89
. signature
103
90
. as_ref ( )
104
- . ok_or_else ( || actor_error ! ( illegal_argument, "voucher has no signature" ) ) ?;
91
+ . ok_or_else ( || actor_error ! ( illegal_argument, "voucher has no signature" ) ) ?
92
+ . bytes ;
105
93
106
94
if st. settling_at != 0 && rt. curr_epoch ( ) >= st. settling_at {
107
95
return Err ( ActorError :: unchecked (
@@ -120,9 +108,17 @@ impl Actor {
120
108
} ) ?;
121
109
122
110
// Validate signature
123
- rt. verify_signature ( sig, & signer, & sv_bz) . map_err ( |e| {
124
- e. downcast_default ( ExitCode :: USR_ILLEGAL_ARGUMENT , "voucher signature invalid" )
125
- } ) ?;
111
+
112
+ rt. send (
113
+ & signer,
114
+ ext:: account:: AUTHENTICATE_MESSAGE_METHOD ,
115
+ RawBytes :: serialize ( ext:: account:: AuthenticateMessageParams {
116
+ signature : sig. to_vec ( ) ,
117
+ message : sv_bz,
118
+ } ) ?,
119
+ TokenAmount :: zero ( ) ,
120
+ )
121
+ . map_err ( |e| e. wrap ( "voucher sig authentication failed" ) ) ?;
126
122
127
123
let pch_addr = rt. message ( ) . receiver ( ) ;
128
124
let svpch_id = rt. resolve_address ( & sv. channel_addr ) . ok_or_else ( || {
0 commit comments