当前位置: 首页 > 后端技术 > PHP

如何使用PHP生成以太坊钱包和密钥对?

时间:2023-03-29 17:13:38 PHP

本文将提供如何使用PHP7.0++生成ECDSA私钥,然后导出到以太坊钱包地址的指南。您可以在以下位置找到有效的实现:composer.json{"require":{"sop/asn1":"^3.3","sop/crypto-encoding":"^0.2.0","sop/crypto-types":"^0.2.1","kornrunner/keccak":"^1.0","symfony/dotenv":"^4.0","sc0vu/web3.php":"dev-master"}}GenerateEthereumWallet.phpOPENSSL_KEYTYPE_EC,'curve_name'=>'secp256k1'];$res=openssl_pkey_new($config);if(!$res){echo'错误:生成私钥失败。->'.openssl_error_string();exit;}//生成私钥openssl_pkey_export($res,$priv_key);//获取公钥$key_detail=openssl_pkey_get_details($res);$pub_key=$key_detail["key"];$priv_pem=PEM::fromString($priv_key);//转换为椭圆曲线私钥格式$ec_priv_key=ECPrivateKey::fromPEM($priv_pem);//然后转换为ASN1结构$ec_priv_seq=$ec_priv_key->toASN1();//十六进制的私钥和公钥$priv_key_hex=bin2hex($ec_priv_seq->at(1)->asOctetString()->string());$priv_key_len=strlen($priv_key_hex)/2;$pub_key_hex=bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());$pub_key_len=strlen($pub_key_hex)/2;//从公钥推导出以太坊地址//每个EC公钥总是以0x04开头,//我们需要去掉开头的0x04才能正确散列$pub_key_hex_2=substr($pub_key_hex,2);$pub_key_len_2=strlen($pub_key_hex_2)/2;//哈希$hash=Keccak::hash(hex2bin($pub_key_hex_2),256);//以太坊地址有20个字节长(40个十六进制字符长)//我们只需要最后20个字节作为以太坊地址$wallet_address='0x'。substr($hash,-40);$wallet_private_key='0x'。$priv_key_hex;echo"\r\nETH钱包地址:".$wallet_address;echo"\r\n私钥:".$wallet_private_key;代码条件此代码需要PHP7.0++、OpenSSL扩展和PHPComposer。需要PHPComposer来安装第三方包。$composerinstall生成私钥以太坊标准使用secp256k1曲线生成私钥。在我的教程中,我使用OpenSSL函数生成PEM格式的椭圆曲线私钥,如下所示:$config=['private_key_type'=>OPENSSL_KEYTYPE_EC,'curve_name'=>'secp256k1'];$res=openssl_pkey_new($config);if(!$res){echo'错误:无法生成私钥。->'。openssl_error_string();exit;}//生成私钥openssl_pkey_export($res,$priv_key);//PEMFormat$priv_pem=PEM::fromString($priv_key);之后我需要将私钥转换为ASN1序列,下面是ANS1序列的结构。ECPrivateKey::=SEQUENCE{versionINTEGER{ecPrivkeyVer1(1)}(ecPrivkeyVer1),privateKeyOCTETSTRING,parameters[0]ECParameters{{NamedCurve}}OPTIONAL,publicKey[1]BITSTRINGOPTIONAL}以下代码是我如何从ANS1以序列结构查询十六进制字符串中的公钥和私钥。//然后转换成ASN1结构$ec_priv_seq=$ec_priv_key->toASN1();//PrivateKey&PublicKeyinHEX$priv_key_hex=bin2hex($ec_priv_seq->at(1)->asOctetString()->string());$priv_key_len=strlen($priv_key_hex)/2;$pub_key_hex=bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());$pub_key_len=strlen($pub_key_hex)/2;派生以太坊钱包地址以太坊钱包地址来自公钥。每个EC公钥始终以0x04开头。为了获得以太坊钱包地址的正确哈希,我们需要删除前导0x04。$pub_key_hex_2=substr($pub_key_hex,2);$pub_key_len_2=strlen($pub_key_hex_2)/2;我们继续使用EC公钥的Keccak256哈希。以太坊钱包地址长度为20个字节和40个字符,因此我们只需要哈希数据的最后20个字节。$hash=Keccak::hash(hex2bin($pub_key_hex_2),256);$wallet_address='0x'。substr($hash,-40);$wallet_private_key='0x'。$priv_key_hex;现在你有$wallter_address**存储你新生成的以太坊钱包地址,**$wallet_private_key是你的以太坊钱包地址的私钥。如何运行代码$phpGenerateEthereumWallet.php它会输出以太坊钱包地址和私钥如下:ETHWalletAddress:0xb2...PrivateKey:0x73...======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:php以太坊,主要介绍使用php进行智能合约开发交互、账户创建、交易、转账、令牌开发以及过滤器和交易。Php比特币开发教程,本课程面向初学者,内容涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,同时还详细讲解了如何使用PhpIntegrating比特币在代码中的支持功能,如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习教程。PythonEthereum,主要供python工程师使用web3.py详细开发区块链以太坊。Java以太坊开发教程,主要为java和android程序员讲解区块链以太坊开发的web3j详解。以太坊入门教程,主要介绍智能合约和dapp应用开发,适合入门。以太坊开发进阶教程,主要介绍使用node.js、mongodb、blockchain、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器与交易等EOS教程,本课程帮助您快速上手开发EOS区块链去中心化应用,涵盖EOS工具链、账户钱包、发行代币、智能合约开发部署、使用代码与智能合约交互等核心知识点,最终利用所有知识点完成一个笔记DApp的开发.Java比特币开发教程,本课程面向初学者,内容涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,还详细讲解了如何使用JavaIntegrating比特币在代码中的支持功能,如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习教程。汇智网原创翻译,转载请注明出处。这里是原文