如何建立和簽署以太坊交易 | 區塊鏈研究實驗室

買賣虛擬貨幣

由於所有數字資產都是透過交易建立的,因此簽名在任何區塊鏈中都起著至關重要的作用。在本文中,我們將向大家介紹如何對以太坊交易進行簽名,探索如何使用這些數字來簽署運算元字資產等的操作。

交易-與舊交易,與新交易

區塊鏈交易與銀行交易沒有什麼不同?現如今,大多數銀行可以輕鬆地使用數字化方式將錢匯給某人,將錢存入您的儲蓄帳戶,甚至提取貸款。網際網路時代使我們能夠線上執行大多數此類操作,而無需任何物理互動。
儘管它們易於使用,但對於銀行而言,這些操作絕非易事,同時也不便宜。在幕後,您的銀行業務的清算,驗證和確認涉及多個第三方,而且還要保持對銀行法規的遵守。
金融機構必須採取冗長的措施,以確保您確實是有權操作您的帳戶的個人。所有這些層級都會產生大量成本,諸如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可以支付汽油費。

作者:鏈三豐,來源:區塊鏈研究實驗室

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读