一个有效的Ethereum地址需要满足哪些标准,它仅仅是十六进制中的随机数吗?
或者,根据某些密码算法,它需要以特定的方式导出吗?用什么算法和标准来生成密钥对?
发布于 2016-05-04 18:45:27
最近,这篇文章引起了我的注意,比下面我更容易访问的版本更加深入和技术性。它还向您介绍了如何自己生成一个。我强烈推荐它:https://kobl.one/blog/create-full-ethereum-keypair-and-address/
尽管很多人称这个地址为公钥,但实际上在Ethereum并不是这样。有一个单独的公钥充当中间人,你永远不会看到,除非你去查看一个售前钱包JSON文件。
私钥为64个十六进制字符。假设,每一个64六进制的字符串都是一个Ethereum私钥(请参阅顶部的链接,以了解为什么这不是完全准确的),它将访问一个帐户。如果您计划生成一个新帐户,您应该确保这些帐户都带有适当的RNG。一旦你有了那根绳子。
这太难了,超出了我的能力。椭圆曲线数字签名算法(ECDSA)是一种新型的数字签名算法。但最终您将得到一个公共密钥,即64个字节。
地址:以太地址代表一个帐户。对于EOA,地址派生为控制帐户的公钥的最后20个字节,例如`cd2a3d9f938e13cd947ec05abc 7Fe734df8dd826。这是一种十六进制格式(基本16符号),通常通过将0x附加到地址来显式表示。Web3.js和控制台函数接受带有或不带此前缀的地址,但为了透明起见,我们鼓励使用它们。由于地址的每个字节由2个十六进制字符表示,一个前缀地址的长度为42个字符。一些应用程序和API也被用来实现新的启用校验和的地址方案,在0.5.0版的迷雾钱包中引入了这种方式。- 宅基地医生
私钥:在范围[1, secp256k1n − 1]
中随机选择的正整数(表示为长度为32的字节数组)。- 黄纸
发布于 2016-05-03 01:33:18
以太地址是公钥的散列。因此,要生成私钥,您必须先生成一个私钥(参见:从2 5 6位私钥中计算地址的方法是什么?),私钥是随机的,但是公钥,因此它用作地址的散列不是随机的。
要检查地址,从而知道格式,请参考我怎样才能检查一个虚空地址是否有效?
发布于 2019-09-13 21:54:33
如果有人在寻找JS解决方案:
const Web3 = require('web3')
const web3 = new Web3()
const elliptic = require('elliptic')
const ec = new elliptic.ec('secp256k1')
function pubKeyToAddress(compressedPubkey) {
let keyPair = ec.keyFromPublic(compressedPubkey, 'hex')
// remove '04' then add prefix '0x'
let pubkey = '0x' + keyPair.getPublic(false, 'hex').substr(2)
let address = trimFirst12Bytes(web3.utils.keccak256(pubkey))
return web3.utils.toChecksumAddress(address)
}
unction trimFirst12Bytes(hexString) {
return '0x'.concat(hexString.substr(hexString.length - 40))
}
https://ethereum.stackexchange.com/questions/3542
复制相似问题