사전지식 - 비트코인 지갑 주소 생성원리 - 니모닉(BIP39) - HD Wallet (하나의 니모닉으로 여러가지 주소를 사용하는 것) - BIP44/BIP49/BIP84 BIP85 란? - 하나의 니모닉으로 여러 개의 결정적 니모닉을 자동으로 만들어 주는 것 - 하나의 니모닉(시드, 마스터키)를 통해 여러 개의 HD Wallet(꼭 HD Wallet 일 필요는 없음) 을 만들어내고 관리하는 방법 언제 필요할까 - BIP44 를 사용하는 A지갑, BIP84 를 사용하는 B지갑, wif를 사용하는 C 종이지갑을 하나의 키로 백업(관리)하고 싶은 경우 - 아빠가 가족 구성원들에게 비트코인 지갑을 제공해 주면서 각 지갑의 통제권을 갖는다. 이때 BIP85 를 이용하면 가족 구성원의 각 니모닉을 따로 보관할 필..
라이브러리 설치 npm i -g bitcoinjs-lib ecpair tiny-secp256k1 npm link bitcoinjs-lib ecpair tiny-secp256k1 거래생성 코드 const bitcoin = require('bitcoinjs-lib') const ecc = require('tiny-secp256k1') const { ECPairFactory } = require('ecpair') const ECPair = ECPairFactory(ecc) const validator = ( pubkey, msghash, signature ) => ECPair.fromPublicKey(pubkey).verify(msghash, signature) const alice = ECPair.fromW..
일반적으로 비트코인 노드를 설치하면 Outgoing connection 만 활성화 되어 있다. 이는 외부에서 나의 노드로 먼저 요청을 보낼 수 없음을 의미한다. 비트코인 네트워크에서 보다 적극적이고 의미있는 기여를 하기 원한다면 다른 노드들의 요청에 내가 응답을 해줄 수 있어야 할 것이다. 이렇게 외부의 요청에 대응할 수 있는 풀노드의 상태를 Incoming connection 이 활성화되어 있다 혹은 접근 가능한 노드다 라고 말한다. 그리고 해당 노드들은 bitnodes.io 에서 확인이 가능하다. https://bitnodes.io/nodes/live-map/ 일반적으로 유동 IP를 사용하는 가정에서 나의 노드를 Reachable Node 로 만드는 방법은 아래와 같다. 포트포워딩 공유기에서 8333..
Disclaimer 개인적으로 SSD에 설치되있던 umbrel 을 HDD로 이전하다가 실패한 경험이 있었습니다. https://twitter.com/btclog29/status/1637764478644420608 트위터에서 즐기는 비트 전하는 키팅⚡ “@bitoka_h @my3rdstory 기존에 잘 설치되었던 ~/umbrel 폴더를 그대로 /mnt/hdd/umbrel 폴더로 복사한 후(584G), /mnt/hdd/umbrel 에서 엄브렐을 시작해 보았다. 시작은 잘 되었고 디스크 용량은 기대했던데로 2TB twitter.com 결국 hdd 를 ext4로 포맷하고 처음부터 umbrel 을 다시 설치하는 수고를 겪었지만 hdd 의 파일시스템만 ext4 로 되어 있었다면 파일복사만으로도 이전이 가능했을 것 ..
umbrel 은 기본적으로 홈경로에 설치된다( ~/umbrel) 그리고 엄브렐의 모든 설치파일들은 해당 폴더 아래 설치가 된다. 그러므로 외장 hdd 에 엄브렐을 설치하려면 hdd 를 마운트한 후에 마운트된 경로를 지정하여 엄브렐을 설치하여야한다. 1. 연결된 hdd 경로 확인 sudo fdisk -l 2. /mnt/hdd2tb 로 마운트 sudo mount /dev/sda2 /mnt/hdd2tb 3. /mnt/hdd2tb 경로에 사용자 계정 권한 부여(hdd가 ext4 파일시스템으로 포맷된 상태여야 함) $ sudo chown -R user1 /mnt/hdd2tb 4. /mnt/hdd2tb/umbrel 경로에 umbrel 설치 curl -L https://umbrel.sh | bash -s -- --i..
니모닉은 비트코인의 소유권과 동일하다. 그렇기 때문에 일반적으로 니모닉을 클라우드에 보관하는 것은 해킹의 위험에 취약할 수 있다. 하지만 오프라인 상에서만 보관할 경우에는 분실 및 훼손의 위험으로부터 또한 자유로울 수 없다. 보다 유연한 니모닉 관리 방법으로서 아래와 같이 온&오프 환경 모두에 보관하는 방법을 제안해 본다. 패스프레이즈를 설정하여 24개 단어 니모닉을 생성 패스프레이즈는 최소 20글자 이상으로 설정 본인만 충분히 암기 가능한 문자열로 설정 니모닉 3분할(샤미르백업) 샤미르 백업이란 24개 단어중 8단어씩 서로 겹치지 않게 마스킹 처리하여 3개로 분리 하는 것 3개 중 서로 다른 2개의 백업본만 있으면 전체 단어가 완성됨 패스프레이즈 관리 절대 클라우드에 저장하지 않는다 오프라인에서 메모해..
[비트코인의 상수] 반감기: 4년 블록생성시간: 10분 최대공급량: 21,000,000개 반감기 기준 블록 높이: 210,000 heights 이 모든 상수들은 10분과 4년으로부터 도출될 수 있다. 10분은 블록이 안정적으로 전파되는데 필요한 시간 4년은 채굴자가 다음 반감기를 준비하는데 필요한 시간 4년은 60*24*365 + 60*24*365 + 60*24*365 + 60*24*366(윤년) = 2,103,840분 반감기 4년을 10분으로 나누면? 210,384 이 중 64시간에 해당하는 384 는 계산 편의상 버림 그러므로 반감기 주기 210,000 은 210,384 의 근사치로 결정된 값이라고 볼 수 있다. 실제로 비트코인의 정확한 반감기 주기는 2,100,000 분이고 이는 4년보다 64시간 ..
먼저 Mnemonic 모듈 설치 pip install Mnemonic like this >>> from mnemonic import Mnemonic >>> from bitcoin import sha256 >>> >>> m = Mnemonic('english') >>> priv = sha256('xxxx') >>> priv '2481a63c85a62cf889d2b149f1a52e985a9341750173fe01eff50cc27b5941b5' >>> words = m.to_mnemonic(bytes.fromhex(priv)) >>> words 'cause artwork monkey area glare labor chef file enemy minor entry cost powder pass staff com..
네이티브 세그윗 주소 생성 코드 from bitcoin import * # byte 값을 bit로 변환 def bits(bytes): result = '' for b in bytes: temp = '' for i in range(8): temp += str((b >> i) & 1) result += (temp[::-1]) return result # 5 bit씩 불러오기 def read_by_5bit(bytes_p) : count = 1 bits_5 = '' result = '' for b in bits(bytes_p): bits_5 += b if count==5: result += f'{int(bits_5, 2):02x}' count = 1 bits_5 = '' else: count += 1 retur..
BIP39 니모닉 단어 목록 https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md 파이썬 코드 from bitcoin import sha256 import requests # fetch 2048 words res = requests.get("https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt") arr = res.text.strip().split('\n') # 23 words selected words_23 = 'aerobic bulk nice flip focus exit pause census globe garden vacant thumb g..
필요한 모듈 설치 pip install cryptos SegWit 주소 생성 방법 from cryptos import * priv = random_key() # your private key b = Bitcoin() # 세그윗 주소생성 addr_sw = b.privtop2w(priv) # '3MeQ13kvDsPGzT6WaQdiygawzgMcizf1sD' 해당 주소의 정확한 명칭은 p2sh-p2wpkh 가 됩니다. (Nested SegWit) 세그윗은 내부적으로 압축 공개키를 사용합니다. (비압축 공개키 사용이 제한됨) SegWit 주소에서 출금 방법 from cryptos import * b = Bitcoin() # 출금할 세그윗 주소 addr_sw = '3MeQ13kvDsPGzT6WaQdiygawzgM..
세그윗이 증명(witness) 데이터에 대한 수수료 과금을 거래(only tx) 데이터보다 75% 할인해 주는 까닭은 단지 사용자로 하여금 SegWit 주소 사용을 권장하기 위한 것일 뿐이다. 세그윗으로 거래속도가 개선된 것은 단지 블록의 사이즈가 늘어났기(최대 1.8MB) 때문이지 세그윗의 다른 혁신이 있기 때문은 아니다. 블록의 사이즈를 늘림으로 거래속도가 개선되는 부분은 득(확장성)과 실(탈중앙화)이 공존하기 때문에 논외로 한다면, 세그윗으로 얻은 순이익은 거래가변성 문제의 해결 뿐이다. 어째튼 세그윗은 비트코인에 정식 업데이트로 받아들여 진지 오래고 개인 입장에서는 레거시주소보다는 세그윗주소를 사용하는 것이 더욱 현명하다. 레거시 주소 사용을 고집한다면, 증명데이터 크기가 100Byte, 수수료가..
미루고 미뤄오던 비트코인 풀노드 설치를 시작하며 기록을 남깁니다. 라즈베리파이를 하나 준비해서 별도로 풀노드 서버를 하나 준비하려다가 최근 가격이 많이 올라서 그냥 개인 노트북에 설치를 시작합니다. 비트코인 코어 다운로드 본인 PC환경에 알맞게 비트코인 코어를 다운로드 합니다. Bitcoin Core 22.0 기준으로 Mac dmg 설치파일은 14MB 용량이네요. https://bitcoin.org/ko/download 설치파일을 실행할 때 별도 관리자 권한이 필요할 수 있습니다. (Mac 의 경우 옵션키를 누른 후 프로그램 열기하시면 됩니다.) 설치 옵션 현재(22년 12월 5일) 블록체인 전체 용량은 420GB 인데 해당 블록체인 장부를 내려받을 폴더를 선택합니다. 이때 PC의 저장공간이 충분치 않다..
What is the SegWit? 거래 데이터에서 증명을 분리해서 증명데이터 영역에 별도로 보관하는 주소 방식(잠금장치) Background 거래가변성 문제 TXID 생성시 증명을 포함함으로 증명을 살짝 바꾸면 동일한 거래이지만 TXID가 달라질 수 있는 문제 거래검증의 효율을 떨어트린다.(변조된 TXID가 블록에 들어갈 수 있게 된다) Benefit TXID 해시의 대상에서 증명을 제거함으로 거래가변성 문제를 해결한다. 하지만 p2pkh 레거시 주소를 사용하는 거래는 여전히 거래가변성 문제에 노출되어 있음 비트코인의 거래속도를 높인다. 한번에 처리할 수 있는 거래개수가 늘어나기 때문에 사용자 입장에서 수수료 절감 Details TXID 의 원본메세지에서 증명(or 서명) 부를 제거한다. 증명의 위치를..
니모닉으로 HD 지갑 만들기 from mnemonic import Mnemonic import bip32utils mnemon = Mnemonic('english') words = mnemon.generate(128) print(words) from bitcoinlib.wallets import Wallet w = Wallet.create("Wallet7", witness_type='segwit', keys=words, network='bitcoin') WalletKeys = w.get_keys(number_of_keys=5) for k in WalletKeys: print(k.address) # 지갑주소들의 모든 정보 확인(비밀키 포함) w.as_dict(include_private=True) # 바이..
비트코인을 화폐로 사용할 수 없는 이유로 많은 사람들이 비트코인의 변동성을 이유로 제시한다. 하지만 비트코인의 변동성은 비트코인에게 오히려 사용자층을 확보하는 강력한 유인이 된다. 그 이유는 다음과 같다 1. 비트코인의 여름 가격이 미친듯이 오른다. 많은 사람들이 열광하며 몰려온다 2. 버블이 무너지고 긴 겨울이 되면 많은 사람들이 물리고 멘붕이 온다. 비트코인에 대하여 진지하게 알아보기 시작한다. 비트코인의 오묘한 마력에 빠져서 결국 비트코이너가 된다. 이렇게 한 사이클을 거칠 때마다, 비트코인은 다시 새로운 열렬 팬들을 확보한다. 그래서 다음 여름에는 더 높은 가격까지 치솟게 된다. 그런데 그러다 결국 진짜 변동성이 없어진다면? 그럼 비트코인을 진짜로 화폐처럼 사용하는 것도 가능해져서 더 좋다. 그럼..
니모닉 단어를 임의로 선택해서 사용하는 것 자체가 니모닉의 사용 목적에 반하는 것이긴 하지만, 굳이 임의로 선택하겠다 하면 완전히 불가능하지는 않다. 니모닉은 자체적으로 체크섬을 포함하기 때문에 체크섬에 해당하는 단어만 제외하고 나머지는 2048개의 니모닉 단어들 중 임의로 선택해서 사용하는 것이 가능하다. 예를 들어 12단어 니모닉의 경우에는 128비트의 난수와 4비트의 체크섬을 가진다. 이 경우 마지막 단어만 체크섬에 해당하기 때문에, 앞에서부터11개 단어까지는 임의로 선택할 수 있다. 그런데 단어 하나가 11비트를 표현함으로 앞에서부터 11개 단어는 121비트를 표현한다. 128비트의 엔트로피 길이를 맞추기 위해 부족한 7비트는 임의로 선택을 한 후에 완성된 128비트 난수값을 sha256 해시 돌..
먼저 인터넷 연결 환경에서 필요한 모듈 설치 pip install bitcoin qrcode image ※ image 모듈은 아래 코드에는 없지만, qrcode.make() 수행시에 내부적으로 사용을 하기 때문에 사전 설치가 필요합니다. 압축주소를 생성하고 QR코드까지 생성하기 (여기부터는 인터넷 연결 없이 진행 가능) from bitcoin import * import qrcode # 임의로 비밀키 생성하고 압축 공개키까지 생성 priv = random_key() pub = privtopub(priv) prefix = '02' if int(pub[-1], 16) % 2 == 0 else '03' pub_compressed = prefix + pub[2:66] # 압축된 공개키로 주소를 만들고 비밀키를 ..
비밀키로부터 지갑주소를 만드는 방법에는 압축주소와 비압축주소 2가지 방법이 있습니다. 압축주소란 압축된 공개키로부터 비트코인 주소를 얻는 것을 말하며, 비압축주소란 압축되지 않은 공개키로부터 비트코인 주소를 얻는 것을 말합니다. 공개키 압축에 관한 상세 내용은 아래 자료를 참고해 주세요. https://learnmeabitcoin.com/technical/public-key 사실 비압축 주소라는 이름은 상당히 어색한 이름입니다. 이보다는 그냥 레거시 주소 혹은 오리지날 주소 정도가 더 적절한 이름이지 않을까 싶습니다. 왜냐하면 이 주소 형태는 비트코인 초창기에 사용되었던 주소 형태이기 때문입니다. 이후에 공개키의 값을 압축하는 방법이 발견되면서 공개키를 압축해서 사용하는 주소들이 생겨났고 사실 이와 구별..
P2PKH 주소란 무엇인가요? p2pkh 는 pay to public key hash 를 의미합니다. p2pkh는 비트코인 네트워크에서 가장 일반적으로 많이 사용되는 주소 형태입니다. 보통 1xxxxx 로 시작하는 주소 유형입니다. 일반적으로 주소라고 알려진 것은 사실 정확히 표현하자면 잠금장치를 의미합니다. p2pkh 주소 유형은 비트코인을 공개키의 해시로 암호화합니다. p2pkh 를 이해하기에 앞서 P2PK 를 먼저 알아보는 것이 유익합니다. p2pk 는 pay to public key 를 의미하며, 공개키 자체를 주소로 사용하는 것입니다. 이는 단지, 공개키만 이용해서 비트코인을 잠금 상태로 만든다는 것이기 때문에 매우 직관적입니다. 최초의 비트코인 거래는 사토시나카모토가 할피니에게 전송한 거래로 ..
1/4 사이버 공간은 모든 것이 완전히 똑같이 복제가 가능하므로 가짜가 넘쳐 나고 진짜를 구별할 수 없다. 그런데 비트코인은 이런 사이버 공간 위에 물리적 에너지를 기반으로 하는 새로운 현실 세계를 구축할 수 있게 해주었다. 2/4 작업증명이란 물리적 에너지를 디지털 에너지로 전환하는 과정이다. 그리고 이렇게 디지털화된 에너지에는 현실의 물리 법칙이 동일하게 적용된다. 3/4 열역학 제 1법칙, 닫힌 계에서 에너지는 형태만 전환될 뿐 사라지거나 생성되지 않는다. vs 비트코인이 속한 주소는 변경될 수 있지만 전체 발행량은 변하지 않는다. 열역학 제 2법칙, 닫힌 계에서 엔트로피는 계속 증가할 뿐 줄어들 지 않는다. vs 블록에 한번 새겨진 거래는 되돌릴 수 없다. 4/4 이렇게 가상 공간에 구축된 물리적..
Background 비트코인 표준 스크립트 종류 null-data 스크립트란 비트코인 장부에 특정 데이터를 저장하기 위한 목적으로 사용 OP_RETURN 의 op_code 는 `0x6a` `NULL DATA` 의 scriptPubKey 의 구조 {OP_RETURN} + {문자열길이} + {임의문자열} 예시) OP_RETURN + 11 + hello world => 6a0b68656c6c6f20776f726c64 null-data 트랜잭션 만들기 from cryptos import * c = Bitcoin() addr = 'address' inputs = c.unspent(addr) balance = inputs[0].get('value') fee = 500 message = b'Jesus is the C..
예시 * 레거시 거래 https://mempool.space/tx/0c247433e4e53ba1f4f52c0cc75556f7057f22f2b99b5895322d5da958c358ff * 세그윗 거래 https://mempool.space/tx/d23f0f768236f2a58bd7ca6b544ec24c09baabccddd1aa5c6f6fe90716879862 SegWit 증명데이터를 TXID 해시 원본값에서 분리하는 비트코인 업데이트 Transaction 거래데이터 + 증명데이터 sat/B 수수료 / 거래에 사용된 물리적인 바이트 수 WU(Weight Unit) 기본 거래 데이터의 1Byte 는 4WU 로 계산 증명 데이터의 1Byte 는 1WU로 계산 하나의 블록 사이즈 용령은 4백만 WU까지 제한됨 s..
2009년 1월 3일 첫번째 블록 https://www.blockchain.com/explorer/blocks/btc/0 첫번째 거래 https://www.blockchain.com/btc/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b https://mempool.space/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f input의 Sigscript 숨겨진 메세지 5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062..
원하는 문자로 시작하는 주소를 채굴하고 니모닉을 리턴하는 함수를 작성해 보았습니다. passphrase 는 옵션이지만, 씨드는 반드시 True Random Number 를 던지는 것이 중요합니다. from bitcoin import * from mnemonic import Mnemonic m = Mnemonic('english') def buildaddr(seed, passphrase, prefix) : for i in range(10000000) : ent = sha256(seed + str(i))[0:32] priv = sha256(ent + passphrase) addr = privtoaddr(priv) if i % 500 == 0 : print(i, priv, addr) if addr.starts..
채굴 난이도 2016 블록마다 채굴난이도가 조절된다. 하나의 블록이 정확히 10분마다 생성된다고 할 때 14일이면 2016 블록이 생성되게 된다. 난이도 조절은 아래와 같이 20160 분을 이전 2016 블록이 생성되는 데 소요된 실제 시간(분)으로 나눈 값을 구한 뒤 expected / actual 20160 / 소요된시간(분) 해당 계산 값으로 이전 difficulty 값에 곱해주면 다음 difficulty 값이 된다. difficulty x (20160 / actual ) = new difficulty 난이도는 한번에 최대 0.25 ~ 4 배까지만 조정될 수 있다. difficulty 는 최초 비트코인이 채굴되던 당시에 비해서 난이도가 몇배나 더 어려워졌는지를 의미한다. 갑자기 1초에 1채굴하는 머..
최근 이더리움이 POS전환에 성공하면서 비트코인이 채굴에 전기를 사용하는 것에 대한 비난 여론이 더욱 거세지는 것 같습니다. 지혜의 족보 오태민 작가님도 이에 대한 의견을 주셨었는데요. https://www.youtube.com/post/UgkxLaliO9x_fILUjjrBAY_p-hthCcftmrrJ 관련해서 저도 개인적으로 평소에 가지고 있던 생각을 공유해 보고자 합니다. 환경 문제는 정말 중요하다. 온실가스와 지구 온난화 문제에 대한 전 지구적인 기후변화 문제가 정말 심각하다는 데에 인식을 달리 하는 사람은 없을 것 같습니다. 지구온난화의 원인으로 온실가스가 주 원인으로 지목이 되고 있고요. 또 온실가스는 화석연료 사용으로 발생하죠. 또한 쓰레기 문제도 심각하죠. 미세 플라스틱에 의한 해양오염에 대..
니모닉은 BIP39 제안으로서 비밀키를 저장하고 관리하기에 불편함을 극복하기 위한 새로운 해결책으로서 제안되었다. 사실 256비트의 이진수가 바로 날 것 그대로의 비밀키이고 이는 컴퓨터 머신에게 익숙한 형태다. 하지만 사람이 해당 값을 다루기에는 너무나 불편하다. 겨우 16진수 표현을 사용하여 길이를 짧게 표현해 낼 수는 있지만, 턱없이 불편한 형태이고 이를 개선하기 위해 체크섬과 BASE58 인코딩을 적용한 WIF 형태는 그나마 조금 나은 상태이지만, 여전히 기록하기에 그리고 구두로 전달하기에 또는 기억하기에는 어려움이 있다. 즉 비밀키가 너무나 중요한 정보이지만 사람이 이를 관리하기란 여간 까다로운 것이 아니다. 그래서 무작위로 생성된 256비트의 비밀키를 보다 인간에게 익숙하고 관리하기 용이한 형태..
비트코인 비밀키는 내가 임의로 선택할 수 있지만, 선택된 비밀키로부터 파생되는 비트코인 주소는 내가 마음데로 선택할 수가 없다. 주소값은 비밀키로부터 계산된 결과이기 때문에 당연하다. (주소값으로부터 비밀키를 얻는 것은 당연히 불가능하다) 그런데 가끔 의미있는 단어를 포함하는 주소를 볼 때가 있다. 아래는 유명한 bitaddress.org 사이트의 관리자 후원 비트코인 주소이다. 재미나게? 닌자라는 단어로 주소가 시작된다. 이러한 주소는 어떻게 가질 수 있을까? 비트코인 전체 주소에 정확히 매칭되는 비밀키를 찾는 것은 불가능하지만, 비트코인 주소의 일부만 매칭되는 비밀키를 찾는 것은 크게 어렵지 않다. 예를 들자면, 1bitOOOOOOOOOOOOOOOO 와 같이 앞 4글자만 원하는 글자가 새겨진 비트코인..