#![allow(
clippy::unreadable_literal,
clippy::upper_case_acronyms,
dead_code,
non_camel_case_types,
non_snake_case,
non_upper_case_globals,
overflowing_literals,
unused_variables,
unused_assignments
)]
use ethabi::Log as ReceiptLog;
use serde_json::{json, Value as JsonValue};
use crate::bcossdk::bcossdk::BcosSDK;
use crate::bcossdk::commonhash::HashType;
use crate::bcossdk::contractabi::ContractABI;
use crate::bcossdk::kisserror::{KissErrKind, KissError};
use std::thread;
use std::time::Duration;
const DELTABLOCKLIMIT: u32 = 500;
pub fn json_hextoint(v: &JsonValue) -> Result<i32, KissError> {
let num_option = v.as_str();
match num_option {
Some(v) => {
let s = v.trim_start_matches("0x");
let numres = i32::from_str_radix(s, 16);
match numres {
Ok(num) => Ok(num),
Err(e) => {
kisserr!(KissErrKind::EFormat, "result format error {:?}", v)
}
}
}
_ => {
return kisserr!(KissErrKind::EFormat, "result format error {:?}", v);
}
}
}
impl BcosSDK {
pub fn getBlockNumber(&mut self) -> Result<u32, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBlockNumber";
let paramobj = json!([groupid]);
let v: JsonValue = self.netclient.rpc_request_sync(cmd, ¶mobj)?;
let num = json_hextoint(&v["result"])? as u32;
Ok(num)
}
pub fn getBlockLimit(&mut self) -> Result<u32, KissError> {
let now = time::now();
printlnex!("getblocknumber cause :{}", now - self.updateblocknum_tick);
if now - self.updateblocknum_tick > time::Duration::seconds(30) {
let block_num = self.getBlockNumber()?;
self.lastblocknum = block_num;
self.updateblocknum_tick = time::now();
}
Ok(self.lastblocknum + DELTABLOCKLIMIT)
}
pub fn getNodeVersion(&mut self) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getClientVersion";
let paramobj = json!([groupid]);
let v: JsonValue = self.netclient.rpc_request_sync(cmd, ¶mobj)?;
Ok(v["result"].clone())
}
pub fn getNodeInfo(&mut self) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getNodeInfo";
let paramobj = json!([groupid]);
let v: JsonValue = self.netclient.rpc_request_sync(cmd, ¶mobj)?;
Ok(v["result"].clone())
}
pub fn getPbftView(&mut self, groupid: u32) -> Result<i32, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getPbftView";
let paramobj = json!([groupid]);
let res = self.netclient.rpc_request_sync(cmd, ¶mobj)?;
json_hextoint(&res["result"])
}
pub fn getSealerList(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getSealerList";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getObserverList(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getObserverList";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getConsensusStatus(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getConsensusStatus";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getSyncStatus(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getSyncStatus";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getPeers(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getPeers";
let paramobj = json!([self.config.chain.groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getGroupPeers(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getGroupPeers";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getNodeIDList(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getNodeIDList";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getGroupList(&mut self) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getGroupList";
let paramobj = json!([self.config.chain.groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBlockByNumber(
&mut self,
num: u32,
includeTransactions: bool,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBlockByNumber";
let hexnum = format!("0x{:02X}", num);
let paramobj = json!([self.config.chain.groupid, hexnum, includeTransactions]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBlockHashByNumber(&mut self, num: u32) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBlockHashByNumber";
let hexnum = format!("0x{:02X}", num);
let paramobj = json!([self.config.chain.groupid, hexnum.to_string()]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBlockHeaderByNumber(
&mut self,
num: u32,
includeTransactions: bool,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBlockHeaderByNumber";
let hexnum = format!("0x{:02X}", num);
let paramobj = json!([
self.config.chain.groupid,
hexnum.to_string(),
includeTransactions
]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBlockByHash(
&mut self,
blockhash: &str,
includeTransactions: bool,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBlockByHash";
let paramobj = json!([
self.config.chain.groupid,
blockhash.to_string(),
includeTransactions
]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBlockHeaderByHash(
&mut self,
blockhash: &str,
includeTransactions: bool,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBlockHeaderByHash";
let paramobj = json!([
self.config.chain.groupid,
blockhash.to_string(),
includeTransactions
]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn sendRawTransactionGetReceipt(
&mut self,
contract: &ContractABI,
to_address: &str,
methodname: &str,
params: &[String],
) -> Result<JsonValue, KissError> {
let response = self.send_raw_transaction(&contract, &to_address, methodname, ¶ms)?;
let txhash = response["result"].as_str().unwrap();
self.try_getTransactionReceipt(txhash, 3, false)
}
pub fn getTransactionReceipt(&mut self, txhash: &str) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getTransactionReceipt";
let paramobj = json!([groupid, txhash]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn try_getTransactionReceipt(
&mut self,
txhash: &str,
timeoutsec: i64,
allow_none_result: bool,
) -> Result<JsonValue, KissError> {
let start = time::now();
while time::now() - start < chrono::Duration::seconds(timeoutsec) {
let v = self.getTransactionReceipt(txhash)?;
if v["result"] == JsonValue::Null {
if allow_none_result {
return Ok(v);
}
thread::sleep(Duration::from_millis(200));
continue;
}
return Ok(v);
}
return kisserr!(
KissErrKind::ENetwork,
"getTransactionReceipt timeout or missing"
);
}
pub fn getTransactionReceiptByHashWithProof(
&mut self,
txhash: &str,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getTransactionReceiptByHashWithProof";
let paramobj = json!([groupid, txhash]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getTransactionReceiptlogs(
&mut self,
txhash: &str,
contract: &ContractABI,
) -> Result<Vec<ReceiptLog>, KissError> {
let receipt = self.getTransactionReceipt(txhash)?;
contract.parse_receipt_logs(&receipt["result"]["logs"])
}
pub fn getTransactionByHash(&mut self, txhash: &str) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getTransactionByHash";
let paramobj = json!([groupid, txhash]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getTransactionByBlockHashAndIndex(
&mut self,
blockhash: &str,
index: u32,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getTransactionByBlockHashAndIndex";
let indexhex = format!("0x{:02X}", index);
let paramobj = json!([groupid, blockhash, indexhex]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getTransactionByBlockNumberAndIndex(
&mut self,
blocknum: u32,
index: u32,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getTransactionByBlockNumberAndIndex";
let blocknum = format!("0x{:02X}", blocknum);
let indexhex = format!("0x{:02X}", index);
let paramobj = json!([groupid, blocknum, indexhex]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getTransactionByHashWithProof(&mut self, txhash: &str) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getTransactionByHashWithProof";
let paramobj = json!([groupid, txhash]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getPendingTransactions(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getPendingTransactions";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getPendingTxSize(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getPendingTxSize";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getTotalTransactionCount(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "getTotalTransactionCount";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getCode(&mut self, groupid: u32, address: &str) -> Result<JsonValue, KissError> {
let cmd = "getCode";
let paramobj = json!([groupid, address.to_string()]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getSystemConfigByKey(
&mut self,
groupid: u32,
key: &str,
) -> Result<JsonValue, KissError> {
let cmd = "getSystemConfigByKey";
let paramobj = json!([groupid, key.to_string()]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn queryGroupStatus(&mut self, groupid: u32) -> Result<JsonValue, KissError> {
let cmd = "queryGroupStatus";
let paramobj = json!([groupid]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBatchReceiptsByBlockNumberAndRange(
&mut self,
blockNumber: u32,
from: u32,
count: i32,
compressFlag: bool,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBatchReceiptsByBlockNumberAndRange";
let blocknumhex = format!("0x{:X}", blockNumber);
let paramobj = json!([
groupid,
blocknumhex,
format!("{}", from),
format!("{}", count),
compressFlag
]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
pub fn getBatchReceiptsByBlockHashAndRange(
&mut self,
blockhash: &str,
from: u32,
count: i32,
compressFlag: bool,
) -> Result<JsonValue, KissError> {
let groupid = self.config.chain.groupid;
let cmd = "getBatchReceiptsByBlockHashAndRange";
let paramobj = json!([
groupid,
blockhash,
format!("{}", from),
format!("{}", count),
compressFlag
]);
self.netclient.rpc_request_sync(cmd, ¶mobj)
}
}
pub fn demo_query() {
let mut bcossdk = BcosSDK::new().unwrap();
let res = bcossdk.getBlockNumber();
println!("getBlockNumber {:?}", res);
println!("getNodeVersion {:?}", bcossdk.getNodeVersion()); println!("getNodeInfo {:?}", bcossdk.getNodeInfo());
let txhash = "0x28c4717ce415f3e3b4e69b9b38f205cb0f73fb40c4faf85836af9083a7457a6c";
let res = bcossdk.getTransactionByHash(txhash).unwrap();
println!("getTransactionByHash {:?}", res); let contract = ContractABI::new("contracts/HelloWorld.abi", &HashType::WEDPR_KECCAK).unwrap();
let decoderes = contract.decode_input_for_tx(res["result"]["input"].as_str().unwrap());
println!("decode reuslt : {:?}", decoderes);
println!("getPbftView : {:?}", bcossdk.getPbftView(1));
println!("getSealerList {:?}", bcossdk.getSealerList(1));
println!("getConsensusStatus {:?}", bcossdk.getConsensusStatus(1));
let res = bcossdk.getBlockByNumber(1, true).unwrap();
println!("getBlockByNumber res:{:?}", &res); let blockhash = res["result"]["hash"].as_str().unwrap();
println!("blockhash is {}", blockhash);
let res = bcossdk.getBlockByHash(blockhash, false);
println!("getBlockByHash {:?}", res);
let res = bcossdk.getBlockHeaderByNumber(10, true).unwrap();
println!("getBlockHeaderByNumber {:?}", res);
let blockhash = res["result"]["hash"].as_str().unwrap();
let res = bcossdk.getBlockHeaderByHash(blockhash, true);
println!("getBlockHeaderByHash {:?}", res);
let res = bcossdk.getTransactionByBlockHashAndIndex(blockhash, 0);
println!("getTransactionByBlockHashAndIndex {:?}", res);
let res = bcossdk.getTransactionByBlockNumberAndIndex(2, 0);
println!("getTransactionByBlockNumberAndIndex {:?}", res);
let txresult = res.unwrap();
let txhash = txresult["result"]["hash"].as_str().unwrap();
let res = bcossdk.getTransactionByHashWithProof(txhash);
println!("getTransactionByHashWithProof {:?}", res);
println!(
"getPendingTransactions {:?}",
bcossdk.getPendingTransactions(1)
);
println!("getPendingTxSize {:?}", bcossdk.getPendingTxSize(1));
let totalres = bcossdk.getTotalTransactionCount(1).unwrap();
println!("getTotalTransactionCount {:?}", &totalres);
println!(
"blocknum :{:?},failtx {:?}, txsum :{:?}",
json_hextoint(&totalres["result"]["blockNumber"]),
json_hextoint(&totalres["result"]["failedTxSum"]),
json_hextoint(&totalres["result"]["txSum"]),
);
let res = bcossdk.getBatchReceiptsByBlockNumberAndRange(2, 0, -1, false);
println!("getBatchReceiptsByBlockNumberAndRange {:?}", res);
let detail = res.unwrap();
let blockhash = detail["result"]["blockInfo"]["blockHash"].as_str().unwrap();
let res = bcossdk.getBatchReceiptsByBlockHashAndRange(blockhash, 0, -1, false);
println!("getBatchReceiptsByBlockHashAndRange {:?}", res);
println!("{:?}", bcossdk.getBlockNumber());
bcossdk.finish();
}