并在crypto.go中定义了如下变量用于限制范围,超过此范围的就视为非法私钥:
var ( secp256k1_N, _ = new(big.Int).SetString("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16) secp256k1_halfN = new(big.Int).Div(secp256k1_N, big.NewInt(2)) )不过回到笔者一开始的目的,使用neon-js中的私钥生成方法来创建一个NEO私钥,这货直接使用的是js中的encrypt.getRandomValues,其随机性以及对双重私钥(对应同一地址)的防御能力又有多少呢?答案看来得去追踪NEO-CLI自己的私钥生成算法了。如果没找错的话是下面这段:
public WalletAccount CreateAccount() { byte[] privateKey = new byte[32]; using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) { rng.GetBytes(privateKey); } WalletAccount account = CreateAccount(privateKey); Array.Clear(privateKey, 0, privateKey.Length); return account; }仅通过C#自带的库生成,没找到范围限制,也就是跟neon-js的做法一样,把随机程度压力交给大佬了,这样来看不知是好消息还是坏消息,可以放心使用neon-js来创建私钥了,反正没比neo核心的创建方法差到哪里去。
再提出个大胆的想法,如果集齐一万甚至更多的志愿者,每天也不挖矿,每人整个超级计算机就碰撞某个范围的ETH私钥(可以看作是难度巨大的挖矿),协商如果谁遇到了巨额存款地址就平摊,哲学角度这就是在挑战区块链核心的信仰了。