EOS映射完全指南
隨著EOS主網即將上線,EOS映射這個事情就必須在主網上線前完成。
什麼是EOS映射?
簡單地說,目前的EOS實際上是基於ETH主網發行的Token,等到EOS主網上線時,必須有一種機制能夠把基於ETH地址的EOS Token給「轉移」到EOS主網地址上,這個過程就是映射。
不做映射行不行?
不做映射將導致持有的EOS Token在主網上線後被清零,也就是無償銷毀,給其他EOS持有人做了一點微小的貢獻。
那麼EOS映射的原理是什麼呢?
假設小明持有某個ETH地址的EOS Token,通過映射,到了6月份,小明持有的ETH地址的EOS Token作廢,取而代之的是他將在他持有的EOS地址上獲得等量的EOS。
EOS Token本身存儲在ETH的合約中,因此,任何人都可以獲得ETH地址->EOS數量的映射表,但是要把ETH地址的EOS轉移到將來真正的EOS地址,就還需要一個ETH地址->EOS地址的映射表,這個映射表實際上也在ETH的合約中,但是,註冊ETH地址->EOS地址的過程是手動的,原因是,只有持有ETH地址私鑰的人才能註冊對應的ETH地址,這樣保證了EOS Token持有人才能設置自己的EOS地址。
因此,映射原理簡單地來說就是:
小明持有某個ETH地址的私鑰(記作eth_priv)以及對應ETH地址(記作eth_addr)的EOS Token;
小明必須手動創建一個EOS地址的私鑰(記作eos_priv)以及對應的EOS地址(記作eos_addr);
最後,小明通過調用合約的註冊方法,傳入自己的eth_addr和eos_addr,完成映射。由於這個過程需要私鑰eth_priv簽名,所以其他人不可能把小明的ETH地址映射到自己的EOS地址上。
映射過程中,要保證安全,就要確保創建EOS私鑰eos_priv的過程絕對安全。
EOS官網提供了一個在線創建EOS私鑰和對應地址的頁面:
eosio | Blockchain software architecture
點擊REGISTER EOS KEY可以獲取一個在線生成的EOS私鑰及地址:
以上圖為例,我們獲取到的EOS私鑰是:
5Jd6Zhcv1DWCZkRHb6pGNjpRAYZ5m2HBDC3u555jCuCD3nmnUgZ
做完映射後,最關鍵的問題是必須保存私鑰,並且直到官方錢包可用後,才能把私鑰導入到錢包中。在此期間,如果私鑰被泄漏,主網上線後的EOS就不屬於你了。
能不能用現有的ETH私鑰作為EOS私鑰?這樣,映射完成後,就不必保存私鑰,上線後直接導入ETH私鑰,這樣更方便。
這種方式是可行的。我們來看一下EOS私鑰和地址的編碼格式。
通過對EOSIO的eosjs-ecc的JavaScript源碼分析可知,EOS私鑰編碼格式和Bitcoin的非壓縮格式私鑰編碼完全一致,而EOS地址的編碼就比較奇葩,它的演算法是:
- 計算壓縮格式的33位公鑰;
- 取RipeMD160結果的前4位作為checksum;
- 把33位公鑰和4位checksum連起來,用Base58編碼,但不使用Base58的checksum;
- 加上前綴EOS即為最終地址。
地址不是公鑰哈希,而是包含公鑰,是不是無比山寨?
先不吐槽了,言歸正傳,現在我們需要共享ETH私鑰和EOS私鑰,假設我們擁有ETH私鑰:
0x6a49b749ee5588e7d8f59e42848072ba0de3484370f23afe12aea1ca16f89761
通過下面的代碼就可以正確轉換成EOS私鑰和EOS地址:
// THE CODE IS PROVIDED ON AN "AS IS" BASIS, AND NO WARRANTY,// EITHER EXPRESS OR IMPLIED, IS GIVEN.// YOUR USE OF THE CODE IS AT YOUR SOLE RISK.const ethUtil = require(ethereumjs-util), bitcoin = require(bitcoinjs-lib), wif = require(wif), bs58 = require(bs58);let ethPriv = 0x6a49b749ee5588e7d8f59e42848072ba0de3484370f23afe12aea1ca16f89761, rawPriv = Buffer.from(ethPriv.substring(2), hex), ethAddr = 0x + ethUtil.privateToAddress(rawPriv).toString(hex), btcPriv = wif.encode(0x80, rawPriv, true), eosPriv = wif.encode(0x80, rawPriv, false);let compressedPub = bitcoin.ECPair.fromWIF(btcPriv).getPublicKeyBuffer(), checksum = bitcoin.crypto.ripemd160(compressedPub), addr = Buffer.alloc(compressedPub.length + 4);compressedPub.copy(addr, 0);checksum.copy(addr, compressedPub.length, 0, 4);let eosAddr = EOS + bs58.encode(addr);console.log(Raw Private: + rawPriv.toString(hex));console.log(ETH Address: + ethAddr);console.log(BTC Private: + btcPriv);console.log(EOS Private: + eosPriv);console.log(EOS Address: + eosAddr);
執行結果如下:
Raw Private: 6a49b749ee5588e7d8f59e42848072ba0de3484370f23afe12aea1ca16f89761ETH Address: 0xb289c33560b6ef88ce481406f61b04a93f6ffaa0BTC Private: KznKZLHWwxBt3YeCDWfcrwzHf8Gc1JeQ4omnpy1sHXNUAsBzpT7qEOS Private: 5Jd6Zhcv1DWCZkRHb6pGNjpRAYZ5m2HBDC3u555jCuCD3nmnUgZEOS Address: EOS7nmwuAaB8WvYXJuH3YkXHGh7ABk4njitZRkjKCgaFCLcXEpAfA
生成的EOS私鑰及EOS地址和官網生成的完全一致,說明轉換正確。
對於普通用戶來說,把生成的EOS地址作映射,就不必保存EOS私鑰。
對於交易所這種擁有大量ETH地址的機構來說,通過計算ETH私鑰對應的EOS地址來映射,可以避免額外生成並持有大量EOS私鑰。
最後友情提醒:
除了EOS官網,不要使用任何第三方網站在線生成的EOS私鑰!
映射過程只需填寫EOS地址,不能填寫EOS私鑰!
本文中的代碼可自由使用,但未經全面測試,不承擔任何責任。使用本文中的代碼造成的任何後果完全自負!
推薦閱讀:
※先知幣破發,從量子鏈帥初吃相,看清大佬站台套路
※警惕EOS空投騙局,已經有人被騙!
※為什麼日本沒人去競選EOS超級節點(BP)?
※我的EOS DAPP到底需要多少個EOS Token來運行?
TAG:EOS柚子 |