前段时间参加了一个游戏活动,给出12个助记词但是打乱顺序,钱包里有1个Eth,FCFS。
在没有任何提示的情况下会有12!(479001600)种可能。
这不就是全排列吗!
创建一个目录然后初始化项目
npm init
安装yarn
npm install -g yarn
安装依赖模块
yarn add bip39 ethereum-hdwallet
创建index.js文件
导入模块
var fs = require("fs")
const bip39 = require('bip39')
const HDWallet = require('ethereum-hdwallet');
配置参数
//计数器
var count = 0;
//已知的12个助记词
var arrtemp = ['cluster', 'violin', 'cart', 'steel', 'crouch', 'olive', 'water', 'pass', 'lab', 'father', 'until', 'exercise'];
//需要对比的钱包地址
var create_address = '0x1c5ea7f3a722ea2606cfbd4d6b3aaec488906553'.toLowerCase();
实现部分
//全排列 非递归 求模算法
async function perm(arr) {
var result = new Array(arr.length);
var fac = 1;
for (var i = 2; i <= arr.length; i++)
fac *= i;
for (index = 0; index < fac; index++) {
var t = index;
for (i = 1; i <= arr.length; i++) {
var w = t % i;
for (j = i - 1; j > w; j--)
result[j] = result[j - 1];
result[w] = arr[i - 1];
t = Math.floor(t / i);
}
//console.log(result);
var returnFlag = await getAddress(result);
if(returnFlag)
{
//创建文件保存正确的助记词顺序
fs.writeFile('keyword.txt', result.toString(), function(err, fd) {});
console.log("Find Key:"+result.toString());
console.log("total", count);
process.exit(1);
}
}
console.log("total", count);
}
//用打乱生成的助记词生成公私钥、地址
async function getAddress(inputarr) {
var flag = false;
var temp = inputarr;
var str = '';
for (var i = 0; i < temp.length; i++) {
str += temp[i] + ' ';
}
mnemonic = str;
var seed = await bip39.mnemonicToSeed(mnemonic); //生成种子
//console.log(seed)
var hdwallet = HDWallet.fromSeed(seed);
for (var i = 0; i < 1; i++) { // 用同一个种子生成多个地址
count++;
//console.log('=============地址' + (i + 1) + '=================')
var key = hdwallet.derive("m/44'/60'/0'/0/" + i); // 地址路径的最后一位设置为循环变量
//console.log(create_address);
var EthAddress = '0x' + key.getAddress().toString('hex'); //地址
if (EthAddress == create_address) {
console.log("PrivateKey = " + key.getPrivateKey().toString('hex')); // 私钥
console.log("PublicKey = " + key.getPublicKey().toString('hex')); // 公钥
console.log('ETH Address = ' + EthAddress);
flag = true;
}
else {
console.log('=============address count:' + (count) + ' =================');
console.log('=============address:' + EthAddress + ' =================');
flag = false;
}
}
return flag;
}
perm(arrtemp);
最后执行
node index.js
效果如下
如果匹配到结果会在当前文件夹下生成keyword.txt文件来保存结果。
这代码可以改进的还有很多,比如用多线程来执行,会快很多。
最后一提当我还在运行的时候,已经被某个人拿走了那1ETH。。
如有任何问题欢迎来沟通交流,关注推特不定期更新。