Filecoin地址生成规则

算法简介
blake2
BLAKE2的定位是目前安全系数最高的哈希函数。BLAKE2是基于BLAKE实现的,BLAKE是2008年被提交至SHA-3竞赛的一种哈希函数。
BLAKE2不仅仅只是一个简单的哈希函数而已!首先,BLAKE2有两大主要版本:BLAKE2b和BLAKE2s。BLAKE2b是BLAKE的64位版本,它可以生成最高512位的任意长度哈希。BLAKE2s是BLAKE的32位版本,它可以生成最高256位的任意长度哈希。
BLAKE2x是对BLAKE2的简单扩展,它可以生成任意长度的哈希值(长度不受限制)。

ECC  
椭圆曲线加密算法,即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。

Base32编码
Base32编码是使用32个可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。

RFC
Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。

地址生成步骤:

  1. 随机生成256位私钥(BIP44协议,)
    privateKey = generatePrivateKey()
    "0x81232f16fa8f8bc2d31096d2407d9e392c25f048861a0e0f640f4febb4f22996"

  2. 利用椭圆曲线加密算法生成公钥
    publicKey=ECC.getPublicKeyFromPrivateKey(privateKey)
    "0xeb15c814543f9c1e62f1e4e13e2b5fd2a4d224b58f8cfeb1e587378d46a96c06dfaf876bc176911e7613c3e8ffe1e928025e266918a935fc6bd921606fcca5b3"

  3. 将公钥前加入0x04值后,进行20位的blake2b计算
    blake2Hash = blake2b("0x04eb15c814543f9c1e62f1e4e13e2b5fd2a4d224b58f8cfeb1e587378d46a96c06dfaf876bc176911e7613c3e8ffe1e928025e266918a935fc6bd921606fcca5b3", 20)
    "0x50cedfe81c8cdcf03fede2d075db9025d7f09463"

  4. 将得到的blake2哈希值前添加0x01后,继续用blake2b算法计算4位校验和。
    checksum = blake2b("0x0150cedfe81c8cdcf03fede2d075db9025d7f09463", 4)
    "0x62c27772"(4位转16进制就是8个字符)

  5. 将20位公钥哈希值和4位校验和连接起来,并用遵照RFC4648标准的Base32编码格式进行编码。
    sourceAddress = Base32Encode(blake2Hash ,checksum, 'RFC4648')
    "kdhn72a4rtopap7n4lihlw4qexl7bfddmlbho4q"

  6. 将编码后的字符串根据地址属性,
    属于测试网(t),
    还是正式网(f),
    是钱包地址(1)
    是合约地址(2)
    加上相应的前缀。
    得到最终地址:
    t1kdhn72a4rtopap7n4lihlw4qexl7bfddmlbho4q

下面是kt的代码:

//通过助记词得到种子
        val seed = DeterministicSeed(
            mnemonicCodes,
            NumericUtil.toSeed(mnemonicCodes, ""),
            "",
            creationTimeSeconds
        )

        //通过biP44得到path
        val path: String? = getPath(0)

        //主密钥
        val keyChain = DeterministicKeyChain.builder().seed(seed).build()
        var rootPublicKey = keyChain.rootKey?.publicKeyAsHex
        Log.d(TAG, "主公钥:$rootPublicKey")
        val parent =
            keyChain.getKeyByPath(BIP44Util.generatePath(path), true)
        var p = Blake2b.Param()
        p.digestLength = 20

        //子私钥
        var xprv = parent.privateKeyAsHex


        Log.d(TAG, "子私钥:$xprv")
        Log.d(TAG, "子私钥(Base58):" + Base58.encode(parent.privKeyBytes))

        //
        val ecKey: ECKey =
            ECKey.fromPrivate(NumericUtil.hexToBytes(xprv), false)

        /**
         * 什么是压缩公钥?
         *
         * 什么是未压缩公钥?
         */

        //未压缩公钥16进制
        var pulStr =
          ecKey.publicKeyAsHex
        Log.d(TAG, "未压缩公钥:$pulStr")

        //未压缩公钥字节
        val encryptionKey =
            NumericUtil.hexToBytes(pulStr)

        //将公钥前加入0x04值后,进行20位的blake2b计算
        p.digestLength = 20
        var blake2Hash = Blake2b.Digest.newInstance(p)
        var blake2HashHexByte = blake2Hash.digest(encryptionKey)
        var blake2HashHexStr = NumericUtil.bytesToHex(blake2HashHexByte)

        Log.d(TAG, blake2HashHexStr)

        //将得到的blake2哈希值前添加0x01后,继续用blake2b算法计算4位校验和
        var blake2HashSecond = "01$blake2HashHexStr"

        //用blake2b算法计算4位校验和
        p.digestLength = 4
        var blake2b3 = Blake2b.Digest.newInstance(p)
        var checksumBytes = blake2b3.digest(NumericUtil.hexToBytes(blake2HashSecond))
        var checksum =
            NumericUtil.bytesToHex(checksumBytes)
        Log.d(TAG, "校检和:$checksum")

        //将20位公钥哈希值和4位校验和连接起来
        val addressBytes = ByteArray(blake2HashHexByte.size + checksumBytes.size)
        System.arraycopy(blake2HashHexByte, 0, addressBytes, 0, blake2HashHexByte.size)
        System.arraycopy(checksumBytes, 0, addressBytes, blake2HashHexByte.size, checksumBytes.size)
        var address = "t1" + Base32New.encode(addressBytes)
        Log.d(TAG, "地址:$address")
    }

    //m/44'/461'/0/0/0
    private fun getPath(index: Int): String? {
        //146或1
        return "m/44'/461'/$index/0/0"
    }

这个看路径如果不同生成地址也是不一样的。

  //m/44'/461'/0/0/0
  //m/44'/461'/0'/0/0
    private fun getPath(index: Int): String? {
        //146或1
        return "m/44'/461'/$index/0/0"
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 概念科普 哈希算法:在互联网的世界中,每台服务器上面会有无数多个文件,视频、音乐、压缩包、照片等等各种东西,当然还...
    刘员外__阅读 1,872评论 0 0
  • 黑色的海岛上悬着一轮又大又圆的明月,毫不嫌弃地把温柔的月色照在这寸草不生的小岛上。一个少年白衣白发,悠闲自如地倚坐...
    小水Vivian阅读 3,088评论 1 5
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,227评论 0 13
  • 感觉自己有点神经衰弱,总是觉得手机响了;屋外有人走过;每次妈妈不声不响的进房间突然跟我说话,我都会被吓得半死!一整...
    章鱼的拥抱阅读 2,162评论 4 5
  • 夜莺2517阅读 127,695评论 1 9