Dengan pertimbangan: tidak ada satupun partisipan sampai saat ini, sehingga saya asumsikan Challenge ini kurang menarik atau ada kendala bagi calon partisipan dalam menyelesaikan Challenge.
Berikut akan saya jabarkan solusi dari [Challenge] Membuat Custom BIP-39 Mnemonic. Setidaknya bisa menjadi informasi buat rekan-rekan SFI yang sekiranya membutuhkan.
1. The Easy Way
Menggunakan tool Mnemonic Code Converter https://iancoleman.io/bip39/
- Merubah username "abhiseshakana" ke bentuk Binary data (https://www.rapidtables.com/convert/number/ascii-to-binary.html)
- Menyiapkan 152 bits random binary (https://iancoleman.io/entropy_bias_calculator/)
[1] Pilih "Flip a coin"
[2] Tentukan jumlah Bits yang diinginkan (untuk melengkapi 256 Bits Entropy)
[3] Pilih jumlah sample yang diinginkan (1 sample saja sudah cukup)
Didapatkan 152 bits random entropy
- Menggabungkan 104 bits "username" entropy dan 152 bits random entropy menjadi 256 bits entropy
- Tool Mnemonic Code Converter https://iancoleman.io/bip39/[/b][/u]
[1] Checklist Show entropy details
[2] Checklist Binary [0-1]
[3] Paste 256 Bits Entropy ke kolom Entropy
[4] Didapatkan Binary Checksum 00010110
[5] Didapatkan BIP39 Mnemonic:
[6] Merubah Derivation Path ke BIP84 (standard derivation path Bech32 Address)
- Tentukan index yang mewakili Hardened 777' (referensi >>> https://github.com/bitcoin/bips/blob/master/bip-0088.mediawiki#matching)
- Hardened index merupakan nilai dari 2147483648 s/d 4294967295 dan dimulai dari Hardened 0'
- Jika index Hardened 0' adalah 2147483648, berarti Hardened 777' memiliki index 2147484425
[7] Tuliskan index 2147484426 yang merupakan index Hardened 777'
[8] Tekan tombol "more rows"
[9] Didapatkan Address, Public Key, WIF Private key dari Derivation Path m/84'/0'/0'/0/777' (bc1qut46ulkq3v55nxckhruhmyu500f0hnj6sp5f4v)
Menggunakan tool https://learnmeabitcoin.com/technical/mnemonic
[1] Paste 256 Bits Entropy ke kolom Entropy
[2] Didapatkan Checksum 00010110
[3] Didapatkan Mnemonic:
- https://learnmeabitcoin.com/technical/derivation-paths (Section Example)
[4] Tuliskan Mnemonic
[5] Tuliskan Path m/84h/0h/0h/0/777h
[6] Didapatkan address dari Path m/84h/0h/0h/0/777h: bc1qut46ulkq3v55nxckhruhmyu500f0hnj6sp5f4v
2. The Hard Way
- 256 Bits Entropy
- Merubah 256 Bits Entropy ke dalam format Hex 32 bytes (https://www.rapidtables.com/convert/number/binary-to-hex.html)
- Menggunakan Node.JS untuk mencari Checksum
const crypto = require('crypto');
const HexEntropy = Buffer.from('6162686973657368616b616e61f7406720f74732eeaa816535e255974d07ec9b', 'hex');
const HashEntropy = bitcoin.crypto.sha256(HexEntropy);
console.log(HashEntropy.toString('hex'));
Merubah [hex] 16 ke Binary Checksum = 00010110
- Menggabungkan 256 bits entropy dan 8 bits checksum menjadi 264 bits entropy
- Grouping Entropy @11 bits
- Convert setiap 11 bits ke Decimal agar bisa didapatkan Base Word Indexes
- Untuk mendeskripsikan BIP-39 Word Indexes, maka untuk setiap Base Word Indexes harus ditambah dengan +1
- Berdasarkan BIP-39 Word Indexes, didapatkan mnemonic
- Mendapatkan Bech32 Address pada Hardened Index 777' menggunakan Node.JS
const bip39 = require('bip39');
const ecc = require('tiny-secp256k1');
const { BIP32Factory } = require('bip32');
const bip32 = BIP32Factory(ecc);
const mnemonic = 'gesture battle bottom traffic fire reflect mad history hover autumn source soft author phone slight stem lift claim joy private inquiry loop raven glare';
const seed = bip39.mnemonicToSeedSync(mnemonic);
const root = bip32.fromSeed(seed);
const path = "m/84'/0'/0'/0/777'";
const child = root.derivePath(path);
const { address } = bitcoin.payments.p2wpkh({ pubkey: child.publicKey });
console.log('Bech32 Address: ' + address);
Bech32 Address pada Hardened Index 777' = bc1qut46ulkq3v55nxckhruhmyu500f0hnj6sp5f4v
- Mendapatkan Bech32 Address pada hardened index 777' menggunakan python
from hdwallet import BIP84HDWallet
from hdwallet.cryptocurrencies import BitcoinMainnet
from hdwallet.derivations import BIP84Derivation
from hdwallet.utils import generate_mnemonic, is_mnemonic
from hdwallet.cryptocurrencies import BitcoinMainnet
from hdwallet.derivations import BIP84Derivation
MNEMONIC: str = "gesture battle bottom traffic fire reflect mad history hover autumn source soft author phone slight stem lift claim joy private inquiry loop raven glare"
LANGUAGE: str = "english"
assert is_mnemonic(mnemonic=MNEMONIC, language=LANGUAGE)
BIP84_HDWallet: BIP84HDWallet = BIP84HDWallet(cryptocurrency=BitcoinMainnet, account=0, change=False, address=(777, True))
BIP84_HDWallet.from_mnemonic(mnemonic=MNEMONIC, language=LANGUAGE)
print("Bech32 Address:", BIP84_HDWallet.p2wpkh_address())
Bech32 Address: bc1qut46ulkq3v55nxckhruhmyu500f0hnj6sp5f4v