比特币买汉堡之3--账号的应用技术

设计一个区块链应用比构造一个类似比特币的网络要简单的多,但仍要掌握一些基本应用技术,首先就是关于账号管理的技术。

关于比特币的专有名词请参见官网《词汇表》

比特币账号

通常称为比特币地址,是一个用base58编码后的字符串,包含一个地址版本号,一个公钥的散列值(缩短和混淆了的公钥),一个校验码。如:3Mi8h8EJDVsxU5NwtHrbEXfGP8y5KszYVD。(这是我其中的一个比特币账号,欢迎转账测试:-D)

为防止追踪和追求更高的安全性,Bitcoin建议一个公开的账号只使用一次,然后通过Coinjoin交易归集资金。为了易于辨识订单收款情况,收款机可为每一笔订单生成一个新的账号。

开账户

即生成比特币地址。不同于银行开账户需要到银行办理,比特币账户可以私自开立(去中心化的也没地方可去开),只要符合其算法要求就可以。比特币网络只管(保存)交易不管理账户信息(户名、私钥等),得自已管,因此新开的账户也无需通知比特币网络,只有账户发生了第一笔交易时,账号才被比特币网络记录(相当于激活银行卡了)。

比特币地址是加入校验的公钥摘要。生成的过程是这样:

首先,生成私钥/公钥对

私钥=random32()

随机选取一个32字节(256bit)的数,作为私钥。

公钥=secp256k1(私钥)

使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的(非压缩)公钥。 (共65字节, 1字节 0x04, 32字节为x坐标,32字节为y坐标)。

因为此计算可以可靠地重复,公钥不需要存储,保存好私钥就行。

然后,计算比特币地址

比特币地址=1+Base58(0+公钥哈希值+校验码)    

注:0为网络版本号(比特币主网版本号“0x00”)

      1为地址类型版本前缀,见《地址前缀清单》

    公钥哈希值=RIMPED160(SHA256(公钥))

          校验码=前四字节(SHA256(SHA256(0+公钥哈希值)))

地址和公钥哈希值是等价的(可以互推)但公钥哈希值只能由公钥算出(不能逆推)。

验证的时候需要提供签名和公钥,算出公钥哈希值并和比特币支出脚本的公钥哈希值对比,最后再验证签名。这样就保证了公钥不会出现在支出脚本里。

(收入单提供签名,支出单提供公钥,或者收入单提供签名和公钥,支出单提供公钥哈希值,这两种验证办法是比特币的标准脚本)

重账号问题

去中心化,账号各自私下开立,那么如何象银行一样保证这账号跟别人不会重了呢?资金安不安全啊?

回答是,不保证不会重,但保证资金安全。

首先,重的概率很低

理论上新开的两比特币账号有可能相同,但实际上概率极低,有人粗算了一下相当于买福彩双色球中头奖的概率还要低333103亿倍!如果有人要偷你的账号,可能全球计算机一起算要算到太阳系毁灭才能碰对。

其次,如果真的重了

如果是私钥不同但生成了相同的账号,则哪个先发生交易哪个有效,因为不同私钥生成的签名不同,验证通不过。

有这样一个账号:1111111111111111111114oLvT2,是故意把公钥哈希全置0算出来的,有不少人拿它来测试,但谁也没算出它的私钥是什么,所以转进去的钱就相当于消失了。

如果是采用了相同内容的两个私钥,异致账号是相同的,此时这两个私钥的所有者才可以交易该账户。这种情况才是真正危险的。

如此,要保证账号的安全,首先,私钥必需采用真正的随机数,不要使用常见的有规律的数字,其次,生成账号后去比特币网查一查有没相同的账号。

你可能感兴趣的:(比特币买汉堡之3--账号的应用技术)