生成一个 V2EX 结尾的 solana 地址

48 天前
 BeCool

原理

不断生成随机密钥对,检查地址是否符合要求。 基本要一百万次以上才能匹配到一个。

注意

代码

下面是 claude code 完成的代码,Node.js 实现,使用官方库。

package.json

{
  "name": "solana-v2ex-generator",
  "version": "1.0.0",
  "description": "Generate Solana addresses ending with v2ex",
  "main": "generate-v2ex-address.js",
  "scripts": {
    "start": "node generate-v2ex-address.js"
  },
  "dependencies": {
    "@solana/web3.js": "^1.95.0",
    "bs58": "^5.0.0"
  }
}

generate-v2ex-address.js

const { Keypair } = require('@solana/web3.js');
const fs = require('fs');
const bs58 = require('bs58');

async function generateV2exAddress() {
    let attempts = 0;
    const startTime = Date.now();
    
    console.log('开始生成以 V2EX 结尾的 Solana 地址...\n');
    
    while (true) {
        attempts++;
        
        const keypair = Keypair.generate();
        const publicKey = keypair.publicKey.toBase58();
        
        if (attempts % 10000 === 0) {
            console.log(`已尝试 ${attempts} 次...`);
        }
        
        if (publicKey.endsWith('v2ex')) {
            const elapsedTime = (Date.now() - startTime) / 1000;
            
            console.log('\n🎉 成功找到匹配的地址!');
            console.log(`尝试次数: ${attempts}`);
            console.log(`耗时: ${elapsedTime.toFixed(2)} 秒\n`);
            
            console.log('='.repeat(60));
            console.log('地址:', publicKey);
            console.log('私钥 (Base58):', bs58.encode(keypair.secretKey));
            console.log('='.repeat(60));
            
            const result = {
                address: publicKey,
                privateKey: bs58.encode(keypair.secretKey),
                privateKeyArray: Array.from(keypair.secretKey),
                attempts: attempts,
                timeInSeconds: elapsedTime
            };
            
            const filename = `v2ex-address-${Date.now()}.json`;
            fs.writeFileSync(filename, JSON.stringify(result, null, 2));
            console.log(`\n 结果已保存到: ${filename}`);
            
            break;
        }
    }
}

generateV2exAddress().catch(console.error);
3770 次点击
所在节点    分享创造
24 条回复
hellojay
48 天前
这个有意思,感谢感谢
hellojay
48 天前
已经使用 sol 送出感谢~
hzlzh
48 天前
哈哈 有趣
tom8
48 天前
之前搞过 eth 888888 结尾的,go 实现下来生成快很多
itechify
48 天前
有意思
cat
48 天前
av2ex
TracyMagic
48 天前
不需要这么麻烦。solana-keygen grind --ends-with v2ex:1
samuel
48 天前
真有趣!送出一点 V2EX 聊表心意
prefect
48 天前
有点不是很理解,这个不是本地生成的公私钥对吗?咋关联到钱包的?地址不是创建钱包的时候生成的吗~
kaichen
48 天前
从资产安全的角度不推荐。

如果只是生成这种 Vanity 地址玩玩没问题,但是真的别拿来存币。

区块链的公私钥机制就是为了提升抗破解能力,自己用的钱包还去撞特定前后缀,是在帮攻击者压缩搜索空间。

另外一个供给面是,让攻击者更好地容易准备一份与你地址前后缀相似的地址库,可以用这个地址库给你或者你收发对手方转垃圾代币或者小量代币,赌你看错地址转错,这是非常简单但极其有效的攻击手段。

历史上出过不少这种 Vanity Address 丢大钱的例子,网络上很容易搜索到,比如 https://www.certik.com/resources/blog/vanity-address-and-address-poisoning
JackMaMa
48 天前
@kaichen +1 ,这种靓号有碰撞风险
alinwu05
48 天前
这个有意思啊,人才!
crocoBaby
48 天前
好厉害
Tink
48 天前
还有想法!
vanillahz
48 天前
@kaichen 私钥会不会破解,取决于你用的 RNG 强度,本来空间就有 256 位,去掉 32 位也绰绰有余
第二种攻击取决于你有没有用通讯录/扫码转账的习惯。复制地址无论什么时候都是相当危险的
bearbest
48 天前
@cat 你是懂华点的 🤣🤣🤣
BeCool
48 天前
@kaichen

1. 实际这个过程是“挑选”。假设你说的“压缩搜索空间”成立,那 crypto 可能要崩塌。此刻我们认为 V2EX 是 vanity 后缀,但世界上每个人可能他的 vanity 字符是不一样的。每个都是随机生成的,那么每个都可以被叫做“特定前后缀”。攻击者如果看到一个钱包有大量资金,尾数为 2fdsf 这样的,按照你的说法,攻击者可以根据这个后缀来压缩探索空间?

在第三方 app 钱包中如果刚好生成了 V2EX 或者 8888 的后缀,是否说明这个地址是不安全的?

2. 第二种攻击实际上和靓号无关,是批量无选择的攻击。不安全性依然是人导致的。

3. Solana 官方文档有一个叫做 “How to Generate a Vanity Address” 的文档,https://solana.com/developers/cookbook/wallets/generate-vanity-address 使用 solana-keygen grind 工具来生成 vanity 地址,支持前后缀,是否官方无视风险让我们使用不安全的方式?
kaichen
48 天前
@BeCool

如果是一个人或者少数人这么玩问题不大,但当大量的用户这么用,那么以 V2EX 为结尾的钱包变多,撞库的搜索空间就被压缩了。

我只是想让人了解存在这样的风险 🙂

如果只是为了好记,那么去买个 sns.id 是更好的选择。
ooTwToo
48 天前
可以给钱包创建一个域名,方便记住:
https://www.sns.id/
BeCool
48 天前
@ooTwToo 这个我有: https://ex.noerr.eu.org/planet/becool.sol
它和生成 V2EX 后缀钱包其实是两件事,因为不是为了易记。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1150346

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX