add base64 to hex
add output_smt_size but encording still is base64
This commit is contained in:
parent
28aa4e4650
commit
bc9ca3ece5
100
build.bat
100
build.bat
|
@ -1,100 +0,0 @@
|
||||||
@echo off
|
|
||||||
setlocal enabledelayedexpansion
|
|
||||||
|
|
||||||
REM GBT项目构建脚本 (Windows版本)
|
|
||||||
|
|
||||||
echo 🚀 开始构建GBT项目...
|
|
||||||
|
|
||||||
REM 检查Rust环境
|
|
||||||
where cargo >nul 2>&1
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ❌ 错误: 未找到cargo,请先安装Rust
|
|
||||||
echo 访问: https://rustup.rs/
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 检查Rust版本
|
|
||||||
for /f "tokens=2" %%i in ('rustc --version') do set RUST_VERSION=%%i
|
|
||||||
echo 📦 Rust版本: %RUST_VERSION%
|
|
||||||
|
|
||||||
REM 检查是否在正确的目录
|
|
||||||
if not exist "Cargo.toml" (
|
|
||||||
echo ❌ 错误: 未找到Cargo.toml,请在gbt目录下运行此脚本
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 清理之前的构建
|
|
||||||
echo 🧹 清理之前的构建...
|
|
||||||
cargo clean
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ❌ 清理失败
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 更新依赖
|
|
||||||
echo 📥 更新依赖...
|
|
||||||
cargo update
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ❌ 更新依赖失败
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 检查代码
|
|
||||||
echo 🔍 检查代码...
|
|
||||||
cargo check
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ❌ 代码检查失败
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 运行测试
|
|
||||||
echo 🧪 运行测试...
|
|
||||||
cargo test
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ❌ 测试失败
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 构建发布版本
|
|
||||||
echo 🔨 构建发布版本...
|
|
||||||
cargo build --release
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ❌ 构建失败
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM 检查构建结果
|
|
||||||
if exist "target\release\gbt.exe" (
|
|
||||||
echo ✅ 构建成功!
|
|
||||||
echo 📁 可执行文件位置: target\release\gbt.exe
|
|
||||||
|
|
||||||
REM 显示文件信息
|
|
||||||
echo 📊 文件信息:
|
|
||||||
dir target\release\gbt.exe
|
|
||||||
|
|
||||||
REM 显示版本信息
|
|
||||||
echo ℹ️ 版本信息:
|
|
||||||
target\release\gbt.exe --version 2>nul || echo 无法获取版本信息
|
|
||||||
|
|
||||||
) else (
|
|
||||||
echo ❌ 构建失败!
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
echo 🎉 GBT项目构建完成!
|
|
||||||
echo.
|
|
||||||
echo 📖 使用方法:
|
|
||||||
echo target\release\gbt.exe --wallet-address ^<YOUR_WALLET_ADDRESS^>
|
|
||||||
echo.
|
|
||||||
echo 📖 更多选项:
|
|
||||||
echo target\release\gbt.exe --help
|
|
||||||
echo.
|
|
||||||
pause
|
|
69
src/main.rs
69
src/main.rs
|
@ -56,6 +56,11 @@ use tari_core::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use tari_utilities::hex::Hex;
|
use tari_utilities::hex::Hex;
|
||||||
|
use tari_utilities::ByteArray;
|
||||||
|
use jmt::{JellyfishMerkleTree, KeyHash};
|
||||||
|
use jmt::mock::MockTreeStore;
|
||||||
|
use tari_core::chain_storage::SmtHasher;
|
||||||
|
use tari_core::blocks::Block as CoreBlock;
|
||||||
|
|
||||||
const LOG_TARGET: &str = "gbt::main";
|
const LOG_TARGET: &str = "gbt::main";
|
||||||
|
|
||||||
|
@ -65,6 +70,7 @@ pub struct MiningTask {
|
||||||
pub coinbase_hash: String,
|
pub coinbase_hash: String,
|
||||||
pub height: u64,
|
pub height: u64,
|
||||||
pub target: u64,
|
pub target: u64,
|
||||||
|
pub output_smt_size: u64, // 新增:output_smt_size
|
||||||
pub block_template: String, // 序列化的区块模板
|
pub block_template: String, // 序列化的区块模板
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +207,46 @@ impl GbtClient {
|
||||||
Ok(node_conn)
|
Ok(node_conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 计算output_smt_size
|
||||||
|
fn calculate_output_smt_size(&self, block: &CoreBlock, prev_output_smt_size: u64) -> Result<u64> {
|
||||||
|
// 创建JellyfishMerkleTree用于计算
|
||||||
|
let mock_store = MockTreeStore::new(true);
|
||||||
|
let output_smt = JellyfishMerkleTree::<_, SmtHasher>::new(&mock_store);
|
||||||
|
|
||||||
|
let mut batch = Vec::new();
|
||||||
|
|
||||||
|
// 处理所有输出(添加新的叶子节点)
|
||||||
|
for output in block.body.outputs() {
|
||||||
|
if !output.is_burned() {
|
||||||
|
let smt_key = KeyHash(
|
||||||
|
output.commitment.as_bytes().try_into().expect("commitment is 32 bytes")
|
||||||
|
);
|
||||||
|
let smt_value = output.smt_hash(block.header.height);
|
||||||
|
batch.push((smt_key, Some(smt_value.to_vec())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理所有输入(删除叶子节点)
|
||||||
|
for input in block.body.inputs() {
|
||||||
|
let smt_key = KeyHash(
|
||||||
|
input.commitment()?.as_bytes().try_into().expect("Commitment is 32 bytes")
|
||||||
|
);
|
||||||
|
batch.push((smt_key, None));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算SMT变化
|
||||||
|
let (_, changes) = output_smt
|
||||||
|
.put_value_set(batch, block.header.height)
|
||||||
|
.map_err(|e| anyhow!("SMT calculation error: {}", e))?;
|
||||||
|
|
||||||
|
// 计算新的output_smt_size
|
||||||
|
let mut size = prev_output_smt_size;
|
||||||
|
size += changes.node_stats.first().map(|s| s.new_leaves).unwrap_or(0) as u64;
|
||||||
|
size = size.saturating_sub(changes.node_stats.first().map(|s| s.stale_leaves).unwrap_or(0) as u64);
|
||||||
|
|
||||||
|
Ok(size)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get_block_template_and_coinbase(&mut self) -> Result<MiningTask> {
|
pub async fn get_block_template_and_coinbase(&mut self) -> Result<MiningTask> {
|
||||||
info!(target: LOG_TARGET, "Getting new block template");
|
info!(target: LOG_TARGET, "Getting new block template");
|
||||||
|
|
||||||
|
@ -274,12 +320,29 @@ impl GbtClient {
|
||||||
body.kernels.push(coinbase_kernel.into());
|
body.kernels.push(coinbase_kernel.into());
|
||||||
|
|
||||||
// 获取完整的区块
|
// 获取完整的区块
|
||||||
let block_result = self.base_node_client.get_new_block(block_template).await?.into_inner();
|
let block_result = self.base_node_client.get_new_block(block_template.clone()).await?.into_inner();
|
||||||
let block = block_result.block.ok_or_else(|| anyhow!("No block in response"))?;
|
let block = block_result.block.ok_or_else(|| anyhow!("No block in response"))?;
|
||||||
|
|
||||||
// 计算coinbase哈希
|
// 计算coinbase哈希
|
||||||
let coinbase_hash = coinbase_output.hash().to_hex();
|
let coinbase_hash = coinbase_output.hash().to_hex();
|
||||||
|
|
||||||
|
// 将gRPC Block转换为CoreBlock以便计算output_smt_size
|
||||||
|
let core_block: CoreBlock = block.clone().try_into()
|
||||||
|
.map_err(|e| anyhow!("Block conversion error: {}", e))?;
|
||||||
|
|
||||||
|
// 获取前一个区块的output_smt_size(从区块模板头中获取)
|
||||||
|
let prev_output_smt_size = block_template
|
||||||
|
.header
|
||||||
|
.as_ref()
|
||||||
|
.ok_or_else(|| anyhow!("No header in block template"))?
|
||||||
|
.output_smt_size;
|
||||||
|
|
||||||
|
// 计算新的output_smt_size
|
||||||
|
let calculated_output_smt_size = self.calculate_output_smt_size(&core_block, prev_output_smt_size)?;
|
||||||
|
|
||||||
|
info!(target: LOG_TARGET, "Calculated output_smt_size: {} (prev: {})",
|
||||||
|
calculated_output_smt_size, prev_output_smt_size);
|
||||||
|
|
||||||
// 序列化区块模板
|
// 序列化区块模板
|
||||||
let block_template_json = serde_json::to_string(&block).map_err(|e| anyhow!("Serialization error: {}", e))?;
|
let block_template_json = serde_json::to_string(&block).map_err(|e| anyhow!("Serialization error: {}", e))?;
|
||||||
|
|
||||||
|
@ -287,6 +350,7 @@ impl GbtClient {
|
||||||
coinbase_hash,
|
coinbase_hash,
|
||||||
height,
|
height,
|
||||||
target: target_difficulty,
|
target: target_difficulty,
|
||||||
|
output_smt_size: calculated_output_smt_size, // 使用计算出的值
|
||||||
block_template: block_template_json,
|
block_template: block_template_json,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -307,7 +371,8 @@ impl GbtClient {
|
||||||
.send_multipart(&["mining_task".as_bytes(), task_json.as_bytes()], 0)
|
.send_multipart(&["mining_task".as_bytes(), task_json.as_bytes()], 0)
|
||||||
.map_err(|e| anyhow!("ZMQ send error: {}", e))?;
|
.map_err(|e| anyhow!("ZMQ send error: {}", e))?;
|
||||||
|
|
||||||
info!(target: LOG_TARGET, "Sent mining task for height {} with target {}", task.height, task.target);
|
info!(target: LOG_TARGET, "Sent mining task for height {} with target {} and output_smt_size {}",
|
||||||
|
task.height, task.target, task.output_smt_size);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue