起因:
研究下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,和浏览器上对比,是一样的,有点挠头,恨不得自己搭个节点,重新弄,又有点不甘心(懒虫作祟)。
最后,只能静下心来,冷静思考。事实证明,静心是太重要了,以前真的太浮躁了。
既然未上链的数据可以解析出交易hash,而且和上链后的数据相同,这就说明交易hash是根据上链前的交易数据生成的,而不是上链成功后生成的。这么简单的道理,前面竟然没想到,浮躁真的浪费时间啊。
明白的问题所在,还是得从交易hash原理入手(想偷懒,就得随时准备填坑),原来交易hash是离线签名数据进行两次sha256加密转换获取。
原理很简单,过程很坎坷!!!!!
网友评论