翻译:子轩 校对:Neo MA
2018年8月,美国国家标准与技术研究院(NIST)发布了"Blockchain Technology Overview"一文,较为全面、客观地梳理了区块链技术。文章颇具价值,μNEST将其译成中文,以飨读者,并用十期进行系列连载。本期为系列连载的第三期,主要介绍了诸多区块链技术组成要素中的三种:密码哈希函数、交易、非对称密钥算法。
3区块链组成要素
区块链技术看上去非常复杂,但如果单独分析它的每个组成要素就会容易些。总体上看,区块链技术使用了广为人知的计算机科学及密码学技术(密码哈希函数、数字签名、非对称密码算法),并结合记录保存的理念(例如,只可追加的账本)。本节对每个主要组成要素分别进行了讨论:密码哈希函数、交易、非对称密钥算法、地址、账本、区块,以及区块如何被链到一起。
3.1密码哈希函数
区块链技术的一个重要组成部分是密码哈希函数的广泛应用。哈希是一种对几乎任意长度的数据(可以是文档、文本、图像等)进行密码哈希运算处理并输出唯一结果(称为消息摘要或摘要)的方法。由于在这一过程中数据没有发生变化,使得不同个体可以独立地进行数据输入,对该数据进行哈希处理并得到相同的结果。即使输入数值发生了最细微的变化(如仅改变了一个比特),都会导致最终的结果大相径庭。表1给了一个简单示例。
密码哈希函数有这样几个重要的安全特性:
抗预映射性。即它是单向的,不可逆的。通过给定的输出值来反推输入值几乎是不可能的。即给定一个y,无法找到x使hash(x)=y。
抗第二预映射性。你无法找到一个对应特定结果的输入值。也就是说给定一个输入,你无法找到第二个可以输出相同结果的输入值。唯一的办法是找遍输入域,但计算意义上几乎没有成功的可能。即给定一个x,无法找到y,使得hash(x)=hash(y)
强抗碰撞性。这意味着你无法同时找到两个不同输入在经过哈希后得到相同的结果。即无法同时找到x,y,使hash(x)=hash(y)。
作为在许多区块链应用中被使用的密码哈希函数,安全哈希算法(SHA)输出长度为256位的结果(SHA-256)。许多计算机硬件上支持这种算法,可以加快计算速度。SHA-256输出结果为32字节,通常显示为一个64位的十六进制字符串。这意味着存在2256,约等于1077,即115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936种可能的输出值。SHA-256哈希算法还有其他一些哈希算法都是经过联邦信息处理标准认定的安全哈希算法,美国国标局网站上有所有认定过的安全哈希算法。
既然存在无限多的输入值和有限可能多的输入值,就有极小的概率会出现碰撞,即发现两个不同的输入值生成了相同的结果。SHA-256被认为具有抗碰撞性是因为在执行算法的过程中,平均每经过2128次才可能遇到一次碰撞。
拿比特币网络来说,2015年全网算力是300 QH/S。在此算力下,要计算找出这种碰撞大约需要3.6 x 1010年之久(而我目前所知的是宇宙诞生也就1.37 x 1010年)。而即便存在x和y,可以得到相同的哈希值,也几乎没有可能会在区块链网络中同时有效。
在一个区块链网络内,密码哈希函数有多种用途,例如:
地址推导 – 在3.4节详细讨论;
创建唯一ID;
保护区块数据的安全——一个出块节点会对区块数据哈希处理,并创造一个摘要储存在区块头。
保护区块头——一个出块节点会对区块头哈希处理。如果区块链网络使用了PoW共识模型(见4.1节),那么出块节点在哈希块头时需要不同的随机数(nonce),直到计算难题被解除。当前区块头的哈希值会被包含在下个区块头内,这保证了当前区块头的数据安全。
因为区块头包含了代表区块内数据的哈希值,因此当区块头哈希值被储存在下一个区块时,此区块数据本身也得到了保护。
很多密码哈希函数在区块链技术中得到了应用(SHA-256只是其中一种),例如Keccak(在NIST的评选中胜出的SHA-3哈希标准),以及RIPEMD-160。
3.1.1随机数(nonce)
Nonce是只被使用一次的随机数或伪随机数。随机数可以结合数据让数据产生不同的哈希值,即:
hash(data+nonce)=digest
只要改变nonce就可以让同样数据得到不同哈希值,这项技术在PoW共识模型(见4.1节)中被使用。
3.2交易
交易代表着主体间的互动。在加密货币中,一次交易就意味着加密货币在区块链网络用户间的一次转移。在B2B场景中,交易可能是记录数字资产或现实资产变化的一种方式。图1描述了一个区块链上的虚构交易。区块链上每个区块包含零个或多个交易记录。对有些区块链网络实现而言,新块的持续发布(即使不包含交易)对维持区块链网络的安全也是至关重要。新块的不断发布,可以防止恶意用户“赶上”并制造出更长的分叉链。
虽然记录交易的数据因区块链实现的差异而有所不同,但交易机制大体上一致。用户向区块链网络内发送信息,发送的信息中要包含发送方地址(或其他相关ID)、发送方的公钥、数字签名、交易输入以及交易输出。
通常,一次加密货币的交易至少需要但不仅限以下的信息:
输入——通常指一组将被转移的数字资产。交易会引用数字资产的来源:发送方从过往的历史交易中获得,或是来源于初始生成的新数字资产。由于交易的输入引用参考了过往发生的活动,因此数字资产不会变化。在加密货币中这意味着手中数字资产的价值无法被更改。一份数字资产可以拆分成多份新的数字资产,同时多份数字资产也可以合并成为具有更大点的数字资产。资产拆分或合并的内容将在介绍交易输出时具体阐述。发送方通常利用私钥对交易进行数字签名来证明相关交易输入的可获取性。
输出——通常指接收方账户以及即将接收多少数字资产。每个交易输出都包含了新用户即将获得的数字资产的具体数额,新用户的ID以及花费这些资产所需要的条件。如果转移过程中数字资产供大于求,多出来的部分将被返还到发送方的账户(“找零”机制)。(译者注:其实这是UTXO模式,账户模式的并非如此)
图1 交易示例
交易除了转移数字资产的基础功能外,还可以用于数据的传输。简言之,个人可以在链上永久且公开地发布数据。在智能合约中,交易被用来发送数据、处理数据,并在区块链上储存结果。比如,在基于区块链技术的供应链系统中,一个交易可以用来改变数字化资产的属性,例如货物物流的位置数据。
无论数据如何被产生和转移的,交易的有效性和授权性始终是至关重要的。交易的有效性确保了交易符合区块链内的协议要求、数据格式化要求以及智能合约的要求。交易的授权性也很重要,它决定了发送方是否有权操作这些数字资产。交易一般被发送方的私钥进行数字签名,并可以随时被用其相关联的公钥进行验证。
3.3非对称密钥算法
区块链技术使用了非对称密钥算法(译者注:也称公钥算法)。非对称密钥算法用了一对儿密钥:数学上彼此关联的公钥和私钥。公钥可以公开,不影响密码处理安全;但私钥则关系到账户安全,必须妥善保管。尽管公钥和私钥之间有一定的关联,但知道公钥的信息并不意味着可以推导出私钥。个人可以用私钥加密然后用公钥解密;相应地,也可以用公钥进行加密然后用私钥解密。
通过在交易公开化的情况下确保交易的完整性和授权性,非对称密钥算法为非互信用户创造了信任关系。交易是被“数字签名”的,这意味着私钥被用来对交易进行加密,拥有公钥的人可以相应的解密。既然公钥是可以任意获取,但被私钥加密后的交易意味着只有签名者才拥有私钥。相应地,个人可以用公钥对数据进行加密,只有拥有对应私钥的人才可以解密数据。非对称密钥算法的缺点在于运算时间长。
相比之下,对称密钥算法中加密解密均用单一密钥完成。使用对称密钥算法的用户间必须建立信任关系,从而交换预共享的密钥。在对称加密系统中,任何加密后的数据均可以被预共享密钥解密,用户没有预共享密钥就无法访问解密的数据。相比于非对称密钥算法,对称密钥算法的运算速度很快。正因如此,当有人想用非对称密钥算法进行加密时,通常的做法是对数据进行对称密钥算法加密,然后在用非对称密钥算法来交换对称算法的预共享密钥,这么做可以极大地提升非对称密钥加密的运算速度。
以下是众多区块链网络中使用非对称密钥算法情况的总结:
私钥被用来对交易进行数字签名;
公钥用来导出地址;
公钥用来验证由私钥生成的数字签名;
非对称密钥算法可以用来验证,只有拥有私钥的用户才能对交易进行签名,从而完成数字资产的价值转移。
一些许可链网络的非对称密钥是利用现存的商业PKI为用户提供支撑,而不是让区块链用户管理自己的非对称密钥。它是由现存目录服务提供支持,并在区块链网络内使用相关信息。使用现存目录服务的区块链可以借此接入现存协议(例如LDAP),可以直接使用目录服务,或将其导入区块链网络的内部认证授权。
联系我们
Homepage:iotee.io
Facebook:NESTchain
Twitter:@miuNEST
Telegram:@miuNEST
Reddit:r/miuNEST
Medium:r/miuNEST
Steemit:μNEST
微信公众号二维码