From 8b29bc71541113d96fcab317e3d870239694504d Mon Sep 17 00:00:00 2001 From: Aaron Blankstein Date: Thu, 19 Dec 2019 10:57:14 -0600 Subject: [PATCH] initial work --- Cargo.toml | 5 +- src/blockstack_cli.rs | 80 ++++++++++++++++++++++++++++ src/chainstate/stacks/transaction.rs | 12 +++++ src/clarity_cli.rs | 24 --------- 4 files changed, 96 insertions(+), 25 deletions(-) create mode 100644 src/blockstack_cli.rs diff --git a/Cargo.toml b/Cargo.toml index d7843afee..0e3e9a4ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,9 +19,12 @@ path = "src/main.rs" [[bin]] name = "clarity-cli" -test = false path = "src/clarity_cli.rs" +[[bin]] +name = "blockstack-cli" +path = "src/blockstack_cli.rs" + [[bench]] name = "marf_bench" harness = false diff --git a/src/blockstack_cli.rs b/src/blockstack_cli.rs new file mode 100644 index 000000000..93fd3f770 --- /dev/null +++ b/src/blockstack_cli.rs @@ -0,0 +1,80 @@ +#![allow(unused_imports)] +#![allow(unused_assignments)] +#![allow(unused_variables)] +#![allow(dead_code)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] + +extern crate blockstack_lib; + +use std::env; +use std::convert::TryFrom; +use blockstack_lib::util::{log, strings::StacksString}; +use blockstack_lib::vm::{ + Value, ClarityName, ContractName, errors::RuntimeErrorType, errors::Error as ClarityError }; +use blockstack_lib::chainstate::stacks::{ + StacksPrivateKey, + StacksTransaction, TransactionSmartContract, TransactionContractCall, StacksAddress }; +use blockstack_lib::burnchains::Address; +use blockstack_lib::net::StacksMessageCodec; + +enum CliError { + ClarityRuntimeError(RuntimeErrorType), + ClarityGeneralError(ClarityError), + Message(String), +} + +impl From<&str> for CliError { + fn from(value: &str) -> Self { + CliError::Message(value.into()) + } +} + +impl From for CliError { + fn from(value: RuntimeErrorType) -> Self { + CliError::ClarityRuntimeError(value) + } +} + +impl From for CliError { + fn from(value: ClarityError) -> Self { + CliError::ClarityGeneralError(value) + } +} + +fn make_contract_publish(contract_name: String, contract_content: String) -> Result { + let name = ContractName::try_from(contract_name)?; + let code_body = StacksString::from_string(&contract_content) + .ok_or("Non-legal characters in contract-content")?; + Ok(TransactionSmartContract { name, code_body }) +} + +fn make_contract_call(contract_address: String, contract_name: String, function_name: String, args: Vec) -> Result { + let address = StacksAddress::from_string(&contract_address) + .ok_or("Failed to parse contract address")?; + let contract_name = ContractName::try_from(contract_name)?; + let function_name = ClarityName::try_from(function_name)?; + + // note: as this CLI develops the ability to query for state information, + // we should be able to typecheck the arguments before supplying them here. + let function_args: Result, ClarityError> = args.iter() + .map(|x| Value::try_deserialize_untyped(&x)) + .collect(); + let function_args = function_args?; + + Ok(TransactionContractCall { + address, contract_name, function_name, function_args + }) +} + +fn sign_transaction_single_sig_standard(transaction: &str, secret_key: &str) -> Result<(), CliError> { + let transaction = StacksTransaction::deserialize(&transaction.as_bytes().to_vec(), &mut 0, u32::max_value()); + let secret_key = StacksPrivateKey::from_hex(secret_key)?; + Ok(()) +} + +fn main() { + log::set_loglevel(log::LOG_DEBUG).unwrap(); + let argv : Vec = env::args().collect(); +} diff --git a/src/chainstate/stacks/transaction.rs b/src/chainstate/stacks/transaction.rs index 32a9e73c4..b57c55497 100644 --- a/src/chainstate/stacks/transaction.rs +++ b/src/chainstate/stacks/transaction.rs @@ -494,6 +494,18 @@ impl StacksMessageCodec for StacksTransaction { } } +impl From for TransactionPayload { + fn from(value: TransactionSmartContract) -> Self { + TransactionPayload::SmartContract(value) + } +} + +impl From for TransactionPayload { + fn from(value: TransactionContractCall) -> Self { + TransactionPayload::ContractCall(value) + } +} + impl StacksTransaction { /// Create a new, unsigned transaction and an empty STX fee with no post-conditions. pub fn new(version: TransactionVersion, auth: TransactionAuth, payload: TransactionPayload) -> StacksTransaction { diff --git a/src/clarity_cli.rs b/src/clarity_cli.rs index 4d3f2ca37..f5dda9552 100644 --- a/src/clarity_cli.rs +++ b/src/clarity_cli.rs @@ -25,30 +25,6 @@ #![allow(non_snake_case)] #![allow(non_upper_case_globals)] -extern crate rand; -extern crate ini; -extern crate secp256k1; -extern crate serde; -extern crate rusqlite; -extern crate curve25519_dalek; -extern crate ed25519_dalek; -extern crate sha2; -extern crate sha3; -extern crate ripemd160; -extern crate dirs; -extern crate regex; -extern crate byteorder; -extern crate mio; -extern crate libc; - -#[macro_use] extern crate serde_derive; -#[macro_use] extern crate serde_json; - -#[cfg(test)] -#[macro_use] -extern crate assert_json_diff; - -#[macro_use] extern crate blockstack_lib; use std::env;