Flavio Sousa / Mar 15 2023
Mastering Bitcoin chapter 4 - 02 Deriving a WIF private key from an int
{:deps {org.clojure/clojure {:mvn/version "1.11.1"} base58 {:git/url "https://github.com/fjsousa/base58" :sha "807fba7f9f38175531be81c4f4c4a682fc380433"} buddy/buddy-core {:mvn/version "1.10.413"} ;; complient is used for autocompletion ;; add your libs here (and restart the runtime to pick up changes) compliment/compliment {:mvn/version "0.3.9"}}}Extensible Data Notation
(ns play-with-addresses (:require [buddy.core.hash :as hash] [buddy.core.codecs :as codecs] [base58.core :as base58]) (:import java.math.BigInteger))2.1s
1 - Private key
;;key as decimal(def key (BigInteger. "13840170145645816737842251482747434280357113762558403558088249138233286766301"))0.1s
;;hex of a private key(def key-hex (.toString key 16))0.0s
2 - Base 58 Check Encoding
;; Base58check encoding from Mastering Bitcoin;; https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc#base58check_encoding0.0s

(def key-bytes (codecs/hex->bytes key-hex))(count key-bytes) ;;32 bytes, 256 bits0.0s
;;private key WIF version hex(def version-hex "80")0.0s
(def payload key-hex)(def checksum-bytes (->> (str version-hex payload) codecs/hex->bytes hash/sha256 hash/sha256 (take 4)))0.0s
(def private-key-wif (base58/encode (concat (codecs/hex->bytes version-hex) key-bytes checksum-bytes)))0.0s
3 - Compressed private key
;; hex of a "compressed" private key - appending 01 to the Hex of the private key above;; "The term "compressed private key" really means "private key from which only compressed ;; public keys should be derived";; "version prefix is the same (0x80) for both WIF and WIF-compressed formats"(def key-hex-compressed (str key-hex "01"))0.0s
;; getting the checksum the same way as above(def checksum-bytes-compressed (->> (str version-hex key-hex-compressed) codecs/hex->bytes hash/sha256 hash/sha256 (take 4)))(def private-key-wif-compressed (base58/encode (concat (codecs/hex->bytes version-hex) (codecs/hex->bytes key-hex-compressed) checksum-bytes-compressed)))0.0s
Comparing with the keys in the book to make sure we did everything right:
