Python如何从私钥创建以太坊钱包地址

  • 日期:07-10
  • 点击:(1221)

日本红怡院一本道

从私钥创建比特币钱包地址有点复杂。在这里,我们将使这个过程更加简单化。我们需要应用哈希函数来获取公钥和另一个哈希函数来获取地址。开始吧。

公钥

我们需要做的第一件事是将ECDSA或椭圆曲线数字签名算法应用于我们的私钥。椭圆曲线是由等式y2=x3 + ax + b定义的曲线,并且选择a和b。存在一整套这样的曲线,这些曲线被识别并在使用中。比特币使用secp256k1曲线。

以太坊使用相同的椭圆曲线secp256k1,因此获取公钥的过程在两种加密货币中都是相同的。

通过将ECDSA应用于私钥60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2,我们得到一个64字节的整数,它是两个32字节的整数,表示连接在一起的椭圆曲线上的点的X和Y.

在我们的例子中,我们有1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7。

在Python中,它看起来像这样:

Private_key_bytes=codecs.decode(private_key,'hex')

#获取ECDSA公钥

Key=ecdsa.SigningKey.from_string(private_key_bytes,curve=ecdsa.SECP256k1).verifying_key

Key_bytes=key.to_string()

Key_hex=codecs.encode(key_bytes,'hex')

注意:从上面的代码中可以看出,我使用ecdsa模块中的方法并使用编解码器解码私钥。这与Python有关,而不是算法本身,但我将解释我们在这里做了什么以消除可能的混淆。

在Python中,至少有两个类可以保留私钥和公钥:“str”和“bytes”。第一个是字符串,第二个是字节数组。 Python中的加密方法使用“bytes”类,将其作为输入并作为结果返回。 Python学习交流组:1004391443

一个字符串,比如4f3c不等于字节数组4f3c。相反,它等于具有两个元素O& lt的字节数组。这就是codecs.decode方法的作用:它将字符串转换为字节数组。对于我们将在本文中进行的所有加密操作,这都是相同的。

钱包地址

一旦我们有了公钥,我们就可以计算出地址。现在,与比特币不同,以太坊在主要和所有测试网络上都具有相同的地址。用户在制作和签署事务时指定他们稍后要在过程中使用的网络。

要从公钥创建地址,我们需要做的就是将Keccak-256应用于密钥,然后获取结果的最后20个字节。而已。没有其他哈希函数,没有Base58或任何其他转换。您唯一需要的是在地址的开头添加“0x”。

这是Python代码:

Public_key_bytes=codecs.decode(public_key,'hex')

Keccak_hash=keccak.new(digest_bits=256)

Keccak_hash.update(public_key_bytes)

Keccak_digest=keccak_hash.hexdigest()

#取最后20个字节

Wallet_len=40

Wallet='0x'+ keccak_digest [-wallet_len:]

验证

现在,您可能还记得,比特币通过散列公钥并获得结果的前4个字节来创建校验和。对于所有比特币地址都是如此,因此如果不添加校验和字节,则无法获得有效地址。

在以太坊,这不是事情的方式。最初,没有校验和机制来验证密钥的完整性。然而,在2016年,Vitalik Buterin引入了校验和机制,后来被钱包和交易所采用。

将校验和添加到以太坊钱包地址将使其区分大小写。

首先,您需要获取地址的Keccak-256哈希值。请注意,此地址应传递给没有0x部分的哈希函数。

其次,迭代初始地址的字符。如果散列的第i个字节大于或等于8,则第i个地址的字符将转换为大写,否则保留为小写。

最后,在结果字符串的开头添加0x。如果忽略大小写,则校验和地址与初始地址相同。但大写字母让任何人都可以检查地址是否真的有效。您可以在此处链接的页面上找到校验和验证算法。

正如您将在提案中读到的,对于此校验和方案,“每个地址的平均地址将具有15个校验位。如果输入错误,则随机生成的地址将通过检查的净概率为0.0247%。”

这是将校验和添加到以太坊地址的代码:

校验和='0x'

#从地址

中删除“0x”

地址=地址[2:]

Address_byte_array=address.encode('utf-8')

Keccak_hash=keccak.new(digest_bits=256)

Keccak_hash.update(address_byte_array)

Keccak_digest=keccak_hash.hexdigest()

对于范围内的i(len(地址)):

Address_char=地址[i]

Keccak_char=keccak_digest [i]

如果int(keccak_char,16)>=8:

校验和+=address_char.upper()

否则为:

校验和+=str(address_char)

结论

如您所见,为以太坊创建地址比比特币简单得多。我们需要做的就是将ECDSA应用于公钥,然后应用Keccak-256,最后得到哈希的最后20个字节。

2d57f07f8e674917b71852e33e228eb6

如果您想使用代码,我会将其发布到GitHub存储库。

===============================================================================

分享一些与区块链相关的在线编程练习,如比特币,以太坊,EOS,Fabric等:

Java比特币开发教程,本课程面向初学者,内容涵盖比特币的核心概念,如区块链存储,分散共识机制,密钥和脚本,事务和UTXO等,还详细讲解了如何进行Java集成代码中的比特币支持,例如创建地址,管理钱包,构建裸交易等,是Java工程师难得的比特币开发学习课程。 Php比特币开发教程,本课程面向初学者,内容涵盖比特币的核心概念,如区块链存储,分散共识机制,密钥和脚本,事务和UTXO等,并详细说明如何在Php中完成在代码中集成比特币支持,例如创建地址,管理钱包,构建裸交易等,对于Php工程师来说是一种罕见的比特币开发学习课程。 c#比特币开发教程,本课程面向初学者,内容涵盖比特币的核心概念,如区块链存储,分散共识机制,密钥和脚本,事务和UTXO等,并详细说明如何在C#比特币支持功能在代码中的集成,如创建地址,管理钱包,构建裸交易等,是C#工程师难得的比特币开发学习课程。 Java以太坊开发教程,主要针对java和android程序员解决以太网web3j的区块链开发。 Python以太坊,主要供Python工程师使用web3.py进行区块链以太坊的详细开发。 Php Ethereum,主要介绍如何使用php进行智能合约开发交互,账户创建,交易,转移,令牌开发,过滤和交易。以太坊入门教程,主要介绍智能合约和dapp应用程序开发,适合入门。以太坊开发高级教程,主要介绍使用node.js,mongodb,blockchain,ipfs实现分散式电子商务的DApp实战,适合高级。ERC721以太坊已经证明了这场战斗。该课程侧重于数字艺术创作和分享DApp的实际发展,并深入解释以太坊非同质证书的概念,标准和发展计划。内容包括ERC-721标准的自行实现,解释了OpenZeppelin合同代码库的二次开发,实际项目采用了Truffle,IPFS,实现了通过和分散交换。 C#以太坊主要解释如何使用C#开发基于.Net的以太坊应用程序,包括帐户管理,状态和交易,智能合约开发和交互,过滤器和交易。 EOS入门教程,本课程将帮助您快速开始使用EOS区块链分散式应用程序开发,涵盖EOS工具链,帐户和钱包的核心知识,发行令牌,智能合约开发和部署,使用代码和智能合约交互。点,最后用各种知识点来完成粘性DApp的开发。本课程以EOS钱包开发的深入开发为主线,以移动EOS钱包的完整开发过程为主线,深入研究EOS区块链应用开发。课程内容涵盖EOS区块链帐户,计算资源,智能合约,操作和交易。核心概念还解释了如何使用eosjs和eosjs-ecc开发工具包访问EOS区块链以及如何在React前端应用程序中集成对EOS区块链的支持。课程内容简单易懂,非常适合前端工程师深入研究EOS区块链应用开发。 Hyperledger Fabric区块链开发详细介绍。本课程适合初学者。它包括Hyperledger Fabric的身份证书和MSP服务,权限策略,通道配置和启动以及链代码通信接口的核心概念。它还包括结构网络设计和nodejs链。代码和应用程序开发实践是Nodejs工程师了解Fabric区块链开发的最佳选择。Hyperledger Fabric java区块链开发详解,该课程适合初学者,内容包括Hyperledger Fabric的身份证书和MSP服务,权限策略,通道配置和启动,链码通信接口等核心概念,还包括Fabric网络设计,java链接代码和应用程序开发的实践是Java工程师学习Fabric区块链开发的最佳选择。 Tendermint区块链开发详细介绍,本课程适合希望使用trendmint进行区块链开发的工程师,课程内容包括tendermint应用程序开发模型中的核心概念,如ABCI接口,Merkel树,多版本状态库等。包括令牌分发在内的丰富实用代码是语言工程师快速开发区块链开发的最佳选择。