Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 6011d16

Browse files
committed
pass userdata,accounts to contracts, no return value
1 parent a315864 commit 6011d16

File tree

4 files changed

+33
-96
lines changed

4 files changed

+33
-96
lines changed

contracts/move_funds/src/lib.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ extern crate bincode;
22
extern crate solana;
33

44
use bincode::deserialize;
5-
use solana::bank::{Account, BankError, Result};
5+
use solana::bank::Account;
66
use solana::dynamic_contract::DynamicContract;
7-
use solana::transaction::Transaction;
87

98
#[no_mangle]
10-
pub extern "C" fn process(tx: &Transaction, accounts: &mut [Account]) -> Result<()> {
11-
let dc: DynamicContract = deserialize(&tx.userdata).unwrap();
9+
pub extern "C" fn process(userdata: &[u8], accounts: &mut [Account]) {
10+
let dc: DynamicContract = deserialize(userdata).unwrap();
1211
// TODO there has to be a better way than this
1312
let tokens = i64::from(match dc {
1413
DynamicContract::Native { userdata, .. } => userdata[0],
@@ -22,33 +21,22 @@ pub extern "C" fn process(tx: &Transaction, accounts: &mut [Account]) -> Result<
2221
"Insufficient funds, asked {}, only had {}",
2322
tokens, accounts[0].tokens
2423
);
25-
return Err(BankError::UnbalancedTransaction(tx.signature));
2624
}
27-
Ok(())
2825
}
2926

3027
#[cfg(test)]
3128
mod tests {
3229
use super::*;
3330
use bincode::serialize;
34-
use solana::dynamic_contract::DYNAMIC_CONTRACT_ID;
35-
use solana::hash::Hash;
36-
use solana::signature::{Pubkey, Signature};
31+
use solana::signature::Pubkey;
3732

3833
#[test]
3934
fn test_move_funds() {
4035
let userdata = DynamicContract::Native {
4136
name: "move_funds".to_string(),
4237
userdata: vec![100, 1],
4338
};
44-
let tx = Transaction {
45-
signature: Signature::default(),
46-
keys: vec![Pubkey::default(); 2],
47-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
48-
last_id: Hash::default(),
49-
fee: 42,
50-
userdata: serialize(&userdata).unwrap(),
51-
};
39+
let userdata = serialize(&userdata).unwrap();
5240
let mut accounts = [
5341
Account {
5442
tokens: 100,
@@ -62,7 +50,7 @@ mod tests {
6250
},
6351
];
6452

65-
process(&tx, &mut accounts).unwrap();
53+
process(&userdata, &mut accounts);
6654
assert_eq!(0, accounts[0].tokens);
6755
assert_eq!(101, accounts[1].tokens);
6856
}

contracts/noop/src/lib.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
extern crate solana;
22

3-
use solana::bank::{Account, Result};
4-
use solana::transaction::Transaction;
3+
use solana::bank::Account;
54

65
#[no_mangle]
7-
pub extern "C" fn process(_tx: &Transaction, _accounts: &mut [Account]) -> Result<()> {
8-
Ok(())
9-
}
6+
pub extern "C" fn process(_userdata: &[u8], _accounts: &mut [Account]) {}

contracts/print/src/lib.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
extern crate solana;
22

3-
use solana::bank::{Account, Result};
4-
use solana::transaction::Transaction;
3+
use solana::bank::Account;
54

65
#[no_mangle]
7-
pub extern "C" fn process(tx: &Transaction, accounts: &mut [Account]) -> Result<()> {
8-
println!("tx: {:?}", tx);
6+
pub extern "C" fn process(userdata: &[u8], accounts: &mut [Account]) {
7+
println!("tx: {:?}", userdata);
98
for account in accounts {
109
println!("accounts[0]: {:?}", account);
1110
}
12-
Ok(())
1311
}

src/dynamic_contract.rs

Lines changed: 22 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
extern crate bincode;
22
extern crate generic_array;
33

4-
use bank::{Account, Result};
4+
use bank::Account;
55
use bincode::deserialize;
66
use libloading::{Library, Symbol};
77
use signature::Pubkey;
88
use std::path::PathBuf;
9+
use std::result;
910
use transaction::Transaction;
1011

12+
pub type Result<T> = result::Result<T, T>;
13+
1114
#[cfg(debug_assertions)]
1215
const CARGO_PROFILE: &str = "debug";
1316

@@ -43,8 +46,7 @@ fn create_library_path(name: &str) -> PathBuf {
4346

4447
// All contracts export a symbol named process()
4548
const ENTRYPOINT: &str = "process";
46-
47-
type Entrypoint = unsafe extern "C" fn(tx: &Transaction, accounts: &mut [Account]) -> Result<()>;
49+
type Entrypoint = unsafe extern "C" fn(userdata: &[u8], accounts: &mut [Account]);
4850

4951
pub const DYNAMIC_CONTRACT_ID: [u8; 32] = [
5052
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -90,9 +92,7 @@ impl DynamicContract {
9092
Ok(s) => s,
9193
Err(e) => panic!("{:?} Unable to find {:?} in {:?}", e, ENTRYPOINT, &path),
9294
};
93-
if let Err(e) = entrypoint(tx, accounts) {
94-
println!("Transaction failed: {:?}", e);
95-
}
95+
entrypoint(&tx.userdata, accounts);
9696
}
9797
}
9898
DynamicContract::BPF { .. } => {
@@ -132,19 +132,9 @@ mod tests {
132132

133133
#[test]
134134
fn test_contract_balance() {
135-
let accounts = [
136-
Account {
137-
tokens: 100,
138-
userdata: vec![0, 8],
139-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
140-
},
141-
Account {
142-
tokens: 1,
143-
userdata: vec![0, 8],
144-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
145-
},
146-
];
147-
135+
let mut accounts = vec![Account::default(), Account::default()];
136+
accounts[0].tokens = 100;
137+
accounts[1].tokens = 1;
148138
assert_eq!(100, DynamicContract::get_balance(&accounts[0]));
149139
assert_eq!(1, DynamicContract::get_balance(&accounts[1]));
150140
}
@@ -163,18 +153,9 @@ mod tests {
163153
fee: 42,
164154
userdata: serialize(&userdata).unwrap(),
165155
};
166-
let mut accounts = [
167-
Account {
168-
tokens: 100,
169-
userdata: vec![0, 8],
170-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
171-
},
172-
Account {
173-
tokens: 1,
174-
userdata: vec![0, 8],
175-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
176-
},
177-
];
156+
let mut accounts = vec![Account::default(), Account::default()];
157+
accounts[0].tokens = 100;
158+
accounts[1].tokens = 1;
178159

179160
DynamicContract::process_transaction(&tx, &mut accounts);
180161
}
@@ -194,18 +175,9 @@ mod tests {
194175
fee: 42,
195176
userdata: serialize(&userdata).unwrap(),
196177
};
197-
let mut accounts = [
198-
Account {
199-
tokens: 100,
200-
userdata: vec![0, 8],
201-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
202-
},
203-
Account {
204-
tokens: 1,
205-
userdata: vec![0, 8],
206-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
207-
},
208-
];
178+
let mut accounts = vec![Account::default(), Account::default()];
179+
accounts[0].tokens = 100;
180+
accounts[1].tokens = 1;
209181

210182
DynamicContract::process_transaction(&tx, &mut accounts);
211183
}
@@ -224,18 +196,9 @@ mod tests {
224196
fee: 42,
225197
userdata: serialize(&userdata).unwrap(),
226198
};
227-
let mut accounts = [
228-
Account {
229-
tokens: 100,
230-
userdata: vec![0, 8],
231-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
232-
},
233-
Account {
234-
tokens: 1,
235-
userdata: vec![0, 8],
236-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
237-
},
238-
];
199+
let mut accounts = vec![Account::default(), Account::default()];
200+
accounts[0].tokens = 100;
201+
accounts[1].tokens = 1;
239202

240203
DynamicContract::process_transaction(&tx, &mut accounts);
241204
assert_eq!(0, accounts[0].tokens);
@@ -256,25 +219,16 @@ mod tests {
256219
fee: 42,
257220
userdata: serialize(&userdata).unwrap(),
258221
};
259-
let mut accounts = [
260-
Account {
261-
tokens: 10,
262-
userdata: vec![0, 8],
263-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
264-
},
265-
Account {
266-
tokens: 1,
267-
userdata: vec![0, 8],
268-
contract_id: Pubkey::new(&DYNAMIC_CONTRACT_ID),
269-
},
270-
];
222+
let mut accounts = vec![Account::default(), Account::default()];
223+
accounts[0].tokens = 10;
224+
accounts[1].tokens = 1;
271225

272226
DynamicContract::process_transaction(&tx, &mut accounts);
273227
assert_eq!(10, accounts[0].tokens);
274228
assert_eq!(1, accounts[1].tokens);
275229
}
276230

277-
// TODO add more tests to validate the Transaction and Account data is
231+
// TODO add more tests to validate the Userdata and Account data is
278232
// moving across the boundary correctly
279233

280234
}

0 commit comments

Comments
 (0)