Add message

This commit is contained in:
Greg Fitzgerald 2019-03-24 20:55:32 -06:00
parent caff603497
commit f3936c21a3
4 changed files with 37 additions and 10 deletions

View File

@ -2,8 +2,8 @@
use crate::hash::Hash;
use crate::instruction::{CompiledInstruction, Instruction};
use crate::message::Message;
use crate::pubkey::Pubkey;
use crate::transaction::Transaction;
use itertools::Itertools;
fn position(keys: &[Pubkey], key: &Pubkey) -> u8 {
@ -81,14 +81,14 @@ impl InstructionCompiler {
}
/// Return an unsigned transaction with space for requires signatures.
pub fn compile(&self) -> Transaction {
pub fn compile(&self) -> Message {
let program_ids = self.program_ids();
let (mut signed_keys, unsigned_keys) = self.keys();
let signed_len = signed_keys.len();
let num_signatures = signed_keys.len() as u8;
signed_keys.extend(&unsigned_keys);
let instructions = compile_instructions(&self.instructions, &signed_keys, &program_ids);
Transaction {
signatures: Vec::with_capacity(signed_len),
Message {
num_signatures,
account_keys: signed_keys,
recent_blockhash: Hash::default(),
fee: 0,
@ -211,12 +211,12 @@ mod tests {
let program_id = Pubkey::default();
let id0 = Pubkey::default();
let ix = Instruction::new(program_id, &0, vec![AccountMeta::new(id0, false)]);
let tx = InstructionCompiler::new(vec![ix]).compile();
assert_eq!(tx.signatures.capacity(), 0);
let message = InstructionCompiler::new(vec![ix]).compile();
assert_eq!(message.num_signatures, 0);
let ix = Instruction::new(program_id, &0, vec![AccountMeta::new(id0, true)]);
let tx = InstructionCompiler::new(vec![ix]).compile();
assert_eq!(tx.signatures.capacity(), 1);
let message = InstructionCompiler::new(vec![ix]).compile();
assert_eq!(message.num_signatures, 1);
}
#[test]

View File

@ -5,6 +5,7 @@ pub mod hash;
pub mod instruction;
mod instruction_compiler;
pub mod loader_instruction;
mod message;
pub mod native_loader;
pub mod native_program;
pub mod packet;

13
sdk/src/message.rs Normal file
View File

@ -0,0 +1,13 @@
use crate::hash::Hash;
use crate::instruction::CompiledInstruction;
use crate::pubkey::Pubkey;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Message {
pub num_signatures: u8,
pub account_keys: Vec<Pubkey>,
pub recent_blockhash: Hash,
pub fee: u64,
pub program_ids: Vec<Pubkey>,
pub instructions: Vec<CompiledInstruction>,
}

View File

@ -3,6 +3,7 @@
use crate::hash::{Hash, Hasher};
use crate::instruction::{AccountMeta, CompiledInstruction, Instruction, InstructionError};
use crate::instruction_compiler::InstructionCompiler;
use crate::message::Message;
use crate::packet::PACKET_DATA_SIZE;
use crate::pubkey::Pubkey;
use crate::shortvec::{deserialize_vec_with, encode_len, serialize_vec_with};
@ -72,8 +73,20 @@ pub struct Transaction {
}
impl Transaction {
pub fn new_message(message: Message) -> Self {
Self {
signatures: Vec::with_capacity(message.num_signatures as usize),
account_keys: message.account_keys,
recent_blockhash: message.recent_blockhash,
fee: message.fee,
program_ids: message.program_ids,
instructions: message.instructions,
}
}
pub fn new(instructions: Vec<Instruction>) -> Self {
InstructionCompiler::new(instructions).compile()
let message = InstructionCompiler::new(instructions).compile();
Self::new_message(message)
}
pub fn new_signed_instructions<T: KeypairUtil>(