Browse Source

更新 'quick_consolidate.sh'

maxmind 2 months ago
parent
commit
4fe3a8c835
1 changed files with 71 additions and 18 deletions
  1. 71 18
      quick_consolidate.sh

+ 71 - 18
quick_consolidate.sh

@@ -12,6 +12,7 @@ DEFAULT_MASTER_PUBKEY="33zmSubiizyAVzeSfKbVtLMKifm5u6VaTt9wae5K4CT6h5PLXovecjYwx
 # 颜色输出
 GREEN='\033[0;32m'
 BLUE='\033[0;34m'
+RED='\033[0;31m'
 NC='\033[0m'
 
 print_info() {
@@ -22,6 +23,10 @@ print_success() {
     echo -e "${GREEN}[SUCCESS]${NC} $1"
 }
 
+print_error() {
+    echo -e "${RED}[ERROR]${NC} $1"
+}
+
 # 显示帮助
 show_help() {
     echo "快速UTXO归集脚本"
@@ -83,7 +88,11 @@ nockchain-wallet scan --master-pubkey "$MASTER_PUBKEY"
 
 # 2. 获取所有notes
 print_info "获取notes列表..."
-NOTES_OUTPUT=$(nockchain-wallet list-notes 2>&1 | strings)
+NOTES_OUTPUT=$(nockchain-wallet list-notes 2>&1 | strings | sed 's/\x1b\[[0-9;]*m//g')
+
+# 调试:显示原始输出格式
+print_info "原始notes输出格式:"
+echo "$NOTES_OUTPUT" | head -20
 
 # 3. 解析notes并构建参数
 NAMES=""
@@ -93,28 +102,33 @@ TOTAL_BALANCE=0
 NOTE_COUNT=0
 
 # 提取Name和Assets信息
-# Name字段是跨行的,需要特殊处理,并保持完整的方括号格式
-ASSETS_LINES=$(echo "$NOTES_OUTPUT" | grep "Assets:" | sed 's/.*Assets: \([0-9]*\).*/\1/')
+# 先处理跨行的note名称,将换行符替换为空格
+CLEANED_OUTPUT=$(echo "$NOTES_OUTPUT" | tr '\n' ' ' | sed 's/\[/\n\[/g' | sed 's/\]/\]\n/g' | grep '^\[' | sed 's/^\[\(.*\)\]$/\1/' | grep -E '^[A-Za-z0-9 ]{20,}$')
 
-# 手动构建完整的note名称
+# 重新构建完整的note名称
 NAMES_LINES=""
 while IFS= read -r line; do
-    if [[ $line =~ Name: ]]; then
-        # 提取前缀部分 (去掉 "- Name: [" 和行末的换行)
-        prefix=$(echo "$line" | sed 's/^- Name: \[\(.*\)$/\1/' | sed 's/[[:space:]]*$//')
-        # 读取下一行获取后缀部分
-        read -r next_line
-        # 去掉后缀末尾的 "]"
-        suffix=$(echo "$next_line" | sed 's/\]$//')
-        # 构建完整的note名称: [prefix suffix]
-        full_name="[$prefix $suffix]"
-        NAMES_LINES+="$full_name"$'\n'
+    if [[ -n "$line" ]]; then
+        # 将空格分隔的两部分重新组合成方括号格式
+        parts=($line)
+        if [[ ${#parts[@]} -eq 2 ]]; then
+            full_name="[${parts[0]} ${parts[1]}]"
+            NAMES_LINES+="$full_name"$'\n'
+        fi
     fi
-done <<< "$NOTES_OUTPUT"
+done <<< "$CLEANED_OUTPUT"
+
+ASSETS_LINES=$(echo "$NOTES_OUTPUT" | grep "Assets:" | sed 's/.*Assets: \([0-9]*\).*/\1/')
+
+print_info "提取的NAMES_LINES:"
+echo "$NAMES_LINES" | head -10
+print_info "提取的ASSETS_LINES:"
+echo "$ASSETS_LINES" | head -10
 
 # 将Name和Assets转换为数组(使用 mapfile 避免 set -e 下的 read -d 错误)
-mapfile -t NAMES_ARRAY < <(printf '%s\n' "$NAMES_LINES")
-mapfile -t ASSETS_ARRAY < <(printf '%s\n' "$ASSETS_LINES")
+# 过滤掉空行
+mapfile -t NAMES_ARRAY < <(printf '%s\n' "$NAMES_LINES" | grep -v '^$')
+mapfile -t ASSETS_ARRAY < <(printf '%s\n' "$ASSETS_LINES" | grep -v '^$')
 
 if [[ ${#NAMES_ARRAY[@]} -eq 0 || ${#ASSETS_ARRAY[@]} -eq 0 ]]; then
     print_info "没有找到可归集的notes"
@@ -137,6 +151,18 @@ for i in "${!NAMES_ARRAY[@]}"; do
     note_name="${NAMES_ARRAY[$i]}"
     balance="${ASSETS_ARRAY[$i]}"
     
+    # 验证note_name和balance不为空
+    if [[ -z "$note_name" || -z "$balance" ]]; then
+        print_error "发现空的note名称或余额,跳过: name='$note_name', balance='$balance'"
+        continue
+    fi
+    
+    # 验证balance是数字
+    if ! [[ "$balance" =~ ^[0-9]+$ ]]; then
+        print_error "发现无效的余额格式,跳过: '$balance'"
+        continue
+    fi
+    
     if [[ -n "$NAMES" ]]; then
         NAMES+=","
         RECIPIENTS+=","
@@ -172,11 +198,38 @@ fi
 
 print_info "找到 $NOTE_COUNT 个notes,总余额: $TOTAL_BALANCE nicks"
 
+# 验证参数长度一致性
+NAMES_COUNT=$(echo "$NAMES" | tr ',' '\n' | grep -v '^$' | wc -l)
+RECIPIENTS_COUNT=$(echo "$RECIPIENTS" | tr ',' '\n' | grep -v '^$' | wc -l)
+GIFTS_COUNT=$(echo "$GIFTS" | tr ',' '\n' | grep -v '^$' | wc -l)
+
+print_info "调试信息:"
+print_info "NAMES 长度: $NAMES_COUNT"
+print_info "RECIPIENTS 长度: $RECIPIENTS_COUNT"
+print_info "GIFTS 长度: $GIFTS_COUNT"
+print_info "NAMES 内容: $NAMES"
+print_info "RECIPIENTS 内容: $RECIPIENTS"
+print_info "GIFTS 内容: $GIFTS"
+
+# 检查参数长度是否一致
+if [[ $NAMES_COUNT -ne $RECIPIENTS_COUNT || $NAMES_COUNT -ne $GIFTS_COUNT || $RECIPIENTS_COUNT -ne $GIFTS_COUNT ]]; then
+    print_error "参数长度不一致!"
+    print_error "NAMES: $NAMES"
+    print_error "RECIPIENTS: $RECIPIENTS"
+    print_error "GIFTS: $GIFTS"
+    exit 1
+fi
+
 # 4. 创建归集交易
 print_info "创建归集交易..."
 print_info "归集到地址: $RECIPIENT"
 print_info "手续费: $FEE nicks"
 
-nockchain-wallet create-tx --names "$NAMES" --recipients "$RECIPIENTS" --gifts "$GIFTS" --fee "$FEE"
+nock_cmd="nockchain-wallet create-tx --names \"$NAMES\" --recipients \"$RECIPIENTS\" --gifts \"$GIFTS\" --fee \"$FEE\""
+print_info "即将执行命令(可复制粘贴手动运行):"
+echo "$nock_cmd"
+
+# 使用 eval 来正确执行包含引号的命令
+eval "$nock_cmd"
 
 print_success "归集完成!归集了 $NOTE_COUNT 个notes,总金额: $TOTAL_BALANCE nicks"