批量生成ethereum私钥脚本

区块链分类的第一篇文章,今天就分享一个可以创建N个ethereum私钥的脚本吧。

这个脚本依赖ethereum生成私钥文件的工具:ethkey(我上传了一个编译好的在这里,仅供测试使用,为了安全要自己从源码编译),需要把ethkey与脚本放在当前文件夹下,如果放在其他路径可以修改脚本中ethkey的路径。

功能:

  1. 创建私钥,使用-n指定数字N,创建N个私钥文件,所有私钥放在当前以"keystore-日期"命名的目录下,可以使用-p参数指定一个密码,默认密码为空。
  2. 验证某个路径下所有私钥文件的密码是否正确,正确输出绿色的Success,错误输出红色的Fail。最后会统计验证结果,并打印出所有没有通过验证的私钥文件名。

用法:

Usage: ./newkeys [options]
    -n <number>     number of new keys to generate
    -p <passphrase> password of new keys, the default is blank
    -t <path>       test password of key file(s) in path
    -h              display this help and exit
#!/bin/bash

# help
help() {
    echo "Usage: $0 [options]"
    echo ""
    echo "    -n <number>     number of new keys to generate"
    echo "    -p <passphrase> password of new keys, the default is blank"
    echo "    -t <path>       test password of key file(s) in path"
    echo "    -h              display this help and exit"
    echo ""
}

#args: 
# $1 number
# $2 password
generateKeys() {

    keysNumber=$1
    password=$2

    if [ -z "$keysNumber" ]; then
        echo "$0 need 1 parameters"
        return
    fi

    date=`date +"%FT%H-%M-%S"`
    dirname=keystore-$date
    accountFile=accounts-$date.txt
    defaultKeyFile=keyfile.json

    # mkdir
    echo "Create directory: $dirname"
    mkdir $dirname

    # generate key
    I=1
    while [ $I -le $keysNumber ]; do
        echo "Progress: $I/$keysNumber"

        if [ -f $defaultKeyFile ]; then
            rm -rf $defaultKeyFile
        fi

        ## generate one key
        ret=`./ethkey generate <<-EOF
$password
$password
EOF`

        address=`echo $ret | grep -E -o "0x[[:digit:]a-f,A-F]{40,40}"`

        if [ "$address" = "" ]; then
            echo "Error address, ethkey generate return: \n\n $ret"
            exit 1
        fi

        ## rename the new key file 
        mv keyfile.json $dirname/$address.key

        ## append this new address to address file
        echo $address >> $dirname/$accountFile

        let I=$I+1
    done

    echo "Finished."
    echo "Keys are stored in $dirname"
}

#args: $1 directory
testKeys() {
    testDir=$1
    if [ -z "$testDir" ]; then
        echo "$0 need 1 parameters"
        return
    fi
    read -s -p "Password: " password
    echo ""

    if [ -f "$testDir" ]; then
        testOneKey $testDir $password
    elif [ -d "$testDir" ]; then
        testKeyDir $testDir $password
    fi

}

#args: 
# $1 directory path
# $2 password
testKeyDir() {
    allFiles=`find $testDir -type f`
    allFilesArray=($allFiles)
    keysNumber=${#allFilesArray[@]}
    failedFiles=""
    failedNumber=0

    I=0
    for file in ${allFilesArray[@]}
    do
        let I++
        echo -n "Progress: $I/$keysNumber "
        testOneKey $file $password
    done
    let successNumber=I-failedNumber
    echo "Finished." 
    echo "Test $I files, Success number: $successNumber, Failed number: $failedNumber"
    echo "Failed Files: $failedFiles"
}

#args: 
# $1 file path
# $2 password
testOneKey() {
    file=$1
    password=$2
    if [ ! -f "$file" ]; then
        echo "$0 need 1 parameter"
        return
    fi

    echo -n "$file"
    ./ethkey inspect $file >/dev/null 2>&1 <<-EOF
$password
EOF

    if [ $? -eq 0 ]; then
        echo -e "\033[32m Success\033[0m"
    else
        echo -e "\033[31m Fail\033[0m"
        failedFiles+=" $file"
        let failedNumber++
    fi
    return
}

#
# main
#

# parse arguments
while getopts n:p:t:h OPT; do
    case $OPT in
        n)
            keysNumber=$OPTARG
            ;;
        p)
            password=$OPTARG
            ;;
        t)
            testDir=$OPTARG
            ;;
        h)
            help
            exit 0
            ;;
    esac
done

if [ -n "$testDir" ]; then
    testKeys $testDir
    exit 0
elif [ -z "$keysNumber" ]; then
    help
    exit 0
elif [ $keysNumber -le 0 ]; then
    help
    exit 0
fi

generateKeys $keysNumber $password
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值