区块链-创建钱包(以太坊)
區塊鏈-創建錢包(以太坊)
一,基本概念
所有問題大體可以分為三類:區塊鏈基本概念,錢包安全知識以及錢包轉賬交易
1,區塊鏈的基本特性
(1)去中心化
因為整個網絡沒有中心統治者。系統依靠的是網絡上多個參與者的公平約束,所以任意每幾個節點的權利和義務都是均等的,而且每一個節點都會儲存這個區塊鏈上所有數據。即使該節點被損壞或遭受攻擊,仍然不會對賬簿造成任何威脅。
(2)不可逆
區塊鏈上的信息必須不可撤銷,不能隨意銷毀。系統是開源的,整個系統都必須是公開透明的,因此某筆交易被全網廣播以后,達到 6 個確認以上就成功記錄在案了,且不可逆轉不可撤銷。注: imToken 是 12 個區塊確認。
(3)不可篡改
確保信息或合約無法偽造。賬簿在某個人或某幾人手上,造假的可能性就非常高,但每個人手里都有一本賬簿,除非整個游戲里超過51%的人都更改某一筆賬目,否則任何的篡改都是無效的,這也是集體維護和監督的優越性。
(4)匿名性
各區塊節點的身份信息不需要公告或驗證, 信息傳遞可以匿名進行。舉個簡單的例子, 就是你在區塊鏈上向一個錢包地址發起交易, 但是卻無法知道這個地址背后確切對應的是那一個人, 或者你的私鑰被某一個黑客盜竊了, 無法從一個錢包地址中得知黑客是誰。
2,以太坊基本概念
(1)錢包地址
以0x開頭的42位的哈希值 (16進制) 字符串
(2)keystore
明文私鑰通過加密算法加密過后的 JSON 格式的字符串, 一般以文件形式存儲
(3)助記詞
12 (或者 15、18、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')
總結
以上是生活随笔為你收集整理的区块链-创建钱包(以太坊)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [HTML]在页面中输出空格的几种方式
- 下一篇: PV、UV、IP的区别