วิธีการสร้าง Wallet ด้วย Ethers.js

Blockchain Sep 17, 2022

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

Documentation
Documentation for ethers, a complete, tiny and simple Ethereum library.

โดยปกติ ผมใช้ 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)

อ่านเพิ่มเติม

Introduction to Ethers.js
Learn the ethers.js library and how to use it to interact with smart contracts!
Intro to Ethers.js
My short notes and code snippets about Ethers.js

Tags

Chai Phonbopit

Frontend Dev ธรรมดาคนนึง ประสบการณ์ 10 ปีนิดๆ ปัจจุบันกำลังสนใจเรื่องของ Crypto, Web3, Blockchain และ Smart Contract กำลังหัดเรียนรู้ยามว่าง 👻