script interpreter pushing values and bytes on stack
This commit is contained in:
parent
e7dadc87dd
commit
8bc58710b2
|
@ -14,6 +14,7 @@ pub enum Error {
|
||||||
// BIP62
|
// BIP62
|
||||||
SignatureHashtype,
|
SignatureHashtype,
|
||||||
SignatureDer,
|
SignatureDer,
|
||||||
|
Minimaldata,
|
||||||
SignatureHighS,
|
SignatureHighS,
|
||||||
PubkeyType,
|
PubkeyType,
|
||||||
}
|
}
|
||||||
|
@ -32,6 +33,7 @@ impl fmt::Display for Error {
|
||||||
// BIP62
|
// BIP62
|
||||||
Error::SignatureHashtype => "Invalid Signature Hashtype".fmt(f),
|
Error::SignatureHashtype => "Invalid Signature Hashtype".fmt(f),
|
||||||
Error::SignatureDer => "Invalid Signature".fmt(f),
|
Error::SignatureDer => "Invalid Signature".fmt(f),
|
||||||
|
Error::Minimaldata => "Check minimaldata failed".fmt(f),
|
||||||
Error::SignatureHighS => "Invalid High S in Signature".fmt(f),
|
Error::SignatureHighS => "Invalid High S in Signature".fmt(f),
|
||||||
Error::PubkeyType => "Invalid Pubkey".fmt(f),
|
Error::PubkeyType => "Invalid Pubkey".fmt(f),
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,9 +206,9 @@ fn check_minimal_push(data: &[u8], opcode: Opcode) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn eval_script(
|
pub fn eval_script(
|
||||||
_stack: &mut Vec<Vec<u8>>,
|
stack: &mut Vec<Vec<u8>>,
|
||||||
script: &Script,
|
script: &Script,
|
||||||
_flags: &VerificationFlags,
|
flags: &VerificationFlags,
|
||||||
_checker: &SignatureChecker,
|
_checker: &SignatureChecker,
|
||||||
_version: SignatureVersion
|
_version: SignatureVersion
|
||||||
) -> Result<bool, Error> {
|
) -> Result<bool, Error> {
|
||||||
|
@ -218,9 +218,15 @@ pub fn eval_script(
|
||||||
|
|
||||||
for i in script.into_iter() {
|
for i in script.into_iter() {
|
||||||
match try!(i) {
|
match try!(i) {
|
||||||
Instruction::PushValue(_opcode, _num) => {
|
Instruction::PushValue(_opcode, num) => {
|
||||||
|
stack.push(num.to_vec());
|
||||||
},
|
},
|
||||||
Instruction::PushBytes(_opcode, _bytes) => {
|
Instruction::PushBytes(opcode, bytes) => {
|
||||||
|
// TODO: if fExec
|
||||||
|
if flags.verify_minimaldata && !check_minimal_push(bytes, opcode) {
|
||||||
|
return Err(Error::Minimaldata);
|
||||||
|
}
|
||||||
|
stack.push(bytes.to_vec());
|
||||||
},
|
},
|
||||||
Instruction::Normal(_opcode) => {
|
Instruction::Normal(_opcode) => {
|
||||||
},
|
},
|
||||||
|
|
|
@ -26,3 +26,45 @@ impl From<i64> for Num {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Num {
|
||||||
|
pub fn to_vec(&self) -> Vec<u8> {
|
||||||
|
if self.value == 0 {
|
||||||
|
return vec![];
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut result = vec![];
|
||||||
|
let negative = self.value < 0;
|
||||||
|
let mut absvalue = match negative {
|
||||||
|
true => (-self.value) as u64,
|
||||||
|
false => self.value as u64,
|
||||||
|
};
|
||||||
|
|
||||||
|
while absvalue > 0 {
|
||||||
|
result.push(absvalue as u8 & 0xff);
|
||||||
|
absvalue >>= 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - If the most significant byte is >= 0x80 and the value is positive, push a
|
||||||
|
// new zero-byte to make the significant byte < 0x80 again.
|
||||||
|
|
||||||
|
// - If the most significant byte is >= 0x80 and the value is negative, push a
|
||||||
|
// new 0x80 byte that will be popped off when converting to an integral.
|
||||||
|
|
||||||
|
// - If the most significant byte is < 0x80 and the value is negative, add
|
||||||
|
// 0x80 to it, since it will be subtracted and interpreted as a negative when
|
||||||
|
// converting to an integral.
|
||||||
|
|
||||||
|
if result[result.len() - 1] & 0x80 != 0 {
|
||||||
|
match negative {
|
||||||
|
true => result.push(0x80),
|
||||||
|
false => result.push(0),
|
||||||
|
}
|
||||||
|
} else if negative {
|
||||||
|
let rlen = result.len();
|
||||||
|
result[rlen - 1] |= 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue