如何创建和签署以太坊交易
由于所有数字资产都是通过交易创建的,因此签名在任何区块链中都起着至关重要的作用。在本文中,我们将向大家介绍如何对以太坊交易进行签名,探索如何使用这些数字来签署操作数字资产等的操作。
交易-与旧交易,与新交易
区块链交易与银行交易没有什么不同?现如今,大多数银行可以轻松地使用数字化方式将钱汇给某人,将钱存入您的储蓄帐户,甚至提取贷款。互联网时代使我们能够在线执行大多数此类操作,而无需任何物理交互。
尽管它们易于使用,但对于银行而言,这些操作绝非易事,同时也不便宜。在幕后,您的银行业务的清算,验证和确认涉及多个第三方,而且还要保持对银行法规的遵守。
金融机构必须采取冗长的措施,以确保您确实是有权操作您的帐户的个人。所有这些层级都会产生大量成本,诸如Visa或Mastercard之类的付款网关通常会根据交易金额对每次购买收取费用的众多原因之一。当然,无论何时何地,这些操作都可以冻结,并且在某些情况下也可以还原。
区块链交易的行为遵循不同的规则集
由于公共区块链的分布式和未经许可的性质,任何人都可以签署交易并将其广播到网络。根据区块链的不同,您将收取一定费用,以允许“挖掘”交易(即由矿工捡起并包含在区块链中),但该费用通常基于区块链中的用户需求,而不是基于交易中资产的价值。例如,从一个以太坊账户向另一账户发送$ 1的费用将与发送$ 100万相同。矿工可以平等地接受这两项交易,并将其添加到有效块中以广播到区块链。
此外,区块链交易无需任何中央机构的验证。为了使交易有效,仅需使用与其区块链相对应的数字签名算法(DSA)使用私钥对其进行签名。以太坊和比特币区块链使用ECDSA算法,而Cardano或Polkadot等其他项目则依赖EdDSA算法。
两者都依靠椭圆曲线,而后者使用扭曲的爱德华兹曲线,这是对通用数字签名的改进。尽管可以使用任何私钥对交易进行签名,但是只有与用于签署交易的私钥相关的帐户包含足够的资金时,转移交易才会成功执行。
一旦一笔交易被签名,广播到网络中并被挖掘到网络中成功的区块中,就无法恢复交易。与银行业务不同,成功开采的区块链交易无法还原或恢复到先前交易的状态。大多数公共区块链交易的性质使它们可见,因此,用于这些交易的区块链是这些资产的最终真实来源。
以太坊交易结构
现在我们已经充分了解了区块链交易的本质,我们准备创建我们的第一个基于以太坊的交易。我们将从一个简单的转移交易开始:将0.1 ETH转移到address。
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,gasLimit,gasPrice,data,和chainId。这与我们的交易内容没关,而是与我们的交易执行方式有关。这是因为在以太坊中发送交易中,您必须定义一些其他参数来告诉矿工如何处理您的交易。我们交易中的两个属性涉及“ gas”,这是计算工作量的度量单位,必须将其支付给以太坊矿工才能将交易提交到区块链网络。
一个是gasPrice(以名为Gwei的单位表示,等于1/10是以太坊的本机令牌以太币),另一个是gasLimit,这是您的交易中允许使用的最大天然气量。这些值可以从以太坊节点估计,因此通常由钱包提供商自动填写。
除了gas参数之外,您还必须指定将在哪个特定的以太坊网络上执行该交易。以太坊网络包括带有chaidId 1的主网络(mainnet),但是由于可以通过在线水龙头请求或资助testnet ETH,因此可以向您提交交易的其他测试网络(testnet)没有任何经济价值的风险。通常,在开发Dapp时,您将首先在本地网络上运行它,然后将其部署到测试网,作为最后一步,然后再进入主网上。
最后但并非最不重要的一点是,我们有data和nonce,如果您需要提交一些其他数据时,您可以将其作为事务的一部分附加。与智能合约进行交互时,数据字段将包含您对该合约的指令。
A nonce(“仅使用一次的数字”)是以太坊网络用于跟踪交易的数值,有助于避免网络中的双重支出以及重放攻击。有时,由于汽油价格低廉,交易会卡在网络中,因此,以较高的价格广播交易,但同一随机数会在矿工接手后有效地“替换”网络中的待处理交易(一旦“缓慢”可以看到“”交易,因为它与已批准的交易具有相同的现时数,因此将被拒绝)。
签署以太坊交易
抓住我们以前的JSON,我们终于可以继续进行签名过程了。如我们所述,此过程涉及ECDSA算法。为了与ECDSA签署交易,我们将使用流行的ethers.js库,该库已经包装了对椭圆曲线包的必要调用,以便将secp256k1曲线与ECDSA算法一起使用。
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的在线实用程序Composer,它允许您使用用于与以太坊节点通信eth_sendRawTransaction的RPC API方法将已签名的交易传递到以太坊网络。
立即签名,稍后再转
如上所述执行的交易签名称为“离线签名”。由于我们的私钥处于我们的控制之下,因此我们可以使用以太坊帐户创建签名验证,并在以后将其广播到以太坊网络。许多在线钱包同时进行签名和广播(例如Metamask,Portis)。但是,脱机签名对于诸如状态通道之类的应用程序特别有用,这些通道是跟踪两个帐户之间余额的智能合约,并且在提交已签名的交易后就可以转移资金。
脱机签名也是去中心化交易所(DEXes)中的一种常见做法,在该交易所中,买卖订单存储在链外,并且仅在与适合先前签署的交易的订单匹配时才在链上结算。
使用Portis,您可以签署交易以与加油站网络(GSN)进行交互。为了与GSN进行互动,Portis订阅了一个中继站池,这些中继站能够支付您交易的汽油费。这些中继器订阅去中心化合同(例如Ropsten测试网中的这一合同),Portis向他们发送请求以中继您的交易。您仍然需要签署交易(毕竟,未签署的签名是没有意义的),但是Portis小部件会在后台执行所有之前的处理,因此即使使用全新的钱包,用户也可以开始签署交易并与智能合约进行交互。没有ETH可以支付汽油费。
Scan QR code with WeChat