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')
深圳網站建設www.sz886,com