可计算性与计算复杂性
现在的手机,电脑等计算设备能干的事情太多了,这些事情最终都被归结为对问题的描述和计算求解,形成数据和指令后被硬件执行。那么什么样的问题可以被计算?需要多少内存空间,多少CPU,多长时间呢?是否存在不可以被计算的问题?计算的本质又是什么呢?数学家和理论计算机科学家发展出了图灵机、递归函数、Lambda演算等模型来回答这些问题。最广为人知的模型是图灵机模型:一个在无限存储容量的纸带上来回移动,读写纸带存储内容的抽象计算机。这些模型的计算能力已经被证明是和冯·诺依曼结构的电子计算机的计算能力是等价的(机器语言、汇编语言),和C、JAVA、GO等编程语言的计算能力是等价的。因此这些编程语言也被称为是图灵完备的。简单来讲,对于一个问题:
1若能找到某个算法,可以在有限运算资源,有限时间内求解该问题,则被认为是可计算的。
2若不能找到任何算法来求解该问题,则被认为是不可计算的。
3若找到的算法在现有的技术条件下,需要过长的时间,过多的计算资源才能求解出结果,计算代价难以被接受,这样的问题也被认为是不可计算的。
4若该问题在规模较小的时候是可计算的,但随着问题规模的线性增长,计算量或消耗的计算资源呈指数增长,最终也被认为是不可计算的。
出于安全和简单等方面考虑,比特币的设计者故意对比特币脚本语言的编程能力做了一些限制,让其失去通用的计算能力,只能执行转账相关的操作。而以太坊则反其道而行之,其智能合约虚拟机EVM被设计成图灵完备的,因此可以用智能合约编程语言实现任何其他通用编程语言能够实现的算法。有的区块链研发团队可能为了暂时节约研发成本,直接用GO、C#、JAVA等编程语言作为智能合约的开发语言,这样是可以的,但极力宣扬这是很伟大的创新就有商业炒作的嫌疑,糊弄不懂技术的人。以太坊发明人Vitalik Buterin给出过类似的回答:直接使用常见的通用编程语言编写的程序被编译后,产生的目标文件占用的存储空间较大,这在单独的计算机上存储是没有问题的,但是放到区块链上存储就很昂贵了,因为每个节点都要存储同样的内容。再加上对安全性、计算资源计费等因素的考虑,针对以太坊,有专门设计的智能合约编程语言:Solidity、Viper等等。
密码系统的设计原则
密码学的一个重要任务就是寻找加密与解密算法,来保证信息在传输或存储过程中的机密性。后来又发展出了数字签名算法,但数字签名算法本质上是加密算法的特殊运用。密码学家们一直致力于寻找这样的算法:加密运算是可计算的,且计算得越快越好,而在没有解密秘钥的情况下,解密运算则是一个数学难题,是不可计算的。加密运算就是对明文数据和加密秘钥做运算形成密文数据,而解密运算就是对解密秘钥和密文数据做运算得到原始的明文数据。
若我们能找出这样的算法,且还未被其他人公开发表过,则可以发表密码学论文了。但要注意一条现代密码学普遍遵守的重要原则:柯克霍夫原则。该原则指出,若在密码系统的运转流程以及加解密算法被公开时,只要秘钥不公开,密文破译工作在理论上仍然是不可行的,这样的密码系统才是安全的。密码系统的安全性不因当建立在算法本身的保密以及系统运转流程的保密之上。这样做似乎有悖于我们的直觉,但是好处可以有很多,理由如下:
1公开的流程和算法更容易被全世界的学者、黑客所分析,其安全性可以被充分证明,如有技术缺陷,则很快就会被公诸于世,得到修复与改进,类似于开源Linux内核的发展;
2加密设备被攻击者捕获并逆向分析后,只要秘钥没有泄露,整个系统仍然是安全的;
3整个密码系统中,只有秘钥是必须保密的,则极大地减轻了系统的运营与管理负担,许多系统不安全并非是密码技术不够先进,而是人员、流程、操作规范等环节出现问题,容易遭到社会工程学攻击。
有了符合柯克霍夫原则的密码技术,比特币的源代码才能做到完全开源,更进一步接近了去中心化的理想目标。若比特币采用的数字签名算法是保密的,就有理由怀疑算法中可能保留了某些后门,实现去中心化的目标也就完全不可能了。
网友评论