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

2020-03-18 20:32:41 +08:00
 iqingqian

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

3716 次点击
所在节点    程序员
12 条回复
aptx4689
2020-03-18 20:46:40 +08:00
pycoin
qq976739120
2020-03-18 20:54:06 +08:00
这也太简单了吧.....把你的标题翻译成英文,然后去 google
dzdh
2020-03-18 21:00:26 +08:00
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
2020-03-18 21:16:28 +08:00
@dzdh 大佬!这是可以用哪个类库吗?留个 vx 发个红包表示感谢
dzdh
2020-03-19 01:03:08 +08:00
@iqingqian 忘了 gayhub 搜搜 bitcoin-php 看看
stevenbipt
2020-03-19 09:56:27 +08:00
常见的做法先打包好一个 tx,将整个 tx 使用 rlp 序列化出来然后对序列化的字符串进行离线签名(签名用到了私钥),然后签完名以后得到一个字符串,将这个签名了交易的字符串广播到全网,有的做法是直接签 tx 的 hash,因为整个 tx 序列化出来也蛮大的
stevenbipt
2020-03-19 09:58:49 +08:00
@stevenbipt 这个做法的账户模型是 UTXO 模型,Tx 里面包括了[]Txin 和[]Txout
iqingqian
2020-03-19 11:28:48 +08:00
@stevenbipt #7 大佬问个问题,我在 bitcoin core 获取地址对应的私钥。然后用代码验证,将这个私钥生成的地址和 bitcoin core 中的地址不一样呢?
sunxiansong
2020-03-19 13:17:13 +08:00
如果没有接触过比特币,也没有兴趣,不干币圈这一行,那建议就放弃吧。

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

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

如果没有兴趣,不干币圈这一行,那就没有必要花费精力研究加密货币
加密货币涉及到 加密算法、共识机制、P2P 网络、记账模型等等,和一般的 CRUD 应用差别很大,入门前期需要花费大量的精力研究,可能还需要一定的数学、密码学基础。而且还在不断的衍进,要不停的学习跟进。
另一方面,虽说区块链现在是风口,国家也在推,但加密货币的前景还是不太明了,特别是公链项目有很多坑、泡沫。
年轻的话可以多尝试,求稳的话还是找个靠谱的公司、项目。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX