Use accounts[1] for Lua code and tx userdata as arg data

This makes the Lua version nearly identical to the C one.
This commit is contained in:
Greg Fitzgerald
2018-10-09 08:02:00 -06:00
parent 0403299728
commit 9c4e19958b

View File

@ -29,8 +29,12 @@ fn update_accounts(lua: &Lua, name: &str, keyed_accounts: &mut Vec<KeyedAccount>
Ok(()) Ok(())
} }
fn run_lua(keyed_accounts: &mut Vec<KeyedAccount>, code: &str) -> Result<()> { fn run_lua(keyed_accounts: &mut Vec<KeyedAccount>, code: &str, data: &[u8]) -> Result<()> {
let lua = Lua::new(); let lua = Lua::new();
let globals = lua.globals();
let data_str = lua.create_string(data)?;
globals.set("data", data_str)?;
set_accounts(&lua, "accounts", keyed_accounts)?; set_accounts(&lua, "accounts", keyed_accounts)?;
lua.exec::<_, ()>(code, None)?; lua.exec::<_, ()>(code, None)?;
update_accounts(&lua, "accounts", keyed_accounts) update_accounts(&lua, "accounts", keyed_accounts)
@ -38,8 +42,8 @@ fn run_lua(keyed_accounts: &mut Vec<KeyedAccount>, code: &str) -> Result<()> {
#[no_mangle] #[no_mangle]
pub extern "C" fn process(keyed_accounts: &mut Vec<KeyedAccount>, data: &[u8]) { pub extern "C" fn process(keyed_accounts: &mut Vec<KeyedAccount>, data: &[u8]) {
let code: String = deserialize(&data).unwrap(); let code: String = deserialize(&keyed_accounts[0].account.userdata).unwrap();
run_lua(keyed_accounts, &code).unwrap(); run_lua(keyed_accounts, &code, data).unwrap();
} }
#[cfg(test)] #[cfg(test)]
@ -68,7 +72,7 @@ mod tests {
fn test_credit_with_lua() -> Result<()> { fn test_credit_with_lua() -> Result<()> {
let code = r#"accounts[1].tokens = accounts[1].tokens + 1"#; let code = r#"accounts[1].tokens = accounts[1].tokens + 1"#;
let mut accounts = [(Pubkey::default(), Account::default())]; let mut accounts = [(Pubkey::default(), Account::default())];
run_lua(&mut create_keyed_accounts(&mut accounts), code)?; run_lua(&mut create_keyed_accounts(&mut accounts), code, &[])?;
assert_eq!(accounts[0].1.tokens, 1); assert_eq!(accounts[0].1.tokens, 1);
Ok(()) Ok(())
} }
@ -77,14 +81,14 @@ mod tests {
fn test_error_with_lua() { fn test_error_with_lua() {
let code = r#"accounts[1].tokens += 1"#; let code = r#"accounts[1].tokens += 1"#;
let mut accounts = [(Pubkey::default(), Account::default())]; let mut accounts = [(Pubkey::default(), Account::default())];
assert!(run_lua(&mut create_keyed_accounts(&mut accounts), code).is_err()); assert!(run_lua(&mut create_keyed_accounts(&mut accounts), code, &[]).is_err());
} }
#[test] #[test]
fn test_move_funds_with_lua_via_process() { fn test_move_funds_with_lua_via_process() {
let data: Vec<u8> = serialize( let userdata: Vec<u8> = serialize(
r#" r#"
local tokens = 100 local tokens, _ = string.unpack("I", data)
accounts[1].tokens = accounts[1].tokens - tokens accounts[1].tokens = accounts[1].tokens - tokens
accounts[2].tokens = accounts[2].tokens + tokens accounts[2].tokens = accounts[2].tokens + tokens
"#, "#,
@ -95,12 +99,23 @@ mod tests {
let program_id = Pubkey::default(); let program_id = Pubkey::default();
let mut accounts = [ let mut accounts = [
(alice_pubkey, Account::new(100, 0, program_id)), (
alice_pubkey,
Account {
tokens: 100,
userdata,
program_id,
},
),
(bob_pubkey, Account::new(1, 0, program_id)), (bob_pubkey, Account::new(1, 0, program_id)),
]; ];
let data = serialize(&10).unwrap();
process(&mut create_keyed_accounts(&mut accounts), &data); process(&mut create_keyed_accounts(&mut accounts), &data);
assert_eq!(accounts[0].1.tokens, 90);
assert_eq!(accounts[1].1.tokens, 11);
assert_eq!(accounts[0].1.tokens, 0); process(&mut create_keyed_accounts(&mut accounts), &data);
assert_eq!(accounts[1].1.tokens, 101); assert_eq!(accounts[0].1.tokens, 80);
assert_eq!(accounts[1].1.tokens, 21);
} }
} }