
逃出生天:不同威胁下的钱包恢复策略
前言今年看到很多关于「抢劫加密货币」的新闻:乌克兰男出门遇害埋尸森林,钱包 3 枚BTC被匪徒抢走暴力集团锁定加密货币持有者,全美多地爆「入室抢劫」比特币新加坡「币圈聚会打牌」遭持枪抢劫! 11人被迫转出加密钱包,损失超过1亿台币…针对于加密货币实施的犯罪不仅存在于比特世界,在原子世界也变得越来越频繁。今天读到《精通比特币》第三版「种子和恢复码」部分,结合自己之前经历过的钱包安全事件,脑海中出现很多经典的犯罪场景,针对于这些场景,我们可以采用哪些技术手段来保证自己的资产安全呢?💡 在此之前,你需要知道的:种子技术是一种在加密货币钱包中用于生成私钥和公钥的技术。通过生成一个随机数作为种子,再利用该种子计算出多个私钥和公钥对,从而实现钱包的生成和恢复。恢复码是一组用于恢复钱包的助记词,是种子的可读形式。常见的恢复码由12到24个单词组成(如 BIP39),这是通过将种子编码为单词序列得到的。用户可以手动记录这组单词,用于在钱包丢失或损坏时恢复钱包。假设场景场景 1:劫持威胁情景描述加入你遇到了劫匪,劫匪要求你必须交出比特币钱包的恢复码,你不想暴露自己的全部资产,但又要交出一些钱来保...

研报 - Corn, 第一个使用 BTC 作为 Gas 费的以太坊 Layer2
摘要Corn 项目通过创新性的技术和经济模型,旨在增强比特币(BTC)的流动性,为用户、应用和流动性提供者带来多方收益。该项目获得了由 Polychain Capital 领投的 670 万美元融资,吸引了包括 Binance Labs 在内的多家知名投资机构的参与。Corn 项目的团队成员拥有丰富的区块链和 DeFi 经验,其核心团队曾主导过多个成功的区块链项目。本文将详细分析 Corn 项目的市场背景、团队实力、技术特点及未来发展潜力。项目基本情况融资情况2024 年 8 月 20 日,Corn 宣布获得了 670 万美金的融资,由 Polychain Capital 领投,Binance Labs,Framework,ABCDE,Symbolic Capital,HTX Capital,Relayer Capital 等知名投资机构参投。 从上币角度来看,能获得 Binance Labs 投资,技术上作为 EVM 兼容的 Layer2 解决方案,品牌故事又着重在 BTCFi 上,很可能和 BNBChain 或 BTCB 发生关联。所以代币极大可能会上线币安交易所。团队情况我...

详解椭圆曲线加密
为什么需要椭圆曲线加密?理解非对称加密在加密货币中,如果 Alice 向 Bob 转账,需要满足两个基本条件:证明这笔转账是 Alice 触发的 → 签名;Bob 收到了这笔转账,且 Bob 可以消费 Alice 转给他的钱 → 验证。这其中的签名就是 Alice 的私钥生成公钥的过程,而验证则是验证 Alice 的公钥,且保证 Alice 的公钥无法推导出 Alice 的私钥,因为如果大家都可以推导出私钥,那人人都可以代替 Alice 签名,从而转走 Alice 的资产。公私钥对转换逻辑这种加密方式我们称为非对称加密,即可以从 A→B,但很难从 B→A。有几种比较合适的数学函数可以满足这种加密理念,比如素数指数和椭圆曲线。他们的理念都是一样的,为了更好的理解后者,我们可以先用素数指数做一个「热身」。素数在加密中的作用在很多加密系统中,素数起着至关重要的作用。什么是素数?就是大于 1 的自然数,只能被 1 和它本身整除。比如 2,3,5,7 为素数,而 4,6,8,9 则不是素数。2 = 1 * 2 ✅ 3 = 1 * 3 ✅ 5 = 1 * 5 ✅ 7 = 1 * 7 ✅ 4 ...
👋 前 imToken 运营总监 | Mest 项目经理 区块链行业 8 年经验的从业者 📈 欢迎来到我的写作空间,期待与你在这里分享与交流!

逃出生天:不同威胁下的钱包恢复策略
前言今年看到很多关于「抢劫加密货币」的新闻:乌克兰男出门遇害埋尸森林,钱包 3 枚BTC被匪徒抢走暴力集团锁定加密货币持有者,全美多地爆「入室抢劫」比特币新加坡「币圈聚会打牌」遭持枪抢劫! 11人被迫转出加密钱包,损失超过1亿台币…针对于加密货币实施的犯罪不仅存在于比特世界,在原子世界也变得越来越频繁。今天读到《精通比特币》第三版「种子和恢复码」部分,结合自己之前经历过的钱包安全事件,脑海中出现很多经典的犯罪场景,针对于这些场景,我们可以采用哪些技术手段来保证自己的资产安全呢?💡 在此之前,你需要知道的:种子技术是一种在加密货币钱包中用于生成私钥和公钥的技术。通过生成一个随机数作为种子,再利用该种子计算出多个私钥和公钥对,从而实现钱包的生成和恢复。恢复码是一组用于恢复钱包的助记词,是种子的可读形式。常见的恢复码由12到24个单词组成(如 BIP39),这是通过将种子编码为单词序列得到的。用户可以手动记录这组单词,用于在钱包丢失或损坏时恢复钱包。假设场景场景 1:劫持威胁情景描述加入你遇到了劫匪,劫匪要求你必须交出比特币钱包的恢复码,你不想暴露自己的全部资产,但又要交出一些钱来保...

研报 - Corn, 第一个使用 BTC 作为 Gas 费的以太坊 Layer2
摘要Corn 项目通过创新性的技术和经济模型,旨在增强比特币(BTC)的流动性,为用户、应用和流动性提供者带来多方收益。该项目获得了由 Polychain Capital 领投的 670 万美元融资,吸引了包括 Binance Labs 在内的多家知名投资机构的参与。Corn 项目的团队成员拥有丰富的区块链和 DeFi 经验,其核心团队曾主导过多个成功的区块链项目。本文将详细分析 Corn 项目的市场背景、团队实力、技术特点及未来发展潜力。项目基本情况融资情况2024 年 8 月 20 日,Corn 宣布获得了 670 万美金的融资,由 Polychain Capital 领投,Binance Labs,Framework,ABCDE,Symbolic Capital,HTX Capital,Relayer Capital 等知名投资机构参投。 从上币角度来看,能获得 Binance Labs 投资,技术上作为 EVM 兼容的 Layer2 解决方案,品牌故事又着重在 BTCFi 上,很可能和 BNBChain 或 BTCB 发生关联。所以代币极大可能会上线币安交易所。团队情况我...

详解椭圆曲线加密
为什么需要椭圆曲线加密?理解非对称加密在加密货币中,如果 Alice 向 Bob 转账,需要满足两个基本条件:证明这笔转账是 Alice 触发的 → 签名;Bob 收到了这笔转账,且 Bob 可以消费 Alice 转给他的钱 → 验证。这其中的签名就是 Alice 的私钥生成公钥的过程,而验证则是验证 Alice 的公钥,且保证 Alice 的公钥无法推导出 Alice 的私钥,因为如果大家都可以推导出私钥,那人人都可以代替 Alice 签名,从而转走 Alice 的资产。公私钥对转换逻辑这种加密方式我们称为非对称加密,即可以从 A→B,但很难从 B→A。有几种比较合适的数学函数可以满足这种加密理念,比如素数指数和椭圆曲线。他们的理念都是一样的,为了更好的理解后者,我们可以先用素数指数做一个「热身」。素数在加密中的作用在很多加密系统中,素数起着至关重要的作用。什么是素数?就是大于 1 的自然数,只能被 1 和它本身整除。比如 2,3,5,7 为素数,而 4,6,8,9 则不是素数。2 = 1 * 2 ✅ 3 = 1 * 3 ✅ 5 = 1 * 5 ✅ 7 = 1 * 7 ✅ 4 ...
👋 前 imToken 运营总监 | Mest 项目经理 区块链行业 8 年经验的从业者 📈 欢迎来到我的写作空间,期待与你在这里分享与交流!

Subscribe to Simon 写字的地方

Subscribe to Simon 写字的地方
<100 subscribers
<100 subscribers
Share Dialog
Share Dialog


2016 年,我刚加入区块链行业,当时在 imToken 做钱包就遇到了一个问题:
得到的比较笼统的回答一般是,这样做矿工篡改的成本过高。这当然是一个正确的答案,但却过于表面。
最近在重读《精通比特币》第三版,这是去年年底最新修订的版本,看到书中提及了这一内容,所以单独拿出来说说。
首先我们要明确两个概念:
区块高度:告诉我们在该区块之前有多少个区块;
确认:代表区块深度,即在该区块之后已经存在多少区块,表明改变该区块中任何交易的难度。

我们通过 getblockhash 命令,从 bitcoin core 的 API 拉取区块信息的时候会得到如下信息
{
"hash": "0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca",
"confirmations": 651742,
"height": 123456,
"version": 1,
"versionHex": "00000001",
"merkleroot": "0e60651a9934e8f0decd1c[...]48fca0cd1c84a21ddfde95033762d86c",
"time": 1305200806,
"mediantime": 1305197900,
"nonce": 2436437219,
"bits": "1a6a93b3",
"difficulty": 157416.4018436489,
"chainwork": "[...]00000000000000000000000000000000000000541788211ac227bc",
"nTx": 13,
"previousblockhash": "[...]60bc96a44724fd72daf9b92cf8ad00510b5224c6253ac40095",
"nextblockhash": "[...]00129f5f02be247070bf7334d3753e4ddee502780c2acaecec6d66",
"strippedsize": 4179,
"size": 4179,
"weight": 16716,
"tx": [
"5b75086dafeede555fc8f9a810d8b10df57c46f9f176ccc3dd8d2fa20edd685b",
"e3d0425ab346dd5b76f44c222a4bb5d16640a4247050ef82462ab17e229c83b4",
"137d247eca8b99dee58e1e9232014183a5c5a9e338001a0109df32794cdcc92e",
"5fd167f7b8c417e59106ef5acfe181b09d71b8353a61a55a2f01aa266af5412d",
"60925f1948b71f429d514ead7ae7391e0edf965bf5a60331398dae24c6964774",
"d4d5fc1529487527e9873256934dfb1e4cdcb39f4c0509577ca19bfad6c5d28f",
"7b29d65e5018c56a33652085dbb13f2df39a1a9942bfe1f7e78e97919a6bdea2",
"0b89e120efd0a4674c127a76ff5f7590ca304e6a064fbc51adffbd7ce3a3deef",
"603f2044da9656084174cfb5812feaf510f862d3addcf70cacce3dc55dab446e",
"9a4ed892b43a4df916a7a1213b78e83cd83f5695f635d535c94b2b65ffb144d3",
"dda726e3dad9504dce5098dfab5064ecd4a7650bfe854bb2606da3152b60e427",
"e46ea8b4d68719b65ead930f07f1f3804cb3701014f8e6d76c4bdbc390893b94",
"864a102aeedf53dd9b2baab4eeb898c5083fde6141113e0606b664c41fe15e1f"
]
}
这其中有一个 mediantime 字段,我们称之为「中位时间」- MTP。该「中位时间」是从(该区块的)之前 11 个区块计算得到的中位时间。
中位数具有更好的「抗操纵性」,它是统计学上用于测量数据集中趋势的一个稳健估计值,特别适合处理含有异常值(outliers)的数据。相比于平均值(容易受到极端值的影响),中位数只关心排序后最中间的值,因此少量极端值(时间戳被操控的区块)不会显著改变结果。
首先如果计算中位数,那么最好选择一个「奇数」,奇数的好处是中位数始终是一个确定的值,因为可以准确地取中间的那个值(比如第 6 个区块),避免了偶数情况下取两个中间值再平均的复杂性。
而选择 11 个区块的原因与中位数的特性有关,因为它能很好地处理小样本中的极端值,同时保持计算的简便性。
简单来说就是它足够小以保持计算效率,同时又足够大确保抗操纵性:
足够大:选择较少的区块(比如 3 个、5 个)可能会使中位数过于容易受到单个矿工的操纵;
足够小:如果选择更多的区块(比如 21 个、31 个),虽然抗操纵性会更强,但计算复杂度和资源消耗也会增加,效率降低。
之前我们谈到,中位数是将数据排序后,选择中间位置的那个数值。而在 11 个区块的情况下,中位数是第 6 个区块的时间戳(按照时间戳大小排序后)。
要改变中位数的值,矿工至少需要控制超过一半的区块。因为中位数是基于排序后的位置值决定的,改变排序的多数才能影响最终的中位数。 💡 在 11 个区块的情况下:
如果矿工只控制 5 个区块,这些区块的时间戳只能影响排序的前半部分,但无法影响中位数(第 6 个位置)。
如果矿工控制了 6 个区块,他们就能确保排序后的中位数被自己的区块所决定,从而对整个链的时间戳产生影响。
我们有 11 个区块,假设这些区块的时间戳如下(单位是时间):
区块 1: 1628000000
区块 2: 1628000600
区块 3: 1628001200
区块 4: 1628001800
区块 5: 1628002400
区块 6: 1628003000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
现在,我们将这些时间戳从小到大进行排序(这里时间戳已经是按时间顺序递增的):
[1628000000, 1628000600, 1628001200, 1628001800, 1628002400,
1628003000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
在这个排序列表中,第 6 个区块的时间戳是 1628003000,这是过去 11 个区块的中位时间,也就是 MTP。
现在,假设一个矿工控制了一些区块,并试图通过篡改时间戳来影响中位数。
假设矿工控制了 区块 1、2、3、4、5,并且他们想通过操控这些区块的时间戳来改变 MTP。为了做到这一点,矿工将这些区块的时间戳篡改为一个非常小的值,假设为 1627000000。
篡改后的时间戳如下:
区块 1: 1627000000
区块 2: 1627000000
区块 3: 1627000000
区块 4: 1627000000
区块 5: 1627000000
区块 6: 1628003000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
排序后的时间戳为:
[1627000000, 1627000000, 1627000000, 1627000000, 1627000000,
1628003000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
你可以看到,虽然前 5 个区块的时间戳被篡改得很低,但中位数仍然是 1628003000,因为第 6 个区块的时间戳没有被矿工控制。
现在,假设矿工控制了 区块 1、2、3、4、5、6,并且他们同样篡改这些区块的时间戳为 1627000000。篡改后的时间戳如下:
区块 1: 1627000000
区块 2: 1627000000
区块 3: 1627000000
区块 4: 1627000000
区块 5: 1627000000
区块 6: 1627000000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
排序后的时间戳为:
[1627000000, 1627000000, 1627000000, 1627000000, 1627000000,
1627000000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
此时,新的中位数是 1627000000(第 6 个位置的时间戳),这是矿工篡改的时间戳。因此,通过控制 6 个区块,矿工成功操纵了 MTP。
所以,如果矿工控制了 6 个区块,他们就能保证至少有 6 个区块的时间戳是他们自己设定的。这样,无论剩余 5 个区块的时间戳如何,矿工控制的区块一定会影响或决定中位数。
要想了解为什么需要 6 个区块确认,就要了解为什么选择 11 作为「中位时间」校验。因为 11 相较于其他数字,具有足够的抗操纵性和高效性,这是一个权衡后的神奇数字。而如果想操纵 11 个区块的中位数,则需要满足 6 个确认才可以,这是一个简单的数学问题。
2016 年,我刚加入区块链行业,当时在 imToken 做钱包就遇到了一个问题:
得到的比较笼统的回答一般是,这样做矿工篡改的成本过高。这当然是一个正确的答案,但却过于表面。
最近在重读《精通比特币》第三版,这是去年年底最新修订的版本,看到书中提及了这一内容,所以单独拿出来说说。
首先我们要明确两个概念:
区块高度:告诉我们在该区块之前有多少个区块;
确认:代表区块深度,即在该区块之后已经存在多少区块,表明改变该区块中任何交易的难度。

我们通过 getblockhash 命令,从 bitcoin core 的 API 拉取区块信息的时候会得到如下信息
{
"hash": "0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca",
"confirmations": 651742,
"height": 123456,
"version": 1,
"versionHex": "00000001",
"merkleroot": "0e60651a9934e8f0decd1c[...]48fca0cd1c84a21ddfde95033762d86c",
"time": 1305200806,
"mediantime": 1305197900,
"nonce": 2436437219,
"bits": "1a6a93b3",
"difficulty": 157416.4018436489,
"chainwork": "[...]00000000000000000000000000000000000000541788211ac227bc",
"nTx": 13,
"previousblockhash": "[...]60bc96a44724fd72daf9b92cf8ad00510b5224c6253ac40095",
"nextblockhash": "[...]00129f5f02be247070bf7334d3753e4ddee502780c2acaecec6d66",
"strippedsize": 4179,
"size": 4179,
"weight": 16716,
"tx": [
"5b75086dafeede555fc8f9a810d8b10df57c46f9f176ccc3dd8d2fa20edd685b",
"e3d0425ab346dd5b76f44c222a4bb5d16640a4247050ef82462ab17e229c83b4",
"137d247eca8b99dee58e1e9232014183a5c5a9e338001a0109df32794cdcc92e",
"5fd167f7b8c417e59106ef5acfe181b09d71b8353a61a55a2f01aa266af5412d",
"60925f1948b71f429d514ead7ae7391e0edf965bf5a60331398dae24c6964774",
"d4d5fc1529487527e9873256934dfb1e4cdcb39f4c0509577ca19bfad6c5d28f",
"7b29d65e5018c56a33652085dbb13f2df39a1a9942bfe1f7e78e97919a6bdea2",
"0b89e120efd0a4674c127a76ff5f7590ca304e6a064fbc51adffbd7ce3a3deef",
"603f2044da9656084174cfb5812feaf510f862d3addcf70cacce3dc55dab446e",
"9a4ed892b43a4df916a7a1213b78e83cd83f5695f635d535c94b2b65ffb144d3",
"dda726e3dad9504dce5098dfab5064ecd4a7650bfe854bb2606da3152b60e427",
"e46ea8b4d68719b65ead930f07f1f3804cb3701014f8e6d76c4bdbc390893b94",
"864a102aeedf53dd9b2baab4eeb898c5083fde6141113e0606b664c41fe15e1f"
]
}
这其中有一个 mediantime 字段,我们称之为「中位时间」- MTP。该「中位时间」是从(该区块的)之前 11 个区块计算得到的中位时间。
中位数具有更好的「抗操纵性」,它是统计学上用于测量数据集中趋势的一个稳健估计值,特别适合处理含有异常值(outliers)的数据。相比于平均值(容易受到极端值的影响),中位数只关心排序后最中间的值,因此少量极端值(时间戳被操控的区块)不会显著改变结果。
首先如果计算中位数,那么最好选择一个「奇数」,奇数的好处是中位数始终是一个确定的值,因为可以准确地取中间的那个值(比如第 6 个区块),避免了偶数情况下取两个中间值再平均的复杂性。
而选择 11 个区块的原因与中位数的特性有关,因为它能很好地处理小样本中的极端值,同时保持计算的简便性。
简单来说就是它足够小以保持计算效率,同时又足够大确保抗操纵性:
足够大:选择较少的区块(比如 3 个、5 个)可能会使中位数过于容易受到单个矿工的操纵;
足够小:如果选择更多的区块(比如 21 个、31 个),虽然抗操纵性会更强,但计算复杂度和资源消耗也会增加,效率降低。
之前我们谈到,中位数是将数据排序后,选择中间位置的那个数值。而在 11 个区块的情况下,中位数是第 6 个区块的时间戳(按照时间戳大小排序后)。
要改变中位数的值,矿工至少需要控制超过一半的区块。因为中位数是基于排序后的位置值决定的,改变排序的多数才能影响最终的中位数。 💡 在 11 个区块的情况下:
如果矿工只控制 5 个区块,这些区块的时间戳只能影响排序的前半部分,但无法影响中位数(第 6 个位置)。
如果矿工控制了 6 个区块,他们就能确保排序后的中位数被自己的区块所决定,从而对整个链的时间戳产生影响。
我们有 11 个区块,假设这些区块的时间戳如下(单位是时间):
区块 1: 1628000000
区块 2: 1628000600
区块 3: 1628001200
区块 4: 1628001800
区块 5: 1628002400
区块 6: 1628003000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
现在,我们将这些时间戳从小到大进行排序(这里时间戳已经是按时间顺序递增的):
[1628000000, 1628000600, 1628001200, 1628001800, 1628002400,
1628003000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
在这个排序列表中,第 6 个区块的时间戳是 1628003000,这是过去 11 个区块的中位时间,也就是 MTP。
现在,假设一个矿工控制了一些区块,并试图通过篡改时间戳来影响中位数。
假设矿工控制了 区块 1、2、3、4、5,并且他们想通过操控这些区块的时间戳来改变 MTP。为了做到这一点,矿工将这些区块的时间戳篡改为一个非常小的值,假设为 1627000000。
篡改后的时间戳如下:
区块 1: 1627000000
区块 2: 1627000000
区块 3: 1627000000
区块 4: 1627000000
区块 5: 1627000000
区块 6: 1628003000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
排序后的时间戳为:
[1627000000, 1627000000, 1627000000, 1627000000, 1627000000,
1628003000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
你可以看到,虽然前 5 个区块的时间戳被篡改得很低,但中位数仍然是 1628003000,因为第 6 个区块的时间戳没有被矿工控制。
现在,假设矿工控制了 区块 1、2、3、4、5、6,并且他们同样篡改这些区块的时间戳为 1627000000。篡改后的时间戳如下:
区块 1: 1627000000
区块 2: 1627000000
区块 3: 1627000000
区块 4: 1627000000
区块 5: 1627000000
区块 6: 1627000000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
排序后的时间戳为:
[1627000000, 1627000000, 1627000000, 1627000000, 1627000000,
1627000000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
此时,新的中位数是 1627000000(第 6 个位置的时间戳),这是矿工篡改的时间戳。因此,通过控制 6 个区块,矿工成功操纵了 MTP。
所以,如果矿工控制了 6 个区块,他们就能保证至少有 6 个区块的时间戳是他们自己设定的。这样,无论剩余 5 个区块的时间戳如何,矿工控制的区块一定会影响或决定中位数。
要想了解为什么需要 6 个区块确认,就要了解为什么选择 11 作为「中位时间」校验。因为 11 相较于其他数字,具有足够的抗操纵性和高效性,这是一个权衡后的神奇数字。而如果想操纵 11 个区块的中位数,则需要满足 6 个确认才可以,这是一个简单的数学问题。
No activity yet