在开始之前,你需要确保你的开发环境已经安装了Python。你可以去官网下载并安装。我们还需要一个库来处理加密,Python有个库叫做`ecdsa`,可以用来处理椭圆曲线加密,正好适合用来生成公钥和私钥。
用pip安装`ecdsa`库:
pip install ecdsa
私钥是你钱包的核心,可以理解为一把钥匙。而公钥就是从私钥生成的“地址”,用来接收资产。生成私钥十分简单。随机生成一个256位的二进制数,然后再用它生成公钥。
import os
import ecdsa
import hashlib
def generate_private_key():
return os.urandom(32)
def private_to_public(private_key):
return ecdsa.SigningKey.from_string(private_key, curve=ecdsa.SECP256k1).get_verifying_key().to_string()
private_key = generate_private_key()
public_key = private_to_public(private_key)
print(f"Private Key: {private_key.hex()}")
print(f"Public Key: {public_key.hex()}")
钱包地址是用公钥生成的。我们会用SHA-256对公钥先哈希,然后再用RIPEMD-160再哈希一次,最后我们会加上版本号码和校验码。钱包地址其实也是一个经过编码的字符串。
def public_to_address(public_key):
sha256 = hashlib.sha256(public_key).digest()
ripemd160 = hashlib.new('ripemd160')
ripemd160.update(sha256)
address_info = b'\x00' ripemd160.digest() # 加上版本前缀
checksum = hashlib.sha256(hashlib.sha256(address_info).digest()).digest()[:4] # 校验码
return (address_info checksum).hex()
address = public_to_address(public_key)
print(f"Wallet Address: {address}")
现在我们有了私钥、公钥和钱包地址,接下来要做的就是创建交易。我们这里只做一个简单的交易。为了便于理解,我们将交易记录存储在简单的字典中。
def create_transaction(from_address, to_address, amount, private_key):
transaction = {
'from': from_address,
'to': to_address,
'amount': amount
}
return transaction
transaction = create_transaction(address, 'recipient_address_here', 0.01, private_key)
print(f"Transaction: {transaction}")
签名是用私钥对交易进行加密的一种方式。只有持有私钥的人才能对此交易进行签名,确保交易的合法性。
def sign_transaction(transaction, private_key):
transaction_str = f"{transaction['from']}{transaction['to']}{transaction['amount']}"
return ecdsa.SigningKey.from_string(private_key, curve=ecdsa.SECP256k1).sign(transaction_str.encode())
signature = sign_transaction(transaction, private_key)
print(f"Transaction Signature: {signature.hex()}")
接下来,我们需要验证交易的签名。只有当一个交易被正确签名,持有该私钥的人才能发出这个交易。
def verify_transaction(transaction, signature, public_key):
transaction_str = f"{transaction['from']}{transaction['to']}{transaction['amount']}"
return ecdsa.VerifyingKey.from_string(public_key, curve=ecdsa.SECP256k1).verify(signature, transaction_str.encode())
is_valid = verify_transaction(transaction, signature, public_key)
print(f"Is the transaction valid? {is_valid}")
最后,我们把上面的代码整合在一起。这样你就能清晰地看到如何构建一个简单的区块链钱包。
if __name__ == "__main__":
private_key = generate_private_key()
public_key = private_to_public(private_key)
address = public_to_address(public_key)
print(f"Private Key: {private_key.hex()}")
print(f"Public Key: {public_key.hex()}")
print(f"Wallet Address: {address}")
transaction = create_transaction(address, 'recipient_address_here', 0.01, private_key)
print(f"Transaction: {transaction}")
signature = sign_transaction(transaction, private_key)
print(f"Transaction Signature: {signature.hex()}")
is_valid = verify_transaction(transaction, signature, public_key)
print(f"Is the transaction valid? {is_valid}")
哇,完成了!简易的区块链钱包就这样做出来了。虽然这里的实现很基础,但它涵盖了区块链钱包的关键元素。依然有很大的提升空间,比如安全性、网络交互、区块链的实际连接等。
记得多加练习,慢慢尝试完善它,很多好的 ideas 都来源于实践中。希望这能帮你入门,加油!
以上是完整的实现过程。如果你有任何疑问,随时问我哦!
leave a reply