วิธีการสร้าง Wallet ด้วย Ethers.js
วันนี้วันว่าง วันหยุดเช่นเคย เลยนั่งทบทวนพื้นฐานสุดๆ นั่นก็คือว่าด้วยเรื่องของการสร้าง Account การสร้าง Wallet ของ Ethereum ด้วยการใช้ Ethers.js นั่นเอง

โดยปกติ ผมใช้ Ethers.js ส่วนมาก ก็คือการ Connect Wallet หรือ Interact กับ Smart Contract โดยที่แทบไม่เคยสร้าง new Wallet ใหม่เลย ยกเว้นว่าเทสเล่นๆ เนื่องจากมีอยู่แล้ว จากทั้ง Metamask / Rainbow / หรือ Wallet อื่นๆ วันนี้ก็เลยลองนั่งศึกษา ดูว่า มันมีวิธีการสร้าง Wallet ยังไงบ้างนะ เลยมาจดบันทึกเอาไว้ เป็น Reference ละกัน
เราสามารถสร้าง Wallet ด้วยการใช้ Ethers.js ได้หลายวิธี ก่อนอื่น เราสามารถใช้ ethers.js จาก NPM โดยตรงเลย
npm install ethers
วิธีที่ 1 ใช้การ Random ด้วย createRandom()
const { Wallet } = require('ethers')
const wallet = new Wallet.createRandom()
ตัวอ็อปเจ็คของ wallet
จะมีข้อมูลคือ
{
address: 'YOUR_ADDRESS',
mnemonic: {
phrase: '12 words',
path: "m/44'/60'/0'/0/0",
locale: 'en'
},
privateKey: '<YOUR PRIVATE KEY>'
}
หากสังเกต ถ้าเราใช้ console.log
เราจะไม่เห็นค่า privateKey
และ mnemonic
เพราะตัว Wallet
เค้า ใช้ function signingKey()
กับ _mnemonic()
แทน เพื่อป้องกัน leaking (ซึ่งจริงๆ มันก็ยังเห็นแหละ เห็นไหม ฉะนั้น ควรใช้ด้วยความระวังนะครับ)
เราจะได้ทั้ง mnemonic และ privateKey
เลย
wallet.privateKey // <YOUR PRIVATE KEY>
wallet.mnemonic.phrase // <SEED PHRASES 12 WORDS>
วิธีที่ 2 สร้างจาก Seed Phrase
Seed Phrase หรือ Mnemonic Phrase เป็นชุดคำทั้งหมด 12 คำ (หรือ 24 คำ) ห้ามทำหาย ห้ามให้ใครรู้เป็นอันขาด ถ้าใครรู้คำ 12 คำของเรา เค้าก็สามารถเข้าถึง Wallet ของเราได้เลย (ไม่สามารถเปลี่ยน Seed Phrase ได้เหมือนกับเปลี่ยน Password นะ)
const { Wallet } = require('ethers')
const wallet = Wallet.fromMnemonic('your twelve word ...')
วิธีที่ 3 สร้างด้วย Private Key
Private Key เป็น Secret key ที่ห้ามให้ใครรู้ เช่นเดียวกันกับ Seed Phrase แต่ข้อแต่งต่างกันของ Private Key คือ ถ้ามีคนรู้ เค้าจะเข้าถึงได้เฉพาะ Account นั้นๆ (HD Wallet) ไม่สามารถเข้าถึง Account อื่นๆ ที่อยู่ใน Wallet เดียวกัน เช่น สมมติเราใช้ Metamask มีแค่ 1 Seed Phrase แต่เราสามารถ generate account ได้หลาย Account แต่ละ Account ก็จะมี Seed Phrase ต่างกัน
const { Wallet } = require('ethers')
const wallet = new Wallet('<PRIVATE_KEY>')
วิธีที่ 4 ใช้ JSON และ Password
วิธีนี้จะใช้ไฟล์ JSON และ Password ของเรา เพื่อสร้าง Wallet โดยมี 2 function คือแบบธรรมดา และแบบ async ครับ (return เป็น Promise ทำให้ต้องใช้ async/await)
const { Wallet } = require('ethers')
const wallet = await Wallet.fromEncryptedJson(json, password)
const wallet2 = Wallet.fromEncryptedJsonSync(json, password)
ซึ่งวิธีการ generate ตัว JSON เราสร้างจากฟังค์ชั่น encrypt
ได้เลย โดย callback function เป็น optional จะเอาไว้แสดง progress ก็ได้นะครับ เพราะการ Encrypt ก็ใช้เวลานิดนึง (300-1000ms) ไม่ได้ instant ทันที
const { Wallet } = require('ethers')
const encryptJSON = async (wallet) => {
const json = await wallet.encrypt('<YOUR_PASSWORD>', cb)
console.log(json) // your json
}
const wallet = Wallet.fromMnemonic('...')
encryptJSON(wallet)
อ่านเพิ่มเติม

