• btc钱包探索纪实


    起因:

    研究下btc转账,弄个自己的btc钱包,满足下好奇心,哈哈


    功能整理:

    1,公私钥,地址生成逻辑,私钥存储;

    2,转账,收款;

    3,转入转出记录爬取

    4,余额展示

    有了上述功能,一个钱包就可以使用了。


     

    功能实现(由于不想看源码,都准备用第三方接口)

    1,公私钥,地址生成 (比较简单)

        1),根据 bip32, bip39和bip44,生成公私钥

        2),再根据各个币种的地址规则,生成相应的地址

    2,收款:只是地址二维码展示

    3,转入转出记录:定时去BTC的浏览区爬取即可

    4,余额:获取的当前地址的未消费列表数据,第三方接口应该有余额的相应接口

    5,转账(这才是重点):

       1)从本地获取私钥,并封装公私钥地址信息

       2)获取未花费列表

       3)根据未花费数据,计算交易的输入,找零及最终的交易手续费

       4)封装交易数据

       5)使用私钥对交易数据进行签名

       6)调用广播上链接口,对离线签名的数据进行上链操作

       7)比特币是大概10分钟生成一个块,启动定时任务,根据交易hash查询交易数据,更新交易结果(可选,如果是中心化钱包,需要交易数据记录的话需要,去中心化的钱包)

    过程中遇到的坎儿:

    1,由于各种语言对数据类型的规范可能不太一样,在生成公私钥时生成的公私钥和浏览器工具里生成的公私钥不一致,费了好多功夫排查代码才检查出来。

    2,根据未花费数据,计算交易输入,输出和交易手续费时,

    1)一定要设置找零,刚开始弄的时候,就因为对比特币的这一特性没有深入了解,结果转一笔账就把剩余输入部分全当手续费给交了,幸亏是在测试网络上弄的,不然真要哭了(事实证明,偷懒是要付出代价的)

    2)一定要详细了解比特币的手续费的计算原理(交易数据字节数,输入交易币龄权重等),并根据自己产品的交易属性制定相应的计算策略,本来比特币的手续费就挺高,如果不注意的话,最高和最低,几十倍的差距还是存在的

    3,几经波折,终于将离线签名数据发到链上了,而且在浏览器上可以看到数据,再写定时查询程序,哎哟我去,第三方广播上链接口,竟然没返回交易hash,真坑啊,找了好几个浏览器的api都没返回,看了下测试节点的rpc API接口:decoderawtransaction反编译离线签名数据,可以获取到交易hash,和浏览器上对比,是一样的,有点挠头,恨不得自己搭个节点,重新弄,又有点不甘心(懒虫作祟)。

    4,最后,只能静下心来,冷静思考。事实证明,静心是太重要了,以前真的太浮躁了。

    既然未上链的数据可以解析出交易hash,而且和上链后的数据相同,这就说明交易hash是根据上链前的交易数据生成的,而不是上链成功后生成的。

    这么简单的道理,前面竟然没想到,浮躁真的浪费时间啊。

    明白的问题所在,还是得从交易hash原理入手(想偷懒,就得随时准备填坑),原来交易hash是离线签名数据进行两次sha256加密转换获取。


    总结

     

    做事总是源于兴趣,经历坎坷。从上面的描述就是可以看出,钱包的原理其实很简单很简单,可为什么会经历如此的波折呢?

    原因就是在于:

    1,太急躁,兴致上来,就急冲冲的去做,做起来没有条理可言。

    2,心不够静,做事之前首先要调整好心态,只有沉下心来对待一件事,才有可能把这件做好,要不然很有可能半途而废。浪费时间,也浪费精力。

  • 相关阅读:
    04:输出保留3位小数的浮点数
    让我们写一个 Win32 文本编辑器吧 - 2. 计划和显示
    【C++】指针与引用(学习笔记)
    pink老师前端CSS教程案例-学成在线首页
    MySQL查询条件时间忽略时分秒
    逻辑功能的几种基本描述方法
    聊聊分布式架构——序列化和反序列化
    ES6 | Symbol以及迭代器
    Kafka2.4.1的环境搭建
    离线数仓-用户行为采集
  • 原文地址:https://blog.csdn.net/fjza1168/article/details/126191975