def mk_stealth_tx_outputs(stealth_addr, value, ephem_privkey, nonce, network='btc'): scan_pubkey, spend_pubkey = basic_stealth_address_to_pubkeys(stealth_addr) if network == 'btc': btc_magic_byte = 42 if stealth_addr != pubkeys_to_basic_stealth_address( scan_pubkey, spend_pubkey, btc_magic_byte): raise Exception('Invalid btc mainnet stealth address: ' + stealth_addr) magic_byte_addr = 0 elif network == 'testnet': testnet_magic_byte = 43 if stealth_addr != pubkeys_to_basic_stealth_address( scan_pubkey, spend_pubkey, testnet_magic_byte): raise Exception('Invalid testnet stealth address: ' + stealth_addr) magic_byte_addr = 111 ephem_pubkey = main.privkey_to_pubkey(ephem_privkey) output0 = { 'script': mk_stealth_metadata_script(ephem_pubkey, nonce), 'value': 0 } pay_pubkey = uncover_pay_pubkey_sender(scan_pubkey, spend_pubkey, ephem_privkey) pay_addr = main.pubkey_to_address(pay_pubkey, magic_byte_addr) output1 = {'address': pay_addr, 'value': value} return [output0, output1]
def mk_stealth_tx_outputs(stealth_addr, value, ephem_privkey, nonce, network='btc'): scan_pubkey, spend_pubkey = basic_stealth_address_to_pubkeys(stealth_addr) if network == 'btc': btc_magic_byte = 42 if stealth_addr != pubkeys_to_basic_stealth_address( scan_pubkey, spend_pubkey, btc_magic_byte): raise Exception('Invalid btc mainnet stealth address: ' + stealth_addr) magic_byte_addr = 0 elif network == 'testnet': testnet_magic_byte = 43 if stealth_addr != pubkeys_to_basic_stealth_address( scan_pubkey, spend_pubkey, testnet_magic_byte): raise Exception('Invalid testnet stealth address: ' + stealth_addr) magic_byte_addr = 111 ephem_pubkey = main.privkey_to_pubkey(ephem_privkey) output0 = {'script': mk_stealth_metadata_script(ephem_pubkey, nonce), 'value': 0} pay_pubkey = uncover_pay_pubkey_sender(scan_pubkey, spend_pubkey, ephem_privkey) pay_addr = main.pubkey_to_address(pay_pubkey, magic_byte_addr) output1 = {'address': pay_addr, 'value': value} return [output0, output1]
xPub01 = det.bip32_ckd(mPub, 1) # 마스터 공개키로 Depth-1의 공개키를 생성한다 # 계층-2의 extended private key와 public key를 생성한다. # Depth-2 (m/1/0) xPrv010 = det.bip32_ckd(xPrv01, 0) # Depth-1의 개인키로 Depth-2의 개인키를 생성한다 xPub010 = det.bip32_ckd(xPub01, 0) # Depth-1의 공개키로 Depth-2의 공개키를 생성한다 # 계층-3의 extended private key와 public key를 생성한다. # Depth-3 (m/1/0/0) xPrv0100 = det.bip32_ckd(xPrv010, 0) # Depth-2의 개인키로 Depth-3의 개인키를 생성한다 xPub0100 = det.bip32_ckd(xPub010, 0) # Depth-2의 공개키로 Depth-3의 공개키를 생성한다 # Address (m/1/0/0) prv0100 = det.bip32_extract_key(xPrv0100) pub0100 = det.bip32_extract_key(xPub0100) adr0100 = btc.pubkey_to_address(pub0100, 0x00) # Depth-3의 공개키로 주소를 생성한다 # 결과 출력 print("\nDepth-3 (m/1/0/0) :") print("\nxPrivate Key =", xPrv0100) print("\nxPublic Key =", xPub0100) print("\nPrivate Key =", prv0100) print("Public Key =", pub0100) print("Address =", adr0100) # Depth-3의 공개키는 Private key로 생성한 것이 아님. Depth-2의 공개키로 생성한 것임. # 그럼에도 불구하고 아래 관계가 성립해야함. # prv0100 --> pub0100 관계를 확인한다. pubKey = btc.privkey_to_pubkey(prv0100) if pubKey == pub0100: print("\nPrivate Key --> Public Key 관계가 잘 성립함.")
# 파이썬 실습 파일: 3-5.지갑주소.py # pybitcointools를 설치하지 않고 배포용 실습 코드의 bitcoin 폴더가 있는 곳에서 실행한다. import bitcoin.main as btc # 개인키를 생성한다 while (1): privKey = btc.random_key() # 256 bit Random number를 생성한다 dPrivKey = btc.decode_privkey(privKey, 'hex') # 16진수 문자열을 10진수 숫자로 변환한다 if dPrivKey < btc.N: # secp256k1 의 N 보다 작으면 OK break # 개인키로 공개키를 생성한다. pubKey = btc.privkey_to_pubkey(privKey) # 공개키로 지갑 주소를 생성한다. (mainnet 용) address1 = btc.pubkey_to_address(pubKey, 0) # 공개키로 160-bit public key hash를 생성한다 pubHash160 = btc.hash160(btc.encode_pubkey(pubKey, 'bin')) # 160-bit public key hash로 지갑 주소를 생성한다. (위의 address와 동일하다) address2 = btc.hex_to_b58check(pubHash160, 0) # 지갑 주소를 160-bit public key hash로 변환한다. (위의 pubHash160과 동일하다) pubHash1601 = btc.b58check_to_hex(address2) # 공개키로 testnet용 지갑 주소를 생성한다 address3 = btc.pubkey_to_address(pubKey, 0x6f) # 결과 확인 print("\n\n개인키 : ", privKey)
# 파이썬 실습 파일: BrainWallet.py # pybitcointools (https://github.com/vbuterin/pybitcointools) # pybitcointools를 설치하지 않고 배포용 실습 코드의 bitcoin 폴더가 있는 곳에서 실행한다. import bitcoin.main as btc # 특정 문자열로 256-bit 개인키를 생성한다 (long brain wallet passphrase). passphrase = 'Brain Wallet 시험용 개인키입니다. 잊어버리지 마세요.' privKey = btc.sha256(passphrase) dPrivKey = btc.decode_privkey(privKey, 'hex') # 16진수 문자열을 10진수 숫자로 변환한다 if dPrivKey < btc.N: # secp256k1 의 N 보다 작으면 OK # 개인키로 공개키를 생성한다. pubKey = btc.privkey_to_pubkey(privKey) # 공개키로 지갑 주소를 생성한다. (mainnet 용) address = btc.pubkey_to_address(pubKey, 0) # 결과 확인 print("\n\nPassphrase :", passphrase) print("\n개인키 :", privKey) print("개인키 --> 공개키 :", pubKey) print("\n공개키 --> 지갑주소 :", address) else: print("요청하신 Passphrase로 개인키를 만들었으나, 유효하지 않습니다.") print("다른 Passphrase로 다시 시도해 주세요.")