精华内容
下载资源
问答
  • 一个小型的go程序,用于检查随机私钥的余额并记录是否找到了使用的以太坊地址。 建立 运行获取地址脚本以下载所有以太坊地址(这将需要一段时间): ./get-addresses.sh 用法 安装了golang; go run main.go ...
  • 以太坊私钥公钥地址生成算法 原理 参考比特币地址生成算法原理. 实现 #!coding:utf8 #author:yqq #date:2019/3/6 0006 17:00 #description: 以太坊私钥,公钥,地址生成 import ecdsa import os import sha3 #...

    以太坊私钥公钥地址生成算法

    原理

    参考比特币地址生成算法原理.

    实现

    #!coding:utf8
    
    #author:yqq
    #date:2019/3/6 0006 17:00
    #description:  以太坊私钥,公钥,地址生成
    
    
    
    import ecdsa
    import os
    import sha3
    
    
    
    #2019-11-12 根据官方定义修改  有限域
    # http://www.secg.org/sec2-v2.pdf#page=9&zoom=100,0,249
    # 关于 有限域的定义 请参考
    # 0xEFFFFFC2F = 2**32 - 2**9 - 2**8 - 2**7 - 2**6 - 2**4 - 1
    g_nFactor = 0xEFFFFFC2F + 0x23492397 #增值自定义
    g_nMaxPrivKey = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140 - g_nFactor #私钥最大值 (差值是自定义的)
    g_nMinPrivKey = 0x0000000000000000000000000000000000000000000000000000000000000001 + g_nFactor #私钥最小值 (增值是自定义的)
    
    
    def GenPrivKey():
        '''
        生成私钥, 使用 os.urandom (底层使用了操作系统的随机函数接口, 取决于CPU的性能,各种的硬件的数据指标)
        :return:私钥(16进制编码)
        '''
    
        #2019-05-15 添加私钥范围限制
        while True:
            privKey = os.urandom(32).encode('hex')    #生成 256位 私钥
            if  g_nMinPrivKey < int(privKey, 16) <   g_nMaxPrivKey:
                return privKey
    
    def GenEthAddr():
    
        privKey = GenPrivKey() #os.urandom(32).encode('hex')
    
        # sk = ecdsa.SigningKey.from_string(privKey.decode('hex'), curve=ecdsa.SECP256k1)
        sk = ecdsa.SigningKey.from_string(privKey.decode('hex'), curve=ecdsa.SECP256k1) #通过私钥生成密钥对
        pubKey = (sk.verifying_key.to_string()).encode('hex')   #获取公钥
    
        keccak = sha3.keccak_256()   # keccak_256哈希运算
        keccak.update(pubKey.decode('hex'))
        addr = "0x" + keccak.hexdigest()[24:]  #截取后面40字符
    
        # print(privKey)
        # print(pubKey)
        # print(addr)
    
        return (str(privKey), str(pubKey), str(addr))
    
    
    def GenMultiAddr(nAddrCount = 1, isTestnet = True):
        listRet = []
        for i in range(nAddrCount):
            listRet.append(GenEthAddr())
        return listRet
    
    # def main():
    #     print(GenMultiAddr(1))
    #
    # if __name__ == '__main__':
    #
    #     main()
    
    
    展开全文
  • 以太坊 私钥保护——keystore

    千次阅读 2019-10-28 13:20:17
    以太坊的每个外部账户私钥 /地址对,都存储在一个钥匙文件里——keystore文件。这个文件是 JSON 格式,但是私钥等隐私重要的信息都是被加密存储的,你可以通过密码去解锁你的私钥用于签署交易。所以歌这个文件就意味...

           以太坊的每个外部账户私钥 /地址对,都存储在一个钥匙文件里——keystore文件。这个文件是 JSON 格式,但是私钥等隐私重要的信息都是被加密存储的,你可以通过密码去解锁你的私钥用于签署交易。所以歌这个文件就意味着你的私钥,一定要保管好。

    keystore的文件格式

    {
        'address': '123456789', 
        'crypto': 
            {
                'cipher': 'aes-128-ctr', 
                'cipherparams': 
                    {
                        'iv': 'a1afa641398e8e09fd2db05ca879cff4'
                    },                 
                'ciphertext':
    'ab7fac3ee124801243d105f97057fee36f55539dd44fc9dbf43709433b1f0308ca16a93002', 
                 'kdf': 'pbkdf2', 
                 'kdfparams': 
                     {
                         'c': 1000000, 
                         'dklen': 32, 
                         'prf': 'hmac-sha256', 
                         'salt': 'c79b4272523dc76abfea583f1a210f5f'
                     }, 
                 'mac': '19fdcefefa6314170ade98db3fb8ad44a1de5b81279719770619ecd556f65925'
           }, 
        'id': '4b436468-601d-4a2a-b83e-422b0a06cd01', 
        'version': 3
    }
    
    • version- 版本号
    • address - 是加密后的公钥,明文显示
    • id- 随机

    主要内容在crypto中:

    • cipher:对称 AES 算法的名称,用于加密用户私钥;
    • cipherparams:上述 cipher 算法需要的参数,iv初始化向量;
    • ciphertext:以太坊私钥使用上述 cipher 算法进行加密后密文;
    • kdf:密钥生成函数,用来增强用户的密码强度,同时生成aes的密钥加密 私钥;
    • kdfparams:上述 kdf 算法需要的参数,还有scrypt;
    • Mac:用于验证解密后的私钥是否正确。

    生成keystore过程

      

    1,使用用户输入的密码,kdf参数,通过kdf函数生成aes的密钥,aes使用的iv则是通过随机函数随机生成的;

    2、将用户的私钥,通过aes加密算法,以及上一步骤生成的密钥,生产eth的私钥的密文;

    3、将kdf的生成aes私钥的种子的后半段和用户私钥的密文,一起做hash,生成mac;

    4、使用用户私钥,生成用户的以太坊地址;

    最后一个步骤其实可以省略,后边我打算把把keystore这种方案移植到fabric中,用来保护fabircde私钥;通过这一系列步骤,我们可以把必要的输出,获取到组成一个json文件,存储到本地,用的使用只需要输入密码,就可以获取到用户的私钥;

    获取私钥过程

    1,用户输入密码,pdf函数通过密码和keystore中获取到参数,生产aes的密钥;

    2、将aes密钥的种子的后16bit和ciphertext,做hash;

    3、将第二步的结果与mac值比较

    4、如果第三步相等,则使用aes密钥解密私钥的密文,生成私钥,否则失败;

    从整个流程可以看出,用户只需要记住密码就可以了,相对于助记词来说更简单了,但是助记词的功能更强大,也更广泛;

     

    展开全文
  • 进入keystore管理以太坊私钥的障碍很大,主要是因为以太坊客户端在直接的命令行或图形界面下隐藏了大部分的密码复杂性。 例如,用geth: 我只需要输入3个单词就能创建一个新账户。然后输入两遍密码,就这么简单...

    进入keystore管理以太坊私钥的障碍很大,主要是因为以太坊客户端在直接的命令行或图形界面下隐藏了大部分的密码复杂性。

    例如,用geth:

     

    我只需要输入3个单词就能创建一个新账户。然后输入两遍密码,就这么简单!我的以太坊keystore文件就创建了。

    你需要把那些非常珍贵的keystore文件备份、存储在一个或多个隐秘的位置,这样就只有你能获取这些文件并取到资金。

    从经验来看,当我没有完全理解一个新概念的微妙之处,并且过分依赖抽象层和现有工具来让我的生活更轻松时,我很有可能忘记一些事情,采取不必要的捷径并且搞砸它。搞砸的时候,可能就是会以我辛苦挣来的以太币被永久锁定而告终(幸好它还没有发生!)。

    幸运的是,作为一个以太坊用户,你能搞砸的方式并不多:

    1. 你丢失了你的keystore文件

    2. 你忘记了和文件关联的密码

    3. 或者以上两者你都搞砸了。

    在本文中,我们将为你介绍以太坊私钥是如何从 keystore 文件中算出来的。我们将讨论加密函数(对称加密,密钥生成函数,SHA3 哈希算法),但我们会尽可能的保证简明直接地来解释上述问题。

    什么是keystore文件?

    以太坊的 keystore 文件(Linux 系统存储在 ~/.ethereum/keystore 或者 Windows 系统存储在 C:\Users\Appdata/Roaming/Ethereum/keystore)是你独有的、用于签署交易的以太坊私钥的加密文件。如果你丢失了这个文件,你就丢失了私钥,意味着你失去了签署交易的能力,意味着你的资金被永久的锁定在了你的账户里。

    当然,你可以直接把你的以太坊私钥存储在一个加密文件里,但是这样你的私钥容易受到攻击,攻击者简单的读取你的文件、用你的私钥签署交易,把钱转到他们的账户中。你的币会在你意识到发生什么了之前的短时间内丢失。

    这就是以太坊 keystore 文件被创建的原因:它允许你以加密的方式存储密钥。这是安全性(一个攻击者需要 keystore 文件和你的密码才能盗取你的资金)和可用性(你只需要keystore文件和密码就能用你的钱了)两者之间完美的权衡。

    为了让你发送一些以太币,大多数的以太坊客户端会让你输入密码(与创建账户时密码相同)以解密你的以太坊私钥。一旦解密,客户端程序就得到私钥签署交易,允许你移动资金。

    Keystore文件是什么样子的?

    如果你打开一个你的账户文件,它看起来像这样(取自这里):

    ount’s file, it would look like this (taken from here):

     

     

    一个有许多神奇的参数的粗笨的 JSON 文件,似乎与复杂的加密操作相关。这绝不吸引人。

    让我们深入理解一下

    如果你看这个 keystore 文件的结构,你会看到大部分内容都是在“crypto”中的:

     

     

    这包括:

    · cipher:对称 AES 算法的名称;

    · cipherparams:上述 cipher 算法需要的参数;

    · ciphertext:你的以太坊私钥使用上述 cipher 算法进行加密;

    · kdf:密钥生成函数,用于让你用密码加密 keystore 文件;

    · kdfparams:上述 kdf 算法需要的参数;

    · Mac:用于验证密码的代码。

    让我们看看他们是如何协同工作的,如何在你的密码下保护 keystore 文件。

    1. 加密你的私钥

    就像之前提到的,一个以太坊账户就是用于加密签署交易的一个私钥—公钥对。为了确保你的私钥没有在文件中明文存储(即任何人只要能得到这个文件就能读),使用强对称算法(cipher)对其加密至关重要。

    这些对称算法使用密钥来加密数据。加密后的数据可以使用相同的方法和同样的密钥来解密,因此算法命名为对称算法。在本文中,我们称这个对称密钥为解密密钥,因为它将用于对我们的以太坊私钥进行解密。

    以下是 cipher,cipherparams和 ciphertext 对应的概念:

    · Cipher是用于加密以太坊私钥的对称加密算法。此处cipher用的是 aes-128-ctr 加密模式。

    · Cipherparams是 aes-128-ctr 加密算法需要的参数。在这里,用到的唯一的参数 iv,是aes-128-ctr加密算法需要的初始化向量。

    · Ciphertext密文是 aes-128-ctr 函数的加密输入。

    所以,在这里,你已经有了进行解密以太坊私钥计算所需要的一切...等等。你需要首先取回你的解密密钥。

     

     

    -ciphertex密文的对称解密-

    2. 用你的密码来保护它

    要确保解锁你的账户很容易,你不需要记住你的每一个又长又非用户友好型的用于解密 ciphertext密文解密密钥。相反,以太坊开发者选择了基于密码的保护,也就是说你只需要输入密码就能拿回解密密钥。

    为了能做到这一点,以太坊用了一个密钥生成函数,输入密码和一系列参数就能计算解密密钥。

    这就是 kdf和 kdfparams 的用途:

    · kdf是一个密钥生成函数,根据你的密码计算(或者取回)解密密钥。在这里,kdf 用的是scrypt算法。

    · kdfparams是scrypt函数需要的参数。在这里,简单来说,dklen、n、r、p 和 salt 是 kdf函数的参数。更多关于 scrypt 函数的信息可以在这里找到。

    在这里,用 kdfparams参数对 scrypt 函数进行调整,反馈到我们的密码中,你就会得到解密密钥也就是密钥生成函数的输出。

     

     

    -用密码生成密钥-

    3. 确保你的密码是对的

    我们描述了用密码和 keystore 文件生成以太坊私钥所需要的所有东西。然而,如果解锁账户的密码错误会发生什么?

    根据迄今为止我们所看到的,所有操作(密码派生和解密)都会成功,但是最终计算的以太坊私钥不是正确的,这首先违背了密钥文件的使用初衷!

    我们要保证输入解锁账户的密码是正确的,和最初创建 keystore 文件时一样(回想一下 geth 下创建新账户时两次输入的密码)。

    这就是 keystore 文件中 mac值起作用的地方。在密钥生成函数执行之后,它的输出(解密密钥)和 ciphertext 密文就被处理【注1】,并且和 mac(就像一种认可的印章)作比较。如果结果和 mac 相同,那么密码就是正确的,并且解密就可以开始了。

    【注1】这里有点简略了。在和 mac进行比较之前,解密密钥(左起第二字节开始的16字节)要和 ciphertext 密文连接在一起,并进行哈希散列(用SHA3-256的方法)。 更多信息请访问这里。

     

     

    把所有的都放到一起考虑

    唷! 如果你已经做到了这一点,那么恭喜你!

    让我们回顾一下我们描述的3个函数。

    首先,你输入了密码,这个密码作为 kdf密钥生成函数的输入,来计算解密密钥。然后,刚刚计算出的解密密钥和 ciphertext 密文连接并进行处理,和 mac 比较来确保密码是正确的。最后,通过 cipher 对称函数用解密密钥对 ciphertext 密文解密。

    瞧!解密的结果是你的以太坊私钥。 你可以在这里看看整个过程:

     

     

    就像你从图中可以看到的,整个过程可以看做一个黑盒(不过,图中是个灰盒),你的密码是惟一的输入,你的以太坊私钥是惟一的输出。所需的其他信息都可以在你的以太坊账户创建时生成的keystore文件中获得。

    由于这个原因,请确保你的密码足够强(并且无论如何你要记住它!)才能保证即使攻击者偷到了你的keystore文件也不能轻易得到你的私钥。

    展开全文
  • 最近突然有个想法,就是能不能用计算机随机生成的以太坊私钥来进行碰撞,要是运气好的话就可以得到拥有余额的以太坊地址的私钥.虽然几率很小.不过还是可以试试 大致思路是这样 1.先随机生成私钥,然后通过私钥生成...

    最近突然有个想法,就是能不能用计算机随机生成的以太坊私钥来进行碰撞,要是运气好的话就可以得到拥有余额的以太坊地址的私钥.虽然几率很小.不过还是可以试试

    大致思路是这样

    1.先随机生成私钥,然后通过私钥生成公钥,在生成地址.

    2.把生成的地址通过api请求https://infura.io服务商,获取对应余额,如果大于0则在本地保存当前地址及对应的私钥及余额.写入本地文件

    废话不多,直接上代码,

    package main
    
    import (
    	"fmt"
    	"os"
    	"math/big"
    	"log"
    	"github.com/ethereum/go-ethereum/crypto"
    	"github.com/ethereum/go-ethereum/common/hexutil"
    	"crypto/ecdsa"
    	"net/smtp"
    	"github.com/scorredoira/email"
    	"net/mail"
    	"github.com/ethereum/go-ethereum/rpc"
    	"strconv"
    )
    
    //这里我们需要定义两个回应的格式
    type Info struct {
    	From string	//info.From:发件地址或账号
    	To string	//to:  收件地址
    	Title string	//标题
    	Body string	//body:邮件内容
    	Host string	//info.Host:邮件服务器地址
    	Password string	//info.Password:密码
    }
    
    
    var reply interface{}
    
    func main() {
    	//GoMail("测试测试")
    	f, err := os.OpenFile("./key.txt", os.O_WRONLY|os.O_CREATE, 0644)
    	if err != nil {
    		// 打开文件失败处理
    		fmt.Println(err)
    		return
    	}
    	for i:=0;i<10;i++  {
    		go GetBlance(f)
    	}
    	select {
    
    	}
    
    	defer f.Close()
    }
    
    func GetBlance(_file *os.File) {
    	client, err := rpc.Dial("https://mainnet.infura.io/v3/XXXXXX")
    	if err != nil {
    		fmt.Println("错误:", err)
    	}
    	for ; ; {
    		priv, addr := CreateKey()
    		err2 := client.Call(&reply, "eth_getBalance", addr, "latest") //第一个是用来存放回复数据的格式,第二个是请求方法
    		if err2 != nil {
    			fmt.Println("错误:", err2)
    		}
    		fmt.Println(priv, addr)
    		//这里得到的还是16进制的需要做个进制转换成10进制
    		if reply != "0x0" {
    			n := new(big.Int)
    			n, _ = n.SetString(reply.(string)[2:], 16)
    			//fmt.Println(n)
    			// 查找文件末尾的偏移量
    			n1, _ := _file.Seek(0, 2)
    			value,_:=strconv.ParseFloat(n.String(),64)
    			content := "私钥为:"+priv + "\t地址为:" + addr + "\t余额为:" + strconv.FormatFloat(value/1000000000000000000,'f',5,64) + "ETH \n"
    			GoMail(content)
    			Infos.Body=content
    			// 从末尾的偏移量开始写入内容
    			_, err = _file.WriteAt([]byte(content), n1)
    		}
    	}
    	defer client.Close()
    }
    
    func CreateKey() (privs, addrs string) {
    	//创建私钥
    	privateKey, err := crypto.GenerateKey()
    	if err != nil {
    		log.Fatal(err)
    	}
    	/*	//可通过此代码导入私钥
    	privateKey,err=crypto.HexToECDSA("93d5d04256882aaad507ff09f510969f347758109793448aa79e1b4dbe5f6efa")
    	if err != nil {
    		log.Fatal(err)
    	}
    	*/
    	privateKeyBytes := crypto.FromECDSA(privateKey)
    	priv := hexutil.Encode(privateKeyBytes)[2:]
    	publicKey := privateKey.Public()
    	publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
    	if !ok {
    		log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
    	}
    	address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
    	//fmt.Println(address)
    	return priv, address
    }
    
    
    var Infos=Info{
    	"XXXXXX@163.com",//发件邮箱
    	"XXXXX@qq.com",//收件邮箱
    	"碰撞成功",
    	"",
    	"smtp.163.com:25",
    	"XXXXXX",//发件邮箱的授权码可以再邮箱后台获取
    }
    
    func GoMail(body string)  {
    	m := email.NewMessage(Infos.Title, body)
    	m.From = mail.Address{"来自我的电脑",Infos.From}
    	m.To = []string{Infos.To}
    	email.Send(Infos.Host, smtp.PlainAuth("", Infos.From, Infos.Password, "smtp.163.com"), m)
    }
    

    我这里额外做了个发送邮件的请求,如果碰撞到了有余额的地址,在保存到本地的同时发送一份邮件到我的邮箱上.好让我及时知道.

    另外要运行这个代码的话还需要安装两个额外的库

    发送邮件的库  go get github.com/scorredoira/email

    以太坊的库   go get  github.com/ethereum/go-ethereum

     

    展开全文
  • 快速学习-以太坊私钥、公钥和地址

    千次阅读 2020-04-07 20:00:50
    以太坊私钥事实上只是一个256位的随机数,用于发送以太的交易中创建签名来证明自己对资金的所有权。 公钥(Public Key) 公钥是由私钥通过椭圆曲线加密secp256k1算法单向生成的512位 (64字节)数。 地址(Address)...
  • 生成大量以太坊私钥钱包的脚本

    千次阅读 2018-08-03 13:42:15
    区块链的第一篇文章,今天就分享一个可以创建N个以太坊私钥的脚本吧。 #!/bin/bash # help help() { echo &amp;amp;amp;amp;amp;amp;quot;Usage: $0 [options]&amp;amp;amp;amp;amp;amp;quot; echo &...
  • 科普|以太坊私钥存储文件

    千次阅读 2018-08-07 00:29:59
    以太坊私钥存储 以太坊的私钥文件存储于数据目录(datadir指向或默认目录)下,对应的目录为keystore。所有的私钥文件都经过加密之后存储于此目录下。 以太坊的客户端或图形界面帮助我们因此了底层复杂的密码实现...
  • package main import ( "crypto/ed25519" "encoding/hex" "encoding/json" "fmt" "github.com/insight-chain/inb-go/accounts/keystore" "log" ) ... GetKeyStore("/home/wek/Desktop/inb2",...
  • 简单钥匙圈 一个包装在周围的简单JS类,旨在公开在KeyringController使用的许多不同签名策略所KeyringController ; 例如在使用的 密钥环类协议 此类的目的之一是使开发人员可以轻松地向MetaMask添加新的签名策略。...
  • 进入keystore管理以太坊私钥的障碍很大,主要是因为以太坊客户端在直接的命令行或图形界面下隐藏了大部分的密码复杂性。 例如,用geth: $ geth account new Your new account is locked with a password. Please ...
  • 由于身边没人深入研究区块链技术,因此凭借本人仅一个月的学习总结和数据验证,我开发了一个简单的可用于以太坊账户生成/验证和交易报文生成/验证的小工具。 由于刚学习Python编程开发刚刚2星期,因此工具开发的相对...
  • 以太坊钱包私钥In the first article of this series, we generated a bitcoin private key: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2. 在本系列的第一篇文章中,我们生成了一个比特币...
  • 突然异想天开,想看看以太坊64位私钥(0x0000...-0xffff....)遍历碰撞是否可行。从理论上讲,就是最右侧的16位16进制数字,最大:0xffffffffffffffff,也就是16的16次方,即:18446744073709551616,用科学计数法...
  • 游览器生成,存在兼容性问题 测试使用chrome通过 ,解决了以太坊离线相关 生成二进制 使用sendRawTranscation 进行传送data
  • 私钥、公钥、地址以太坊私钥、公钥、地址之间的关系是,随机生成私钥、根据私钥计算出公钥、根据公钥计算出地址。私钥是256bit,相当于32字节;用16进制表示的话,就是64个字符。私钥的生成,本质上和选取一个1到2...
  • 编者注:我们翻译和出版与密码学货币的私钥、地址和...2. 公钥和用来接收转账的地址都是由私钥使用单向的数学运算推导出来的,如果不信任现有的工具,你完全可以自己使用这些数学运算来生成地址;同时,公开地址不...
  • 偶然间突然想碰碰运气,生成eth私钥,然后拿它的地址去获取主网上的余额,如果有就保存私钥,虽然这种概率非常小,但也并不是不可能,嘻嘻 相信很多人都有过这个想法,废话不多说,直接上代码: package main ...
  • 除了司空见惯的EOS智能合约漏洞问题、交易平台遭黑客攻击,最近WIRED还报道了一件奇闻:有人靠猜测以太坊私钥,盗走了5000万美元的ETH。 编译 | Guoxi 出品|区块链大本营(blockchain_camp) 在以太坊上,猜测私钥...
  • 前段时间看了一篇文章`利用随机数冲突的ECDSA签名恢复以太坊私钥` 讲的是同一交易发送者和接收者的两笔交易的随机数K相同的时候,可以推断出交易发送者的私钥。 我想着能不能通过遍历整个以太坊上面所有交易的签名...
  • 私钥账户是以太坊基础. 生成私钥 //生成私钥     key, err := crypto.GenerateKey()     if err != nil {         t.Fatalf("failed Genera...
  • //执行函数 在当前目录下执行 node js文件名称 会生成一个英文助记词和10个地址及公私钥 根据钱包地址及密码获取私钥 新建目录 使用命令窗口对当前目录执行 npm init 初始化项目 在当前目录新建js文件 将以下代码...
  • 使用golang根据keystore文件与密码解出私钥 package main import ( "encoding/hex" "fmt" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/crypto" "io/ioutil" "log...
  • 以太坊上,私钥用于访问帐户、签署消息等。一旦你失去对私钥的访问权,你将失去对该帐户存储的所有资金的访问权。这与丢失信用卡密码有什么不同?你不能要求银行给你一个新的密码,因为以太坊上不存在银行。你的...
  • 在区块链的钱包中,私钥可以产生出公钥,而反过来要想从公钥推算出私钥则是不可能的。用公钥加密的信息可以用私钥来解密,而用私钥签名的信息则由公钥来验证,验证通过后才能证明该信息确实为私钥持有人所发布。以 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,253
精华内容 2,901
关键字:

以太坊私钥