def basic_stealth_address_to_pubkeys(stealth_address): hex_data = main.b58check_to_hex(stealth_address) if len(hex_data) != 140: raise Exception('Stealth address is not of basic type (one scan key, one spend key, no prefix)') scan_pubkey = hex_data[2:68] spend_pubkey = hex_data[70:136] return scan_pubkey, spend_pubkey
def test_compose_tx_locking_script(self): # check with P2PKH addresses # Generate Valid PIVX address pK = privkey_to_pubkey(generate_privkey()) pivxAddr = pubkey_to_address(pK) # compose TX script result = compose_tx_locking_script(pivxAddr) print(result) # check OP_DUP self.assertEqual(result[0], int('76', 16)) # check OP_HASH160 self.assertEqual(result[1], int('A9', 16)) pubkey_hash = bytearray.fromhex(b58check_to_hex(pivxAddr)) self.assertEqual(result[2], len(pubkey_hash)) self.assertEqual(result[3:23], pubkey_hash) # check OP_QEUALVERIFY self.assertEqual(result[23], int('88', 16)) # check OP_CHECKSIG self.assertEqual(result[24], int('AC', 16))
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) print("개인키 --> 공개키 : ", pubKey) print("\n공개키 --> 지갑주소 (1. mainet 용) : ", address1) print("공개키 --> 공개키 해시 : ", pubHash160) print("\n공개키 해시 --> 지갑주소 (2. mainet 용) : ", address2) print("지갑주소 --> 공개키 해시 : ", pubHash1601) print("지갑주소 (Testnet 용) :", address3)
# pybitcointools를 설치하지 않고 배포용 실습 코드의 bitcoin 폴더가 있는 곳에서 실행한다. import base58 import binascii import bitcoin.main as btc import bitcoin.segwit_addr as bech32 # 비트코인 코어에서 지갑 주소로 WIF 개인키를 조회한다 # 디버그 콘솔 : dumpprivkey "지갑 주소" # 주소의 상세 내역 조회 : validateaddress "지갑 주소" privKeyWIF = "L1iJWxsPa6iSYuPC9mvYzL5SCjHiDhVHPhS5Gz1wJy3fLN6qPwgD" wifDecode = base58.b58decode(privKeyWIF).hex() # pybitcointool로 키를 변환한다 # 참조 : pybitcointools (https://pypi.python.org/pypi/bitcoin) # WIF 개인키를 일반 개인키로 변환한다. privKey = btc.b58check_to_hex(privKeyWIF) # 개인키로 공개키를 생성한다. pubKey = btc.privkey_to_pubkey(privKey) # 공개키로 160-bit public key hash를 생성한다 pubHash160 = btc.hash160(binascii.unhexlify(pubKey)) # P2SH용 스크립트를 생성한다. script = OP_0 + length + public key hash script = '00' + '14' + pubHash160 # 160 비트 스크립트 해시를 계산한다 scriptHash = btc.hash160(binascii.unhexlify(script)) # 스크립트 해시로 지갑 주소를 생성한다. addr = btc.hex_to_b58check(scriptHash, 0x05)