交易必须由私钥签名才能保存任何值。由于所有数字资产都是从交易中创建的,因此签名在任何区块链中都起着重要的作用。
在本篇文章中,我们将向大家介绍如何对以太坊交易进行签名,探索如何使用这些数字来签署操作数字资产等的操作。
在前面的文章中,我们经历了创建私钥的过程,并了解了可以使用它做什么。具体来说,在第一篇文章中,我们了解到密钥只不过是天文数字比例的随机数,而在第二篇文章中,我们研究了这些数字如何创建持有数字资产的以太坊钱包。在最后一篇文章中,我们将探索如何使用这些数字签名操作来操作数字资产和更多。
交易
区块链交易与银行交易并没有什么不同。如今,大多数银行都可以通过数字方式很容易地把钱寄给别人,把钱转到你的储蓄账户,甚至贷款。互联网时代使我们能够在没有任何物理交互的情况下在网上执行大多数这些行动。
尽管使用方便,但对银行来说既不容易也不便宜。在幕后,有几个第三方参与您的银行业务的清算、验证和确认。如果这还不够,为了继续遵守银行监管规定,金融机构必须采取漫长的措施,以确保你确实是被授权操作你账户的人。
所有这些层都会招致巨大的成本,也是 Visa 或万事达卡等支付网关对每笔购买收取费用的众多原因之一,通常是根据交易金额收取费用的。当然,在任何时间点,这些操作中的任何一个都可以冻结,在某些情况下还可以恢复。
2017 年,欧盟要求金融机构执行支付服务指令 2(指令2015/2366),这意味着银行必须与其他安全指令一起实施强客户认证协议(Strong Customer Authentication)。由于 PSD2+SCA 的成本,到 2019 年 3 月,只有 59% 的欧洲银行成功遵守了要求,将最后期限又推迟了一年。
区块链交易的行为遵循不同的规则集
由于公共区块链的分布式和无许可性质,任何人都可以签署交易并将其传播到网络。根据区块链的不同,允许交易被挖掘(即由矿工拾取并包含在区块链中)会招致费用,但费用通常会基于区块链中的用户需求,而不是交易中资产的价值。
例如,从一个以太坊帐户向另一个帐户汇款1美元与汇款100万美元的费用相同。这两个交易都可以被矿工平等地接受,矿工会将它们附加到有效的块中,然后传播到区块链上。
块包含一系列交易,一个接一个地追加。由于计算新区块的部分数据来自之前的区块,因此“区块链”这个名称来自于这些数学证明所创造的“链”,即“块”。用于轻松处理和验证这些证明的数据结构被称为“Merkle 树”,这也是区块链中伪造交易或块几乎不可能,但很容易被检测到的部分原因。
此外,区块链交易不需要任何中心方的验证。要使交易有效,只需使用与其区块链对应的数字签名算法(DSA)使用私钥进行签名。以太坊和比特币区块链使用 ECDSA 算法,而 Cardano 或 Polkadot 等其他项目则依赖 EdDSA 算法。
两者都依赖于椭圆曲线,但后者使用扭曲的爱德华兹曲线,这是对通用数字签名的改进。虽然交易可以由任何私钥签名,但只有当连接到用于签名交易的私钥的帐户包含足够的资金时,转移交易才能成功执行。
椭圆曲线签名算法依赖于离散对数问题,该问题经典地定义为给定一个整数 k,使得 a^k≡b(mod p)其中 p 是质数,找到 k。与 rsa 等依赖于特别大的质数(最近使用基于格子的密码学攻击的目标)的其他公钥算法不同,目前还没有已知的有效方法来计算 k(描述为椭圆曲线中的不同给定点P和Q)。这是所有基于区块链的系统都依赖于椭圆曲线的主要原因,尽管使用的具体曲线和签名算法各不相同。
一旦交易被签署、传播到网络中,并被挖掘到网络中的成功块中,就没有办法恢复该交易。与银行业务不同的是,成功挖掘的区块链交易不能恢复,也不能恢复到前一笔交易的状态。大多数公共区块链交易的性质使它们变得可见,因此,用于这些交易的区块链是这些资产的最终真相来源。
以太坊交易结构
现在我们已经完全了解了区块链交易的性质,我们准备创建我们的第一个基于以太坊的交易。我们从一个简单的传输交易开始:将0.1ETH传输到地址
0x17A98d2b11Dfb784e63337d2170e21cf5DD04631
交易可以用 JavaScript 对象表示法(JSON)来描述,所以当创建这个交易时,它会像下面这样使用 MyEtherWallet(通过登录后使用send offline):
{
"nonce": "0x00", // 0 in decimal
"gasLimit": "0x5208", // 21000 in decimal
"gasPrice": "0x3b9aca00", // 1000000000 in decimal
"to": "0x17A98d2b11Dfb784e63337d2170e21cf5DD04631",
"value": "0x16345785d8a0000", // 100000000000000000 in decimal
"data":"0x", // “empty” value in decimal
"chainId": 1 // Ethereum network id
}
马上就会出现以下几个值:nonce、gas Limit、gas Price、data 和 chainId。它们都与我们的交易的内容没有任何关系,而是与我们的交易是如何执行的有关。
这是因为,为了在以太坊中发送交易,您必须定义一些附加参数,这些参数告诉矿工应该如何处理您的交易。我们交易的这些属性中有两个涉及“gas”,这是一个计算工作量的度量单位,必须支付给以太坊矿工,才能将交易提交到区块链网络。
一个是gas Price(单位是Gwei,它等于1/10⁹Ether,这是以太坊的原生令牌),另一个是 gas Limit,这是交易中允许使用的最大气体量。这些值可以从以太坊节点估算,因此,通常由钱包提供者自动填写。
以太坊中的数值通常用“wei”来表示,“wei”是以太坊区块链中的最小单位,相当于单个以太坊的1/10¹¹¹(就像比特币中的中本聪)。gas 价格通常用 giga wei(简称Gwei)表示,它等于 Ether 的 1/10。gas 价格在以太坊网络中是一个复杂的话题,因为它们往往会波动。
EIP-1559 是最近批准的网络更改,将于今年晚些时候上线,应该有助于缓解这种具有挑战性的波动性。在 wei 和 giga wei 之上,还有其他单位来代表这些价值观。
要在多个单位之间转换,可以使用https://eth-converter.com/;要估计和可视化 gas 价格,可以使用https://ethgasstation.info/。
除了 gas 参数,您还必须指定该交易将在哪个以太坊网络上执行。以太坊网络包括主网络和 chaidId 1,但也有其他测试网络,您可以提交交易,而不会有损失经济价值的风险,因为测试网 ETH 可以通过在线龙头请求或资助。
通常,在开发 Dapp 时,您将首先在本地网络上运行它,然后将它部署到测试网,作为在主网上运行之前的最后一步。
最后但并非最不重要的一点是,我们有数据和现时值。如果您想要提交一些额外的数据,您可以将其作为交易的一部分附加。在与智能合同交互时,数据字段将包括您对该合同的说明。nonce(“只使用一次”)是以太坊网络用来跟踪您的交易的一个数值,有助于避免在网络中双重支出和重放攻击。
有时,交易会因为低 gas 而滞留在网络中,因此传播价格较高但相同的现时值的交易实际上会在矿工接手后立即“替换”网络中待处理的交易(一旦看到“缓慢”的交易,因为它与已经批准的交易具有相同的现时值,它就会被拒绝)。
签署以太坊交易
抓住我们之前的 JSON,我们终于可以继续并开始签名过程了。正如我们所描述的,此过程涉及 ECDSA 算法。为了与 ECDSA 签署交易,我们将使用流行的库 ethers.js,它已经包装了对椭圆曲线包的必要调用,以便在 ECDSA 算法中使用 secp256k1 曲线。
const ethers = require("ethers")
const signer = new ethers.Wallet(
'0x007120583af460144032f1f0c6cfde5a5fd58ee8e7702f5b7d324421715dd695'
)
signer.signTransaction({
"nonce": "0x00", // 0 in decimal
"gasLimit": "0x5208", //21000 in decimal
"gasPrice": "0x3b9aca00", //1000000000 in decimal
"to": "0x17A98d2b11Dfb784e63337d2170e21cf5DD04631",
"value": "0x16345785d8a0000", //100000000000000000 in decimal
"data":"0x", // “empty” value in decimal
"chainId": 1 // Ethereum network id
})
.then(console.log);
您可以在 Runkit 中在线测试此代码,并使用私钥将其与 MyEtherWallet(MEW)的结果进行匹配。
0x616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A
结果是代表您已签名的交易,准备好传播到以太坊网络。
0xf86b80843b9aca008252089417a98d2b11dfb784e63337d2170e21cf5dd0463188016345785d8a00008025a02e47aa4c37e7003af4d3b7d20265691b6c03baba509c0556d21acaca82876cb4a01b5711b8c801584c7875370ed2e9b60260b390cdb63cf57fa6d77899102279a0
您可以直接使用 MEW 或 AlChemy 的在线实用程序编写器,它允许您使用 eth_sendRawTransaction(用于与以太坊节点通信的RPC API方法)将签名的交易传递到以太坊网络。
立即签字,稍后再传
在上面执行的事务签名称为“离线签名”。由于私钥在我们的控制之下,我们可以使用我们的以太坊帐户创建签名验证,并在稍后将其传播播到以太坊网络。
许多在线钱包同时进行签名和传播(例如Metamask、Portis)。然而,离线签名对于国家渠道等应用程序特别有用,这些应用程序是跟踪两个账户之间余额的智能合约,在提交签署的交易后,可以转移资金。
离线签名也是去中心化交易所(DEX)的常见做法,在 DEX 中,买卖订单离链存储,只有在与之前签署的交易相匹配的订单匹配时,才会在链上结算。它们在第二层解决方案中也扮演着重要角色,如 zkRollup 和 optimistic。
如果您阅读了我们完整的私钥系列,您现在就了解了以太坊账户的来源和以太坊交易的方式。
End
非常感谢您对 IPFS&Filecoin 项目的持续支持。我们很高兴继续与您一起,为人类信息建立一个强大的,去中心化和高效的基础。
FilCloud 帮你迅速了解 IPFS 领域的热点技术和应用公众号:filcloud
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。