来源 | 以太坊爱好者责编 | 晋兆雨头图 | 付费下载于视觉中国在我们之前的文章中|创建和签名以太坊交易( 三 )
除了gas参数 , 你还需要指定要在哪个网络上执行这笔交易 。 以太坊网络既包括chainId为1的主网 , 也包括其他测试网络(testnet) 。 你也可以在测试网上发送交易 , 而且不会损失任何金钱 , 因为测试网的ETH可以用免费获得 。 一般来说 , 如果你要部署一个dApp , 那么第一步应该是在本地网络上调试它 , 然后是部署到测试网上 , 最后一步才是部署到主网上 。
最后 , 也很重要的是 , 我们还有data和nonce 。 如果你想要在交易中添加额外的数据 , 你就需要用到data字段 。 在你跟智能合约交互时 , data字段可以包含你给合约的指令 。 而nonce(“仅使用一次的数字”)则是以太坊网络用来跟踪你的账户状态、避免多重支付和重放攻击的一个数值(可以理解成流水号) 。 当你的交易因为gasfee太低而暂时无法打包的时候 , 你可以使用同一个nonce但指定更高的gasprice来“替换”你的那笔卡住的交易;一旦这笔“更快”的交易得以打包上链 , 你原来签名的那笔交易(因为使用了同一个nonce)就会被以太坊的节点抛弃掉了 。
签名一笔以太坊交易
形成了上面说的JSON编码 , 我们就可以往下走 , 开始签名的流程了 。 如我们所述 , 这个过程要用到ECDSA算法 。 这里我们要用到一个常用的库ethers.js , 这个代码库里面已经封装好了在secp256k1曲线上使用ECDSA算法生成签名所需的椭圆曲线 。
constethers=require("ethers")constsigner=newethers.Wallet('0x007120583af460144032f1f0c6cfde5a5fd58ee8e7702f5b7d324421715dd695')signer.signTransaction({"nonce":"0x00",//0indecimal"gasLimit":"0x5208",//21000indecimal"gasPrice":"0x3b9aca00",//1000000000indecimal"to":"0x17A98d2b11Dfb784e63337d2170e21cf5DD04631","value":"0x16345785d8a0000",//100000000000000000indecimal"data":"0x",//“empty”valueindecimal"chainId":1//Ethereumnetworkid}).then(console.log);
你可以使用Runkit在线测试一下这段代码 , 把它跟MyEtherWallet上的结果比对一下 。 这里用的私钥是0x616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A 。 (编者注:这里只是为了教学才明文暴露私钥 。 在任何时候 , 暴露私钥都是一种极不安全的行为 , 可能导致你账户内的所有资产丢失!请千万避免暴露私钥和助记词 。 )结果是0xf86b80843b9aca008252089417a98d2b11dfb784e63337d2170e21cf5dd0463188016345785d8a00008025a02e47aa4c37e7003af4d3b7d20265691b6c03baba509c0556d21acaca82876cb4a01b5711b8c801584c7875370ed2e9b60260b390cdb63cf57fa6d77899102279a0 , 表示的是你已经签过名的交易 , 可以发送到以太坊网络中了 。 你可以直接使用MEW , 或者Alchemy的在线工具Composer , 把你的签名交易传递到以太坊网络中 。 具体的原理是使用eth_sendRawTransaction这种RPC方法与一个以太坊节点交互 。
现在签名 , 晚点再发
上面讲的这个签名过程可以称为“离线签名” 。 因为我们是先创建好签名 , 然后再找办法把它广播出去的 。 但许多在线的钱包都把签名和广播合并在一起(比如Metamask和Portis) , 签名之后立即广播 。 不过 , 离线签名对许多应用(比如状态通道)来说都是非常实用的 。 所谓状态通道 , 就是一个监控两者账户的智能合约 , 根据这两个账户提交的签名交易 , 在双方之间完成资金结算 。 离线签名在去中心化交易所上也是一种常用的实践:买单和卖单都是存储在链下的 , 只在撮合成功时才把两笔交易上链结算 。 在Layer2方案如zkRollup和OptimisticRollup里面也扮演着重要角色 。
使用Portis , 你可以使用签名交易与GasStationNetwork(GSN)互动 。 Portis已在GSN中订阅了一组中继者 , 他们可以帮你的交易支付gas费 。 这些中继者关联着一个去中心化的合约(比如Ropsten测试网上的这个) , Portis可以请求他们中继你的交易 。 你仍然需要签名你的交易 , 但Portis会帮你完成其他的一切 , 这样 , 即使你用的是一个全新的钱包、没有余额来支付gas费 , 也依然能够跟智能合约交互 。 在我们的cryptopuppers应用上尝试一下吧!如果你想了解更多 , 这里有GSN(EIP-1613)的规范 。 还有 , 你可以看到来自TabooKey团队和Portis心爱的cryptopuppers应用的联动演示 。
- 以太坊|史上最卷空投 Arbitrum,将掀起Layer 2的热度
- 以太坊|都是1000元以内的好选项,为什么V20要比荣耀20好?
- 鲸鱼|以太坊鲸鱼注资小型山寨币
- 腾讯|以太坊鲸鱼注资小型山寨币
- 超级文和友走下神坛
- 华为鸿蒙系统|18个月显卡花费150亿美元,以太坊「矿工」即将停止开采
- 以太坊|以太坊合并一文读懂POW转POS
- 以太坊|币圈小将:以太坊合并之后,矿工们将何去何从?
- 小米科技|以太坊暴跌,显卡降价,矿卡涌出,如何做好维权?
- 虚拟货币7个月蒸发2万亿美元,“马斯克们”终结15万人暴富梦
