「币圈小白进阶计划」“区块链的骨骼”之编码算法

文/韩大楠

原文首发币乎

图片发自App


大家好,我是大楠呀!

这是「币圈小白进阶计划」的第十六篇,希望大家多多给出建议。

谢谢大家!


写在前面

最近大楠再看各种算法,共识写完了,也写完了加密算法,但是还有编码/解码算法......

你可知道密码学么?在此之前,我只知道栅栏加密法和凯撒密码这两种。密码学它是一种隐藏信息的科学和艺术,它们是保密的,也可以说是一种秘密消息传递的科学。

在计算机语言中,要对信息进行加密。而区块链的世界中也是样的,要对信息进行加密,保证数据安全,使之不被篡改。

而这篇文章写的只是区块链骨骼中的一部分——编码/解码算法。编码算法包括Base64、Base6458、Base58Check。

文章会写的比较硬,你可能真心看不懂,但大楠也是在探索中,有些的东西也搞得不是很明白,所以,这可以作为小白进阶资料。


编码/解码算法

计算机使用二进制进行编码,而不是我们熟悉的十进制,最重要的原因是二进制物理上更容易实现。二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。

比如说,数字2323,转化为二进制就是100100010011。但是,二进制考验人的记忆力,人们很难记住16进制的信息,如果是16进制编码的文本字符串就相对好记好读一些了。

那这里就有一张ASCII码表(其中的一部分)。

(图片来自网络)

我们来看上图,07是一个Bell(响铃),如果用计算机程序去打印,结果是,只能听到一声铃声。而比特币的地址是16进制的数,不做转换,人们根本不知道那是什么。

假如,你的账户有77块钱,根据10进制的编码就是大写字符M。如果把数字77转换成文本“77”(16进制编码是3737)后再打印,那么显示在屏幕上的文本就是77。

咱们来看这个表:


Base64

Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单。

用64个字符来表示任意二进制数据的方法,通常exe、jpg、pdf等文件都是二进制文件,

Base64,就是通过64个字符来编码的,具体请见下表:


Base64的编码过程:

Base64可以将ASCII字符串或者是二进制编码成只包含A—Z,a—z,0—9,+,/ 这64个字符( 26个大写字母,26个小写字母,10个数字,1个+,一个 / 刚好64个字符)。

这64个字符用6个bit位就可以全部表示出来,一个字节有8个bit 位,那么还剩下两个bit位,这两个bit位用0来补充。

一个Base64字符仍然是8个bit位,但是有效部分只有右边的6个 bit,左边两个永远是0。

Base64的编码规则是将3个8位字节(3×8=24位)编码成4个6位的字节(4×6=24位),之后在每个6位字节前面,补充两个0,形成4个8位字节的形式,那么取值范围就变成了0~63。

2的6次方等于64,所以每6个位组成一个单元。


Base58

Base58是基于58个字母和数字组成的,Base58实际上就是Base64的一个子集,相对于Base64来说,Base58不包括以下Base64的字符:

数字0

大写字母O

大写字母I

小写字母l

+与/

小写o和大写O很容易和数字0混淆,小写l和大写I很容易和数字1混淆,Base58就是Base64去除了几个看起来容易混淆的字符以及容易导致转义的/和+。

Base58的编码表如下:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

必须注意,不同的应用实现使用的编码表内容是一样的,但是顺序可能不一样,比如:

1)比特币地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

Ripple (一个开源、分布式的支付协议)


Base58Check

Base58Check可以说是Base58的一种编码形式,在比特币系统中生成钱包地址的时候就使用到了这种编码形式,Base58Check就是Base58加上校验码。

在二进制数据的传输过程中,为了防止数据传输的错误,保护数据安全,通常会加一个校验码。

Base58Check的编码方式是这样的:进行编码前,在待编码的内容字符串中加入一个字节的版本信息,版本信息可以自行约定。

比如比特币地址采用了0×00作为版本信息,然后再计入编码内容字符串的哈希值,通常只要取得哈希值中的4个字节就可以了,加到一起后,然后再整体进行Base58编码。

比特币地址的生成过程中,是将版本字节放在了头部,而将4个字节的哈希值放在了尾部,然后进行编码生成。

经过整理编码后的数据在传输过程中如果有发生损坏或者篡改,接收方在得到数据后,会对原始数据进行同样的校验码计算,并且和接收到的结果中的校验码进行比较。

由于哈希算法的特点,只要原始数据有任何更改,计算出的哈希值都会发生变更,因此只要校验码不一致就说明数据不是合法的。


参考资料

1、https://ke.qq.com/course/322857?taid=2781154533240105

https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii%E7%A0%81%E8%A1%A8&fromid=19660475&fr=aladdin

https://baike.baidu.com/item/base64/8545775?fr=aladdin

https://en.bitcoin.it/wiki/Base58Check_encoding

https://mistydew.github.io/blog/2018/05/base58-encoding.html

2、参考书籍《白话区块链》、《区块链:定义未来金融和经济新格局》


写在后面

以上就是大楠的小白科普第十六篇——“区块链的骨骼”之编码算法,你要是发现了什么不对的地方,要和大楠说啊,就在评论区,留言给我啦。

感谢大家啊!


大楠是谁?

一个很偶然撞进币乎的币圈小白,是个正在不断成长的大楠。

那你喜欢她么?

当然喜欢啦,大楠欢迎来撩哦。

微信:15222567477,加大楠也要备注的呢,就叫~

你可能感兴趣的:(「币圈小白进阶计划」“区块链的骨骼”之编码算法)