วิธีการใช้ Wallet ใน Ethers.js

Ethers.js Mar 17, 2023

วิธีการสร้าง Wallet ใหม่ และการโหลด Wallet จาก Private Key หรือ Seed Phrase ที่มีอยู่ ด้วยการใช้ Ethers.js

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

เริ่มจากการติดตั้ง ethers ก่อนเลย (บทความนี้ อ้างอิงจาก ethers.js v5 นะครับ)

npm install ethers

วิธีที่ 1 ใช้การ Random ด้วย createRandom()

การสร้าง new Wallet วิธีแรก เป็นการสร้างแบบ Random กรณีที่เราไม่มี Seed Phrase หรือ Private Key เลย (ส่วนมาก เอาไว้สร้างมาเพื่อเทสอะไรเล่นๆ)

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

จริงๆ ไม่ใช่การสร้าง new Wallet แต่เป็นการ สร้างร instance Wallet จาก Seed Phrase เพื่อจะเข้าถึง Wallet หรือ sign บางอย่าง (อย่าลืม Seed Phrase ห้ามทำหาย ห้ามให้ใครรู้เป็นอันขาด ถ้าใครรู้คำ 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

เป็น Web Dev ทำงานมา 10 ปีหน่อยๆ ด้วยภาษา JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจ Web3, Crypto และ Blockchain เขียนบล็อกที่ https://devahoy.com