V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqingqian
V2EX  ›  程序员

求个思路,实现 BTC 离线签名,进行广播交易

  •  
  •   iqingqian · 2020-03-18 20:32:41 +08:00 · 3707 次点击
    这是一个创建于 1703 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人没有接触过比特币和区块链,近日面试接触了一家公司,给了这道面试题。搜了下,看网上资料不多。 V 友能不能帮忙提供相关思路和资料?若能提供参考代码可付费求!

    12 条回复    2020-03-27 17:05:40 +08:00
    aptx4689
        1
    aptx4689  
       2020-03-18 20:46:40 +08:00   ❤️ 1
    pycoin
    qq976739120
        2
    qq976739120  
       2020-03-18 20:54:06 +08:00   ❤️ 1
    这也太简单了吧.....把你的标题翻译成英文,然后去 google
    dzdh
        3
    dzdh  
       2020-03-18 21:00:26 +08:00   ❤️ 1
    1.有一个比特币钱包地址和其私钥
    2.通过 HTTP 接口或者自行同步全网数据获取到一个指定钱包地址的所有 unspent 交易获取其 txid
    3.分别将每一笔交易当作 input 指定其付款到的目标地址并进行签名
    4.通过本地钱包或者公网接口将签名过的交易广播到公网

    php exp:
    ```php
    $from_address = 'base32 string';
    $from_address_wifkey = 'key';
    $input_txid = 'sha';
    $input_amount = 0.003;

    $to_address = 'base32 string';
    $amount = 0.001;
    Transaction::builder()->input($input_txid,$input_amount)
    ->to($address2, $amount)
    ->hex();

    // 把地址 1 的一笔收入记录 txid(入账 0.003) 拿出来 付给 address2(0.001)
    // 然后 txid 被标记为 spent(从 unspent) 然后给 address2 0.001
    // 剩下 0.002 怎么办?没有特殊处理的“富裕”金额将被作为全网确认奖励消耗
    // 再如 from(txid,10)->to(address2,1) 剩 9 个 想付 2 个作为确认奖励那就再加一个收款方为付款方(我付给我自己) 7 个
    // 即: from(txid,10)->to(address2,1)->to(from_address,7) : 10=7-1=2(“无人认领”的金额将作为奖励) to(from_address)视为“找零”
    ```
    iqingqian
        4
    iqingqian  
    OP
       2020-03-18 21:16:28 +08:00
    @dzdh 大佬!这是可以用哪个类库吗?留个 vx 发个红包表示感谢
    dzdh
        5
    dzdh  
       2020-03-19 01:03:08 +08:00
    @iqingqian 忘了 gayhub 搜搜 bitcoin-php 看看
    stevenbipt
        6
    stevenbipt  
       2020-03-19 09:56:27 +08:00   ❤️ 1
    常见的做法先打包好一个 tx,将整个 tx 使用 rlp 序列化出来然后对序列化的字符串进行离线签名(签名用到了私钥),然后签完名以后得到一个字符串,将这个签名了交易的字符串广播到全网,有的做法是直接签 tx 的 hash,因为整个 tx 序列化出来也蛮大的
    stevenbipt
        7
    stevenbipt  
       2020-03-19 09:58:49 +08:00   ❤️ 1
    @stevenbipt 这个做法的账户模型是 UTXO 模型,Tx 里面包括了[]Txin 和[]Txout
    iqingqian
        8
    iqingqian  
    OP
       2020-03-19 11:28:48 +08:00 via iPhone
    @stevenbipt #7 大佬问个问题,我在 bitcoin core 获取地址对应的私钥。然后用代码验证,将这个私钥生成的地址和 bitcoin core 中的地址不一样呢?
    sunxiansong
        9
    sunxiansong  
       2020-03-19 13:17:13 +08:00   ❤️ 1
    如果没有接触过比特币,也没有兴趣,不干币圈这一行,那建议就放弃吧。

    这个是典型的冷钱包模式,核心就是存放私钥的设备不联网或者高度网络隔离。那么只要把创建好的交易给存储私钥的设备签名,完了弄上链就行了。创建交易最简单的可以用钱包 RPC,然后传给冷钱包签名(离线的话思路也不少,消息订阅、手工 USB 拷贝、相机扫描等等),签名好了再广播出去。

    和节点通信就是一般的 JSON RPC, 签名麻看你用什么语言,很多语言都有现成的签名库。
    iqingqian
        10
    iqingqian  
    OP
       2020-03-19 16:29:16 +08:00
    @sunxiansong 老哥说说放弃的原因啊
    lc7029
        11
    lc7029  
       2020-03-19 16:35:42 +08:00   ❤️ 1
    用过比太钱包,它的冷热钱包思路很好,冷钱包不联网,热钱包无私钥。发币时通过冷钱包签名,二维码传输签名信息到热钱包广播。
    这里是我写的使用文档,共两篇
    danteng.org/bither-wallet-1
    danteng.org/bither-wallet-2
    sunxiansong
        12
    sunxiansong  
       2020-03-27 17:05:40 +08:00
    @iqingqian

    如果没有兴趣,不干币圈这一行,那就没有必要花费精力研究加密货币
    加密货币涉及到 加密算法、共识机制、P2P 网络、记账模型等等,和一般的 CRUD 应用差别很大,入门前期需要花费大量的精力研究,可能还需要一定的数学、密码学基础。而且还在不断的衍进,要不停的学习跟进。
    另一方面,虽说区块链现在是风口,国家也在推,但加密货币的前景还是不太明了,特别是公链项目有很多坑、泡沫。
    年轻的话可以多尝试,求稳的话还是找个靠谱的公司、项目。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2747 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.