日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

助记词创建以太坊钱包源码_墨客科普 | MOAC区块链钱包账号管理

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 助记词创建以太坊钱包源码_墨客科普 | MOAC区块链钱包账号管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  本文簡單描述錢包賬號管理的一些方法。

  一、術語

  1.1 gas,Gas Limit和Gas Price

  在墨客區塊鏈上,發送代幣或調用智能合約、執行寫入操作,需要支付礦工計算費用,計費是按照Gas計算的,Gas使用moac來支付。無論調用的方法是成功還是失敗,都需要支付計算費用。即使失敗,礦工也驗證并執行交易(計算),因此必須和成功交易一樣支付礦工費。

  Gas Limit稱為限額,它是用戶愿意在一筆交易中花費Gas的最大數量。交易所需的Gas是通過調用智能合約執行多少代碼來定義。如果您不想花太多的Gas,通過降低Gas Limit將不會有太大的幫助。因為您必須包括足夠的Gas來支付的計算資源,否則由于Gas不夠導致交易失敗,您所設置的所有Gas limit也將消耗光。建議您在有充足moac情況下,將Gas Limit盡量設高,所有未使用的Gas將在轉賬結束時退還給您。

  通過降低Gas Price可以節省礦工費用,但是也會減慢礦工打包的速度。礦工會優先打包 Gas Price設置高的交易,如果您想加快轉賬,您可以把Gas Price設置得更高,這樣您就可以排隊靠前。如果您不急,您只需要設置一個安全的 Gas Price,礦工也會打包您的交易。

  1.2 moac單位

  moac最小的單位是sha,最常用的單位是mc。

  1.3 keystore

  keystore是賬戶的一種表現形式,里面包含了賬戶的地址,賬戶密文的私鑰和MAC地址等等一系列的信息,下面是一個keystore的完整信息。

  1.5 元交易

  元交易是這樣一種發送交易的模式:發送方先對一個合法的交易簽名,然后把該交易和簽名通過鏈下傳遞的方式轉交給一個中繼方,該中繼方愿意承擔該筆交易的 gas 費并最終發送交易到網絡中。

  這種元交易模式很有用,因為發送方不再需要在發送賬戶中存有moac,從用戶體驗角度這很有益處。

  元交易最終的目標地址一般都是某個合約,且在某種程度上,該合約知道,交易的簽名方并不是交易實際的發送者。此時,交易 API 的 msg.sender 字段會返回中繼方的地址,但其很可能并沒有代表簽名方操作的權利,所以在這個場景下(僅僅查看 msg.sender 字段)并沒有太大意義。因此,許多元交易依賴鏈上的簽名校驗(通過 API 的 ecRecover 函數)來保證簽名方賬戶的確是在一份合適的白名單里面(有權限操作該交易想要執行的指令)。

  1.6 其他

  Nonce:交易計數器,即該賬戶主動發起的交易數量,從0開始計數。

  助記詞:通過算法從詞庫里面產生12-24個單詞,目前支持多種語言。

  隨機種子:使用助記詞通過算法產生的一個隨機字符串。

  私鑰:錢包中最重要的東西,錢包實際上就對私鑰進行管理,現在私鑰有主私鑰和派生私鑰的說法。

  主私鑰:錢包私鑰,由助記詞產生的隨機種子生成,主私鑰被盜的話,你的整個錢包的錢將全部被盜。

  派生私鑰:由主私鑰通過bip分層協議生成的私鑰,派生私鑰丟失,只會丟失單一賬戶上的數字資產。

  備份錢包:其實也叫備份助記詞,現在的錢包基本上都是用助記詞恢復的。

  備份私鑰:對錢包的主私鑰或者派生私鑰進行備份,通過主私鑰可以找回錢包中所有的賬戶,通過派生私鑰只能找回其中的一個賬戶。

  導入錢包:通過導入助記詞或者私鑰的方式生成以前的錢包。

  導入私鑰:通過導入私鑰生成多鏈多賬戶錢包,或者單鏈單賬戶錢包。

  單鏈錢包:只支持一條鏈的錢包,比方說比特幣錢包。

  多鏈錢包:支持所有幣種的錢包。

  單賬戶錢包:每種幣只支持一個賬戶。

  多賬戶錢包:每種幣支持多個賬戶。

  地址:類似于銀行卡賬戶,通過地址可以查詢到目前賬戶上的余額。

  公鑰:對所有人公開的秘鑰。

  簽名:在發起數字資產轉賬時,所有的幣種都要對轉賬的數據進行簽名,簽名的數據量對于不同的幣種不一樣。

  空投:就是批量打幣。

  bip協議簇:HD分層錢包中的一個重要的規定,是數字貨幣發展的必然產物。

  非確定性錢包:每個賬戶對應一個私鑰,私鑰不好管理。

  確定性錢包:有主私鑰,通過主私鑰可以生產其他所有幣種的私鑰,但不能支持多賬戶。

  確定性分層錢包:有主私鑰,通過主私鑰可以生產其他所有幣種的私鑰,支持多賬戶。

  二、開源庫keythereum

  Keythereum是一個用于生成,導入和導出密鑰的JavaScript工具。這提供了一種在本地和Web錢包中使用同一帳戶的簡單方法。它可用于可驗證和存儲錢包。

  Keythereum使用相同的密鑰派生函數(PBKDF2-SHA256或scrypt),對稱密碼(AES-128-CTR或AES-128-CBC)和消息驗證代碼。您可以將生成的密鑰導出到文件,將其復制到數據目錄的密鑰庫,然后立即開始在您的本地客戶端中使用它。

  從版本0.5.0開始,keythereum的加密和解密函數都返回Buffers而不是字符串。對于直接使用這些功能的人來說,這是一個重大改變。

  2.1 使用keythereum生產keystore:

  在生成keystore之前,你必須有一個nodeJs的環境,并且安裝好keythereum。

  或者使用壓縮的瀏覽器文件dist/keythereum.min.js,以便在瀏覽器中使用。使用代碼引入。

  生成一個新的隨機私鑰(256位),以及密鑰派生函數使用的salt(256位),用于AES-128-CTR的初始化向量(128位)對密鑰進行加密。如果傳遞回調函數,則create是異步的,否則是同步的。

  下面是生成keystore的代碼:

  運行結果:

  2.2 將keystore保存到文件中:

  dump創建一個對象而不是JSON字符串。在Node中,exportToFile方法提供了一種將此格式化的密鑰對象導出到文件的簡便方法。它在keystore子目錄中創建一個JSON文件,并使用geth的當前文件命名約定(ISO時間戳與密鑰派生的以太坊地址連接)。

  代碼如下:

  成功之后在你的keystore目錄下將看到一個keystore格式的賬號文件,如果出現錯誤,最可能的原因就是你的目錄下沒有keystore這個目錄,當然以上代碼中你也可以指定keystore的存儲目錄。

  2.3 keystore的導入:

  從keystore密鑰庫導入密鑰只能在Node上完成。將JSON文件解析為與上面的keyObject具有相同結構的對象。以下代碼需要在keystore目錄下已經存在keystore格式的賬號文件。

  運行結果:

  2.4 從keystore中恢復私鑰:

  這里恢復出來的私鑰是buffer格式的,password是你設置的密碼,keyObject就是keystore。

  運行結果:

  三、開源庫eth-crypto

  3.1 安裝

  3.2 創建賬號

  node環境下運行以下代碼,可以離線生成賬號,得到私鑰、公鑰和地址。

  const EthCrypto = require('eth-crypto'); const identity = EthCrypto.createIdentity(); //可以直接顯示私鑰、公鑰和地址console.log('privateKey:'+identity.privateKey);console.log('publicKey: '+identity.publicKey);console.log('address: '+identity.address); /* > privateKey:0xafd2fa1a57103993c16e2318f45206417c5cf840bb204603912b8dc54b7d8800publicKey: 37b7d6b1b7bc05947d42ecfd3b63dee6cd54ff3ebfd5c6637f3224f45d05c2f4ad0b8ffea1abd2c2313965662cfd7a09e2c9dd683eec4eeab4b19838e01b9f1caddress: 0x16F119734F845a5348dd37175ca81059E66C90B3*/

  3.3 從私鑰得到公鑰

  const EthCrypto = require('eth-crypto');var privateKey = "0xafd2fa1a57103993c16e2318f45206417c5cf840bb204603912b8dc54b7d8800"; //從私鑰得到公鑰const publicKey = EthCrypto.publicKeyByPrivateKey(privateKey);console.log('publicKeyByPrivateKey: '+publicKey); /* > publicKeyByPrivateKey: 37b7d6b1b7bc05947d42ecfd3b63dee6cd54ff3ebfd5c6637f3224f45d05c2f4ad0b8ffea1abd2c2313965662cfd7a09e2c9dd683eec4eeab4b19838e01b9f1c*/

  3.4 從公鑰得到地址

  const EthCrypto = require('eth-crypto');const publicKey = "37b7d6b1b7bc05947d42ecfd3b63dee6cd54ff3ebfd5c6637f3224f45d05c2f4ad0b8ffea1abd2c2313965662cfd7a09e2c9dd683eec4eeab4b19838e01b9f1c"; //從公鑰得到地址const address = EthCrypto.publicKey.toAddress(publicKey);console.log('addressByPublicKey: '+address); /* > addressByPublicKey: 0x16F119734F845a5348dd37175ca81059E66C90B3*/

  3.5 簽名

  const EthCrypto = require('eth-crypto');const privateKey = "0xafd2fa1a57103993c16e2318f45206417c5cf840bb204603912b8dc54b7d8800";const message = 'hello,world!';const messageHash = EthCrypto.hash.keccak256(message); const signature = EthCrypto.sign(privateKey,messageHash);console.log('signature: ' + signature); /*signature: 0x6f9188a50f13d75fd64df378f11b025a48f089f1d51d60264e84f3690d9fd6c6117abff827b06ab9de98e9c2837d6d9a6451ed113cf4492c8e28a4e2bd377bf51c*/

  3.6 從簽名信息獲得地址

  此處需要知道明文信息。

  const EthCrypto = require('eth-crypto');const signature = "0x6f9188a50f13d75fd64df378f11b025a48f089f1d51d60264e84f3690d9fd6c6117abff827b06ab9de98e9c2837d6d9a6451ed113cf4492c8e28a4e2bd377bf51c"; const signer = EthCrypto.recover(signature,EthCrypto.hash.keccak256('hello,world!'));console.log('signer: ' + signer); /*signer: 0x16F119734F845a5348dd37175ca81059E66C90B3*/

  3.7 從簽名信息獲得公鑰

  此處需要知道明文信息。

  const EthCrypto = require('eth-crypto');const signature = "0x6f9188a50f13d75fd64df378f11b025a48f089f1d51d60264e84f3690d9fd6c6117abff827b06ab9de98e9c2837d6d9a6451ed113cf4492c8e28a4e2bd377bf51c"; const signer = EthCrypto.recoverPublicKey(signature,EthCrypto.hash.keccak256('hello,world!'));console.log('signer: ' + signer); /*signer: 37b7d6b1b7bc05947d42ecfd3b63dee6cd54ff3ebfd5c6637f3224f45d05c2f4ad0b8ffea1abd2c2313965662cfd7a09e2c9dd683eec4eeab4b19838e01b9f1c*/

  四、交易

  4.1交易確認

  并不是我們查詢區塊鏈中的交易就說明這筆交易已經成功了,墨客是默認確認12次之后,此交易幾乎不會被篡改,那么怎么計算確認次數呢?

  確認次數 = 當前區塊高度 - 交易所在區塊高度 + 1

  此處注意事項:交易有可能會被孤立,在執行此公式時需要驗證一下區塊中此交易是否還是在那個區塊上,是否已經被回滾。

  交易的gas費算是常識性的內容,可給用戶一些參考值,讓用戶選擇愿意支付的手續費。最笨拙而又有效的方法是定期觀察一下區塊鏈上交易成功的交易的 gasPrice 的大概范圍,動態的調整一下價格,而 gasLimit 在不影響交易的情況下,盡可能稍微多一些,因為此部分如果未使用還會退換到交易發起賬戶中。

  4.2交易中nonce維護

  轉賬地址的合法性檢查,此合法性檢查可以避免后續很多問題的出現,比如 nonce 值的維護。

  交易的金額檢查,nonce 值檢查(nonce 值會遇到的問題前面已經提到過),特別是私鑰與節點分離之后自己來維護私鑰時 nonce 值會是一個很大的問題,比如前一筆交易失敗,nonce 值需要回退,此時后一筆交易已經發出,因為前一筆 nonce 沒有被補齊,后一筆遲遲不會被交易。這些都需要業務進行特殊判斷和處理。

  查詢一個地址 nonce,mc.getTransactionCount。

  4.3交易記錄

  墨客區塊鏈只能通過遍歷區塊交易的方法來判斷是否有對應賬戶的交易。相關操作步驟主要包括:

  *查詢區塊高度,比對是否是新生成的區塊,mc.blockNumber;

  *查看區塊內容及詳細交易,mc.gethBlock;

  *比對交易的 toAddress 是否為本錢包的地址,如果是則記錄此筆交易到數據庫,并記錄交易狀態(確認次數等);

  *保證入庫和記賬的冪等性,因為會多次查詢到同一筆交易;

  *作為錢包開發來說,實際需要解析所有交易,并保存到數據庫備查。

總結

以上是生活随笔為你收集整理的助记词创建以太坊钱包源码_墨客科普 | MOAC区块链钱包账号管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。