CATProtocol / cat-token-box

A monorepo for packages implementing CAT protocol
https://catprotocol.org
MIT License
157 stars 100 forks source link

【必看】助记词与地址不匹配,非路径问题 #78

Open bolabola opened 5 days ago

bolabola commented 5 days ago

原因: cli用的这个btc 库有bug https://npmjs.com/package/bitcore-lib-inquisition 导致跟其他库生成的地址不一样 资产救援只需要助记词即可!

bolabola commented 5 days ago
import * as bip39 from 'bip39';
import btc from 'bitcore-lib-inquisition';
import BIP32Factory from 'bip32';
import * as ecc from 'tiny-secp256k1';
const bip32 = BIP32Factory(ecc);

const mnemonic = ''
const path = ""

if (!bip39.validateMnemonic(mnemonic)) throw new Error('Invalid mnemonic!');

const seed = bip39.mnemonicToSeedSync(mnemonic);
const mainnet = {
    messagePrefix: '\x18Bitcoin Signed Message:\n',
    bech32: 'bc',
    bip32: {
        public: 0x0488b21e,
        private: 0x0488ade4,
    },
    pubKeyHash: 0x00,
    scriptHash: 0x05,
    wif: 0x80,
};

const root = bip32.fromSeed(seed, mainnet);
const wif = root.derivePath(path).toWIF();
console.log(wif)

const privateKey = new btc.PrivateKey(wif, btc.Networks.mainnet);
console.log(privateKey.toString());

const address = privateKey.toAddress(null, btc.Address.PayToTaproot);
console.log(address.toString());

//示例,一定要换成自己的信息
let utxo = {
    "txId" : "115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986",
    "outputIndex" : 0,
    "address" : "17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV",
    "script" : "76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac",
    "satoshis" : 50000
  };

  let transaction = new btc.Transaction()
    .from(utxo)
    .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 15000)
    .change(address)
    .fee(10000000)
    .sign(privateKey)

console.log(transaction.toString())

拿到上面的输出去打cat 的机子上广播

curl --user bitcoin:opcatAwesome --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "sendrawtransaction", "params": ["替换我"]}' -H 'content-type: text/plain;' http://127.0.0.1:8332/
llqllq1024 commented 5 days ago

你好自己的 utxo 的信息获取?

bolabola commented 5 days ago

你好自己的 utxo 的信息获取? 可以 curl -sSL "https://mempool.fractalbitcoin.io/api/tx/15e10745f15593a899cef391191bdd3d7c12412cc4696b7bcb669d0feadc8521/raw" 或者fb节点rpc 来获取utxo

llqllq1024 commented 4 days ago

import btc from 'bitcore-lib-inquisition'; import BIP32Factory from 'bip32'; import as ecc from 'tiny-secp256k1'; import as bip39 from 'bip39'; import mempoolJS from "@mempool/mempool.js";

const getUtxo = async (address, script) => {

const {bitcoin: {addresses}} = mempoolJS({
    hostname: 'mempool.fractalbitcoin.io'
});

// const address = '1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY';
const addressTxsUtxo = await addresses.getAddressTxsUtxo({address});
// console.log(addressTxsUtxo);

const txId = addressTxsUtxo[0]['txid']
const outputIndex = addressTxsUtxo[0]['vout'];
const satoshis = addressTxsUtxo[0]['value'];

let utxo = {
    "txId": txId,
    "outputIndex": outputIndex,
    "address": address,
    "script": script,
    "satoshis": satoshis
};

console.log(utxo);
return utxo

};

const sendBoardCast = async (transactionTx) => { const {bitcoin: {transactions}} = mempoolJS({ hostname: 'mempool.fractalbitcoin.io' });

const txHex = transactionTx;

const txid = await transactions.postTx({txHex});
console.log(txid);
return txid

}

const buildTransaction = async () => {

const bip32 = BIP32Factory(ecc);

const mnemonic = '助记词'
const path = "m/44'/0'/0'/0/0"

const seed = bip39.mnemonicToSeedSync(mnemonic);
const mainnet = {
    messagePrefix: '\x18Bitcoin Signed Message:\n',
    bech32: 'bc',
    bip32: {
        public: 0x0488b21e,
        private: 0x0488ade4,
    },
    pubKeyHash: 0x00,
    scriptHash: 0x05,
    wif: 0x80,
};

const root = bip32.fromSeed(seed, mainnet);
const wif = root.derivePath(path).toWIF();
console.log(wif)

const privateKey = new btc.PrivateKey(wif, btc.Networks.mainnet);
console.log(privateKey.toString());

const address = privateKey.toAddress(null, btc.Address.PayToTaproot);
console.log(address.toString());

const script = new btc.Script(address).toHex()
console.log(script);
//示例,一定要换成自己的信息
let utxo = await getUtxo(address.toString(), script);

let transaction = new btc.Transaction()
    .from(utxo)
    .to('目标钱包', 5231157) //转账的目标地址,转账金额
    .change(address) //找零地址
    .fee(100000000) //交易手续费,单位是聪
    .sign(privateKey); //

console.log(transaction);
const tx = transaction.toString()
console.log(tx)
return tx

}

const sendTransaction = async () => { const tx = await buildTransaction() const txId = await sendBoardCast(tx) }

sendTransaction()

谢谢,能帮忙看一下我上面的代码有哪里错了吗?我运行发送广播总是400,还有就是satoshis,转账金额,fee 这三个的精度各是多少?

bolabola commented 4 days ago

import btc from 'bitcore-lib-inquisition'; import BIP32Factory from 'bip32'; import as ecc from 'tiny-secp256k1'; import as bip39 from 'bip39'; import mempoolJS from "@mempool/mempool.js";

const getUtxo = async (address, script) => {

const {bitcoin: {addresses}} = mempoolJS({
    hostname: 'mempool.fractalbitcoin.io'
});

// const address = '1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY';
const addressTxsUtxo = await addresses.getAddressTxsUtxo({address});
// console.log(addressTxsUtxo);

const txId = addressTxsUtxo[0]['txid']
const outputIndex = addressTxsUtxo[0]['vout'];
const satoshis = addressTxsUtxo[0]['value'];

let utxo = {
    "txId": txId,
    "outputIndex": outputIndex,
    "address": address,
    "script": script,
    "satoshis": satoshis
};

console.log(utxo);
return utxo

};

const sendBoardCast = async (transactionTx) => { const {bitcoin: {transactions}} = mempoolJS({ hostname: 'mempool.fractalbitcoin.io' });

const txHex = transactionTx;

const txid = await transactions.postTx({txHex});
console.log(txid);
return txid

}

const buildTransaction = async () => {

const bip32 = BIP32Factory(ecc);

const mnemonic = '助记词'
const path = "m/44'/0'/0'/0/0"

const seed = bip39.mnemonicToSeedSync(mnemonic);
const mainnet = {
    messagePrefix: '\x18Bitcoin Signed Message:\n',
    bech32: 'bc',
    bip32: {
        public: 0x0488b21e,
        private: 0x0488ade4,
    },
    pubKeyHash: 0x00,
    scriptHash: 0x05,
    wif: 0x80,
};

const root = bip32.fromSeed(seed, mainnet);
const wif = root.derivePath(path).toWIF();
console.log(wif)

const privateKey = new btc.PrivateKey(wif, btc.Networks.mainnet);
console.log(privateKey.toString());

const address = privateKey.toAddress(null, btc.Address.PayToTaproot);
console.log(address.toString());

const script = new btc.Script(address).toHex()
console.log(script);
//示例,一定要换成自己的信息
let utxo = await getUtxo(address.toString(), script);

let transaction = new btc.Transaction()
    .from(utxo)
    .to('目标钱包', 5231157) //转账的目标地址,转账金额
    .change(address) //找零地址
    .fee(100000000) //交易手续费,单位是聪
    .sign(privateKey); //

console.log(transaction);
const tx = transaction.toString()
console.log(tx)
return tx

}

const sendTransaction = async () => { const tx = await buildTransaction() const txId = await sendBoardCast(tx) }

sendTransaction()

谢谢,能帮忙看一下我上面的代码有哪里错了吗?我运行发送广播总是400,还有就是satoshis,转账金额,fee 这三个的精度各是多少?

留个邮箱,我联系你

KevinQuantJIN commented 4 days ago

大佬我遇到了相同的助记词与地址不匹配,非路径问题,这是我的邮箱,想向你请教一下,谢谢! 有以下几个问题

  1. 如何获取UTXO
  2. 资产救援的原理是什么,是把这个因不匹配导致的账号里面所有的资金都取出来吗 fractalbitcoin_jk@icloud.com
bolabola commented 4 days ago

大佬我遇到了相同的助记词与地址不匹配,非路径问题,这是我的邮箱,想向你请教一下,谢谢! 有以下几个问题

  1. 如何获取UTXO
  2. 资产救援的原理是什么,是把这个因不匹配导致的账号里面所有的资金都取出来吗 fractalbitcoin_jk@icloud.com

转入的那笔tx可以获取utxo,原理就是用它错误的代码把钱转出来,因为只有它的程序才能签名这个地址,你这地址收不了邮件 image

KevinQuantJIN commented 4 days ago

谢谢老板,我发现mempool的api不能用,我该怎么从rpc去拿这笔tx的utxo呢,我有一个自建的tracker在跑 换成这个邮箱吧 kevincrypto45@outlook.com

大佬我遇到了相同的助记词与地址不匹配,非路径问题,这是我的邮箱,想向你请教一下,谢谢! 有以下几个问题

  1. 如何获取UTXO
  2. 资产救援的原理是什么,是把这个因不匹配导致的账号里面所有的资金都取出来吗 fractalbitcoin_jk@icloud.com

转入的那笔tx可以获取utxo,原理就是用它错误的代码把钱转出来,因为只有它的程序才能签名这个地址,你这地址收不了邮件 image

skewliness commented 1 day ago

原因: cli用的这个btc库有bug https://npmjs.com/package/bitcore-lib-inquisition 导致跟其他库生成的地址不一样 救援资产只需要助记词即可!

skewliness11@gmail.com 老哥你的代码有点问题 我跑不起来 联系一下我 谢谢

bolabola commented 1 day ago

原因: cli用的这个btc库有bug https://npmjs.com/package/bitcore-lib-inquisition 导致跟其他库生成的地址不一样 救援资产只需要助记词即可!

skewliness11@gmail.com 老哥你的代码有点问题 我跑不起来 联系一下我 谢谢

代码更新了,再试试,不行再回复

skewliness commented 3 hours ago

原因:cli用的这个btc库有bug https://npmjs.com/package/bitcore-lib-inquisition导致跟其他库生成的地址不一样,救援资产只需要助记词即可

skewiness11@gmail.com老哥你的代码有点问题我找不到联系一下我谢谢

代码更新了,再尝试,不行再回复

不行,序列化会报错

bolabola commented 2 hours ago

原因:cli用的这个btc库有bug https://npmjs.com/package/bitcore-lib-inquisition导致跟其他库生成的地址不一样,救援资产只需要助记词即可!

skewiness11@gmail.com老哥你的代码有点问题我找不到联系一下我谢谢

代码更新了,再尝试,不行再回复

不行,序列化会报错

image

skewliness commented 2 hours ago

原因:cli用的这个btc库有bug https://npmjs.com/package/bitcore-lib-inquisition导致跟其他库生成的地址不一样,救援资产只需要助记词即可!

skewiness11@gmail.com老哥你的代码有点问题我找不到联系一下我谢谢

代码更新了,再尝试,不行再回复

不行,序列化会报错

图像

skewliness11@gmail.com