區塊鏈-建立錢包(以太坊)

區塊鏈-建立錢包(以太坊)

一,基本概念

全部問題大致能夠分爲三類:區塊鏈基本概念,錢包安全知識以及錢包轉帳交易react

 

1,區塊鏈的基本特性

    (1)去中心化算法

         由於整個網絡沒有中心統治者。系統依靠的是網絡上多個參與者的公平約束,因此任意每幾個節點的權利和義務都是均等的,並且每個節點都會儲存這個區塊鏈上全部數據。即便該節點被損壞或遭受攻擊,仍然不會對帳簿形成任何威脅。react-native

    (2)不可逆安全

         區塊鏈上的信息必須不可撤銷,不能隨意銷燬。系統是開源的,整個系統都必須是公開透明的,所以某筆交易被全網廣播之後,達到 6 個確認以上就成功記錄在案了,且不可逆轉不可撤銷。注: imToken 是 12 個區塊確認。網絡

    (3)不可篡改dom

         確保信息或合約沒法僞造。帳簿在某我的或某幾人手上,造假的可能性就很是高,但每一個人手裏都有一本帳簿,除非整個遊戲裏超過51%的人都更改某一筆帳目,不然任何的篡改都是無效的,這也是集體維護和監督的優越性。區塊鏈

     (4)匿名性ui

         各區塊節點的身份信息不須要公告或驗證, 信息傳遞能夠匿名進行。舉個簡單的例子, 就是你在區塊鏈上向一個錢包地址發起交易, 可是卻沒法知道這個地址背後確切對應的是那一我的, 或者你的私鑰被某一個黑客盜竊了, 沒法從一個錢包地址中得知黑客是誰。this

2,以太坊基本概念

     (1)錢包地址加密

          以0x開頭的42位的哈希值 (16進制) 字符串

     (2)keystore

         明文私鑰經過加密算法加密事後的 JSON 格式的字符串, 通常以文件形式存儲

     (3)助記詞

        12 (或者 1五、1八、21) 單詞構成, 用戶能夠經過助記詞導入錢包, 但反過來說, 若是他人獲得了你的助記詞, 不須要任何密碼就能夠垂手可得的轉移你的資產, 因此要妥善保管本身的助記詞

     (4)明文私鑰

        64位的16進制哈希值字符串, 用一句話闡述明文私鑰的重要性 「誰掌握了私鑰, 誰就掌握了該錢包的使用權!」 一樣, 若是他人獲得了你的明文私鑰, 不須要任何密碼就能夠垂手可得的轉移你的資產

通俗地去解釋,以銀行帳戶爲類比,這些名詞分別對應內容以下:

  • 錢包地址 = 銀行卡號
  • 密碼 = 銀行卡密碼
  • 私鑰 = 銀行卡號 + 銀行卡密碼
  • 助記詞 = 銀行卡號 + 銀行卡密碼
  • Keystore+ 密碼 = 銀行卡號 + 銀行卡密碼
  • Keystore ≠ 銀行卡號

二,建立錢包

      1,生成助記詞

1 import bip39 from 'react-native-bip39'
2    getMnemonic()=>{
3        bip39.generateMnemonic().then(function (mnemonic) {
4             alert(mnemonic)
5             getwallet(mnemonic)
6          }, function (err) {
7              //     alert(err)
8          })
9  }

     2,生成Seed與錢包對象wallet

     使用助記詞計算出Seed,而後獲得wallet

 1 import crypto from 'crypto'
 2 //HDKey
 3 var BITCOIN_VERSIONS = {private: 0x0488ADE4, public: 0x0488B21E}
 4 
 5 function HDKey (versions) {
 6   this.versions = versions || BITCOIN_VERSIONS
 7   this.depth = 0
 8   this.index = 0
 9   this._privateKey = null
10   this._publicKey = null
11   this.chainCode = null
12   this._fingerprint = 0
13   this.parentFingerprint = 0
14 }
15 HDKey.fromMasterSeed = function (seedBuffer, versions) {
16   var I = crypto.createHmac('sha512', MASTER_SECRET).update(seedBuffer).digest()
17   var IL = I.slice(0, 32)
18   var IR = I.slice(32)
19 
20   var hdkey = new HDKey(versions)
21   hdkey.chainCode = IR
22   hdkey.privateKey = IL
23 
24   return hdkey
25 }
26 //WalletHDKey
27 function EthereumHDKey () {
28 }
29 
30 function fromHDKey (hdkey) {
31   var ret = new EthereumHDKey()
32   ret._hdkey = hdkey
33   return ret
34 }
35 
36 EthereumHDKey.fromMasterSeed = function (seedBuffer) {
37   return fromHDKey(HDKey.fromMasterSeed(seedBuffer))
38 }
39 //獲取錢包對象
40 getwallet = (mnemonic) => {
41         let index = 0
42         var masterSeed = bip39.mnemonicToSeed(mnemonic)
43         var wallet = wallethdkey.fromMasterSeed(masterSeed).derivePath("m/44'/60'/0'/0").deriveChild(index).getWallet()  
44     }

 3,生成錢包地址與keystore文件

 1 1Wallet = function (priv,pub) {this._privKey = priv;this._pubKey = pub}Wallet.prototype.getV3Filename = function (timestamp) {
 2   var ts = timestamp ? new Date(timestamp) : new Date()
 3   return [
 4     'UTC--',
 5     ts.toJSON().replace(/:/g, '-'),
 6     '--',
 7     this.getAddress().toString('hex')
 8   ].join('')
 9 }
10 Wallet.prototype.getAddress = function () {
11   return ethUtil.publicToAddress(this.pubKey)
12 }
13 Wallet.prototype.toV3 = function (password, opts, callback) {
14   opts = opts || {}
15   var salt = opts.salt || crypto.randomBytes(32)
16   var iv = opts.iv || crypto.randomBytes(16)
17   var derivedKey
18   var kdf = opts.kdf || 'scrypt'
19   var kdfparams = {
20     dklen: opts.dklen || 32,
21     salt: salt.toString('hex')
22   }
23   if (kdf === 'pbkdf2') {
24     kdfparams.c = opts.c || 262144
25     kdfparams.prf = 'hmac-sha256'
26     derivedKey = crypto.pbkdf2Sync(Buffer.from(password), salt, kdfparams.c, kdfparams.dklen, 'sha256')
27   }
28   else {
29     throw new Error('Unsupported kdf')
30   }
31   
32     var ciphertext = Buffer.concat([ cipher.update(this.privKey), cipher.final() ])
33     
34     var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), Buffer.from(ciphertext, 'hex') ]))
35   
36     return {
37       version: 3,
38       id: uuid.v4({ random: opts.uuid || crypto.randomBytes(16) }),
39       address: this.getAddress().toString('hex'),
40       crypto: {
41         ciphertext: ciphertext.toString('hex'),
42         cipherparams: {
43           iv: iv.toString('hex')
44         },
45         cipher: opts.cipher || 'aes-128-ctr',
46         kdf: kdf,
47         kdfparams: kdfparams,
48         mac: mac.toString('hex')
49       }
50     }
51 
52 }
53 getAddressAndWallet=(wallet)=>{
54  var address = '0x' + wallet.getAddress().toString('hex')//獲取錢包地址
55 //生成keystore文件
56         let timestamp = (new Date()).valueOf();
57        wallet.getV3Filename(timestamp);//named keystore file 
58         //輸入支付寶密碼,生成keystore文件
59         //從錢包獲取keystore保存在手機的本地文件,防止手機卸載而丟失keystore文件
60         let keystore = wallet.toV3(password, { kdf: 'pbkdf2' });
61 }

  4,獲取私鑰,用於交易

1 Wallet.prototype.getPrivateKey = function () {
2   return this.privKey
3 }
4 Wallet.prototype.getPublicKey = function () {
5   return this.pubKey
6 }
7 var privatekey = wallet.getPrivateKey().toString('hex')//獲取私鑰
8 var getPublicKey = wallet.getPublicKey().toString('hex')
相關文章
相關標籤/搜索