ane ada pertanyaan baru, kira2 apakah aman menggunakan wallet yang privatekey didapatkan dari seed di iancoleman.io ?
jadi maksud saya kalo alamat-alamat itu berasal dari seed, akan memudahkan ane jika sewaktu2 ingin memasukan seed ke walllet lain yang support seed.
Gunakan tool dari iancoleman yang versi offline-nya mas:
https://github.com/iancoleman/bip39/releases/tag/0.5.6Bagaimanapun juga cukup beresiko jika meng-generate seed menggunakan tool tersebut dalam keadaan online.
Seperti yang sudah dijelaskan oleh Om Husna, bahwa
https://iancoleman.io/bip39/ bisa dijalankan secara offline dengan cara memutus koneksi internet. Namun jika masih ada kekhawatiran dan ada kecurigaan, jika situs tersebut (atau situs-situs generator lainnya) memiliki hidden vulnerability dan memiliki kapabilitas untuk merekam log files dan mengirimkannya ke server pada saat koneksi internet tersambung kembali, maka salah satu cara untuk membuat mnemonic adalah dengan menggunakan Python atau Node JS.
Terus terang jika menyangkut mnemonic, seed dan private key, saya pribadi juga akan sangat berhati-hati karena informasi sensitif tersebut berkaitan dengan aset crypto yang kita miliki.
Dibawah ini saya buat script node js untuk men-generate BIP39 Mnemonic secara random
import * as bitcoin from "bitcoinjs-lib";
const bip32 = BIP32Factory(ecc);
import { BIP32Factory } from 'bip32';
import * as ecc from "tiny-secp256k1";
import * as bip39 from 'bip39';
const testnet = bitcoin.networks.testnet;
bitcoin.initEccLib(ecc);
const mnemonic = bip39.generateMnemonic();
const seed = bip39.mnemonicToSeedSync(mnemonic);
const root = bip32.fromSeed(seed, testnet);
const xprv = root.toBase58();
const xpub = root.neutered().toBase58();
console.log('BIP39 Mnemonic :', mnemonic);
console.log('BIP39 Seed :', seed.toString('hex'));
console.log('BIP32 Root Key :', xprv);
console.log('BIP32 Root PubKey :', xpub);
Namun jika agan menginginkan informasi yang lebih detail seperti yang tertampilkan di situs
https://iancoleman.io/bip39/, atau buat siapa saja yang ingin mengecek apakah bakal men-generate seed, XPRV, WIF, P2PKH address, dll yang sama dengan yang dihasilkan oleh
https://iancoleman.io/bip39/ maupun setelah diimport ke Client Bitcoin Core (menggunakan tutorial yang sudah saya post sebelumnya). Maka bisa menggunakan script panjang dibawah ini.
import * as bitcoin from "bitcoinjs-lib";
const bip32 = BIP32Factory(ecc);
import { BIP32Factory } from 'bip32';
import * as ecc from "tiny-secp256k1";
import * as bip39 from 'bip39';
const testnet = bitcoin.networks.testnet;
import { toXOnly, tapTreeToList, tapTreeFromList } from 'bitcoinjs-lib/src/psbt/bip371.js';
bitcoin.initEccLib(ecc);
const mnemonic = bip39.generateMnemonic();
const seed = bip39.mnemonicToSeedSync(mnemonic);
const root = bip32.fromSeed(seed, testnet);
const xprv = root.toBase58();
const xpub = root.neutered().toBase58();
console.log('BIP39 Mnemonic :', mnemonic);
console.log('BIP39 Seed :', seed.toString('hex'));
console.log('BIP32 Root Key :', xprv);
console.log('BIP32 Root PubKey :', xpub);
console.log("\n")
const path0 = "m/44'/1'/0'"
const account = root.derivePath(path0);
const accxprv = account.toBase58();
const accxpub = account.neutered().toBase58();
console.log("*BIP-44 (Derivation Path = m/44'/1'/0')");
console.log('Account XPRV :', accxprv);
console.log('Account XPUB :', accxpub);
console.log("\n")
const path1 = "m/44'/1'/0'/0"
const bipp32 = root.derivePath(path1);
const bip32xprv = bipp32.toBase58();
const bip32xpub = bipp32.neutered().toBase58();
console.log("*BIP-44 (Derivation Path = m/44'/1'/0'/0)");
console.log('BIP32 XPRV :', bip32xprv);
console.log('BIP32 XPUB :', bip32xpub);
console.log("\n")
const path2 = "m/44'/1'/0'/0/0"
const child1 = root.derivePath(path2);
const privkey = child1.toWIF();
const publick = child1.publicKey;
const p2pkh = bitcoin.payments.p2pkh({pubkey: child1.publicKey, network: testnet}).address;
console.log("*BIP-44 (Derivation Path = m/44'/1'/0'/0/0)");
console.log('WIF :', privkey);
console.log('PUBKEY :', publick.toString('hex'));
console.log('P2PKH :', p2pkh);
console.log("\n")
const path3 = "m/49'/1'/0'/0/0"
const child2 = root.derivePath(path3);
const privkey2 = child2.toWIF();
const publick2 = child2.publicKey;
const p2wsh = bitcoin.payments.p2sh({redeem: bitcoin.payments.p2wpkh({pubkey: child2.publicKey, network: testnet}), network: testnet}).address;
console.log("*BIP-49 (Derivation Path = m/49'/1'/0'/0/0)");
console.log('WIF :', privkey2);
console.log('PUBKEY :', publick2.toString('hex'));
console.log('P2SH-P2WPKH :', p2wsh);
console.log("\n")
const path4 = "m/84'/1'/0'/0/0"
const child3 = root.derivePath(path4);
const privkey3 = child3.toWIF();
const publick3 = child3.publicKey;
const segwit = bitcoin.payments.p2wpkh({pubkey: child3.publicKey, network: testnet}).address;
console.log("*BIP-84 (Derivation Path = m/84'/1'/0'/0/0)");
console.log('WIF :', privkey3);
console.log('PUBKEY :', publick3.toString('hex'));
console.log('P2WPKH :', segwit);
console.log("\n")
const path5 = "m/86'/1'/0'/0/0"
const child4 = root.derivePath(path5);
const privkey4 = child4.toWIF();
const publick4 = child4.publicKey;
const taproot = bitcoin.payments.p2tr({internalPubkey: toXOnly(child4.publicKey), network: testnet}).address;
console.log("*BIP-86 (Derivation Path = m/86'/1'/0'/0/0)");
console.log('WIF :', privkey4);
console.log('PUBKEY :', publick4.toString('hex'));
console.log('P2TR :', taproot);
Jika tidak ingin men-generate mnemonic secara random atau sudah memiliki mnemonic yang dibuat sendiri (misal melalui flip coin atau dari wasabi wallet), maka untuk mendapatkan informasi turunan dari mnemonic tersebut :
const mnemonic = bip39.generateMnemonic();
Diganti denganconst mnemonic = 'BIP39 Word List'
Untuk menjalankan Script Node JS diatas, sebelumnya harus mengunduh javascript library yang dibutuhkan
npm install bitcoinjs-lib
npm i bip39
npm i bip32
npm i tiny-secp256k1