科普 | 創建和簽署以太坊交易

火幣網(huobi.com)最新可用網址(點擊下圖直達註冊!)




​交易必須由私鑰簽名才能保存任何值。由於所有數字資產都是從交易中創建的,因此簽名在任何區塊鏈中都起著重要的作用。

在本篇文章中,我們將向大傢介紹如何對以太坊交易進行簽名,探索如何使用這些數字來簽署操作數字資產等的操作。

科普 | 創建和簽署以太坊交易

在前面的文章中,我們經歷瞭創建私鑰的過程,並瞭解瞭可以使用它做什麼。具體來說,在第一篇文章中,我們瞭解到密鑰隻不過是天文數字比例的隨機數,而在第二篇文章中,我們研究瞭這些數字如何創建持有數字資產的以太坊錢包。在最後一篇文章中,我們將探索如何使用這些數字簽名操作來操作數字資產和更多。

交易

區塊鏈交易與銀行交易並沒有什麼不同。如今,大多數銀行都可以通過數字方式很容易地把錢寄給別人,把錢轉到你的儲蓄賬戶,甚至貸款。互聯網時代使我們能夠在沒有任何物理交互的情況下在網上執行大多數這些行動。

盡管使用方便,但對銀行來說既不容易也不便宜。在幕後,有幾個第三方參與您的銀行業務的清算、驗證和確認。如果這還不夠,為瞭繼續遵守銀行監管規定,金融機構必須采取漫長的措施,以確保你確實是被授權操作你賬戶的人。

所有這些層都會招致巨大的成本,也是 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



返回列表页>>> 比特幣最新新聞