add base64 to hex

add output_smt_size but encording still is base64
This commit is contained in:
lzx 2025-06-26 15:22:52 +08:00
parent 28aa4e4650
commit bc9ca3ece5
2 changed files with 67 additions and 102 deletions

100
build.bat
View File

@ -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

View File

@ -56,6 +56,11 @@ use tari_core::{
},
};
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";
@ -65,6 +70,7 @@ pub struct MiningTask {
pub coinbase_hash: String,
pub height: u64,
pub target: u64,
pub output_smt_size: u64, // 新增output_smt_size
pub block_template: String, // 序列化的区块模板
}
@ -201,6 +207,46 @@ impl GbtClient {
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> {
info!(target: LOG_TARGET, "Getting new block template");
@ -274,12 +320,29 @@ impl GbtClient {
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"))?;
// 计算coinbase哈希
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))?;
@ -287,6 +350,7 @@ impl GbtClient {
coinbase_hash,
height,
target: target_difficulty,
output_smt_size: calculated_output_smt_size, // 使用计算出的值
block_template: block_template_json,
};
@ -307,7 +371,8 @@ impl GbtClient {
.send_multipart(&["mining_task".as_bytes(), task_json.as_bytes()], 0)
.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(())
}