分离签名和传输(离线签名)
一旦交易被签署,它就可以传送到以太坊网络。创建,签署和广播交易的三个步骤通常发生在单个函数中,例如使用+web3.eth.sendTransaction+。但是,正如我们在原始交易创建和签名中看到的那样,你可以通过两个单独的步骤创建和签署交易。一旦你签署了交易记录,你就可以使用+web3.eth.sendSignedTransaction+传输该交易记录,该方法采用十六进制编码的签名交易信息并在Ethereum网络上传输。
你为什么要分开交易的签署和传输?最常见的原因是安全:签名交易的计算机必须将解锁的私钥加载到内存中。传输的计算机必须连接到互联网并运行以太坊客户端。如果这两个功能都在一台计算机上,那么你的在线系统上有私钥,这非常危险。分离签名和传输功能称为 离线签名 offline signing,是一种常见的安全措施。
根据你所需的安全级别,你的“离线签名”计算机可能与在线计算机存在不同程度的分离,从隔离和防火墙子网(在线但隔离)到完全脱机系统,成为 气隙 _air-gapped_系统 。在气隙系统中根本没有网络连接 - 计算机与在线环境是“空气”隔离的。使用数据存储介质或(更好)网络摄像头和QR码将交易记录到气隙计算机上,以签署交易。当然,这意味着你必须手动传输你想要签名的每个交易,不能批量化。
尽管没有多少环境可以利用完全气隙系统,但即使是小程度的隔离也具有显着的安全优势。例如,带防火墙的隔离子网只允许通过消息队列协议,可以提供大大降低的攻击面,并且比在线系统上签名的安全性高得多。许多公司使用诸如ZeroMQ(0MQ)的协议,因为它为签名计算机提供了减少的攻击面。有了这样的设置,交易就被序列化并排队等待签名。排队协议以类似于TCP套接字的方式将序列化的消息发送到签名计算机。签名计算机从队列中读取序列化的交易(仔细地),使用适当的密钥应用签名,并将它们放置在传出队列中。传出队列将签名的交易传输到使用Ethereum客户端的计算机上,客户端将这些交易出队并传输。