Post
Topic
Board Bahasa Indonesia (Indonesian)
Merits 2 from 1 user
Re: BITCOIN CORE
by
punk.zink
on 05/06/2024, 12:58:46 UTC
⭐ Merited by Husna QA (2)
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.6
Bagaimanapun 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
Code:
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.

Code:
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 :
Code:
const mnemonic = bip39.generateMnemonic();
Diganti dengan
Code:
const mnemonic = 'BIP39 Word List'



Untuk menjalankan Script Node JS diatas, sebelumnya harus mengunduh  javascript library yang dibutuhkan

Code:
npm install bitcoinjs-lib
npm i bip39
npm i bip32
npm i tiny-secp256k1