【区块链开发指南】区块链基础之比特币地址

比特币地址是一个由数字和字母组成的字符串,并且由公钥经过Hash函数生成。通常我们见到的比特币地址是经过Base58Check编码的,这种编码使用了58个字符和校验码,提高了可读性、避免了歧义,并能有效防止地址输入时产生的错误。

Base58编码

base58和base64一样是一种二进制转可视字符串的算法,主要用来转换大整数值。区别是,转换出来的字符串,去除了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ,和几个影响双击选择的字符,如/, +。结果字符集正好58个字符(包括9个数字,24个大写字母,25个小写字母)。

在比特币的实现中,Base58Check编码位于src\base58.cpp中,定义的所有字符如下:

/** All alphanumeric characters except for "0", "I", "O", and "l" */
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";

上图清楚的展示了如何将椭圆曲线(ECC)公钥转换成比特币地址,首先我们知道ECC公钥是指坐标上的一个点(x,y)横纵坐标分别用32字节表示,也就是256位。然后每个步骤最前面的“1”表示1个字节,用来代表不同的网络。最后就是两种哈希函数,sha256ripemd160,我们从它们名称结尾的数字就可以判断它们输出的比特位数,最后通过组合得出最到的比特币地址。

那么一个直接的问题就是,为什么地址生成的流程要这么复杂呢?

个人认为,这种设计是为了防御量子计算机的攻击,为了使比特币系统更加安全。我们知道,如果量子计算机被成功的建造了出来,那么现存的几乎所有的公钥密码系统都将被攻破,无论是基于大整数分解还是离散对数,亦或是椭圆曲线离散对数,都将是不安全的,而不安全的意思就是说能从公钥直接计算出私钥。但是哈希函数却依然是安全的,当然前提是哈希函数具有足够的随机性,只能通过暴力枚举的方式来破解,拿sha256来举例,输出为256位,那么哈希值的结果空间大小为2^256,这个空间大到就算量子计算机也无法在有效的时间内的破解。

在实际应用当中,假如地址A给地址B发送了一笔交易Tx1,那么B就可以通过将自己的公钥和签名写入新交易Tx2中从而将Tx1作为Tx2的输入,此时Tx2中就包括了地址B和B对应的公钥,一旦B将Tx2广播出去,那么所有人都将知道地址B和B对应的公钥,此时攻击者如果利用量子计算机进行攻击,那么此后所有转到地址B的交易攻击者都能进行花费;但是在B暴露自己的公钥之前,也就是没有花费过任何转到地址B的交易,那么即使有量子计算机也无法进行攻击。

通过以上解释,我们可以总结出量子计算机出来之后的比特币安全交易方式:不要重复使用已花费过的比特币地址,那么你的所有交易就是安全的。

你可能感兴趣的:(区块链开发指南)