目录
数据在存储或者传输过程中一般都需要进行序列化,以太坊底层用的序列化库叫RLP(递归长度前缀编码),是一套独立的解编码算法。
区块链里面要求的是对于同样的内容,所有节点的结果都是一样的,这样才能互相验证,形成共识。在这样的前提之下,一个好的序列化算法要求字节完美一致,就是对于一个输入,只能确定的得到一个输出,对于一个输出,只能由这一种输入得到,这才是在共识场景下优秀的序列化算法。
能不能直接用JSON或者Protocol Buffers呢?
像JSON这种编码方式就达不到这个要求,它的key是无序的,而且在编码后存在大量的冗余字符,如果以太坊当时选用了JSON作为编码方式,那么现在在存储方面的成本就得至少提高个30%了。
Protocol Buffers的问题在于它并不保证对于同一个输出,只能由一种输入得到,而且在JavaScript这种弱类型语言里,所有数字都是number类型,底层用浮点数实现,在一些高精度场景就可能导致编码结果有一定的差异。