Hello , 我是09

此篇内容为我2018~2020年在【库神】工作时,对部分重要知识做的学习总结

随着比特币冲破10万美金,行业又再次兴起,希望相关从业者可以学习到你需要的内容

地址计算原理

EOS私钥编码格式和Bitcoin的非压缩格式私钥编码完全一致,而EOS地址的编码就比较奇葩,它的算法是:

  1. 计算压缩格式的33位公钥;

  2. 取RipeMD160结果的前4位作为checksum;

  3. 把33位公钥和4位checksum连起来,用Base58编码,但不使用Base58的checksum;

  4. 加上前缀EOS即为最终地址。

地址计算代码

uint32_t EOS_GetAddress(uint8_t publicKey, uint32_t keyLength, char out, uint32_t outLength)
{
    uint8_t temp[37];
    int8_t check[20];
   
    if ((publicKey  NULL) || (out  NULL))
    {
        return 0;
    }

    if (outLength < 40)
    {
        return 0;
    }
   
    if(keyLength == 65)//若公钥为非压缩公钥
    {
        // is even?
        temp[0] = (publicKey[64] & 0x1) ? 0x03 : 0x02;
        memmove(temp + 1, publicKey + 1, 32);
    }
    else if(keyLength == 33)
    {
        memmove(temp, publicKey, 33);
    }
    else
    {
        return 0;
    }

    ripemd160(temp, 33, check);
 
    memmove(temp + 33, check, 4);
   
    memset(out, 0, outLength);
    out[0] = 'E';
    out[1] = 'O';
    out[2] = 'S';

    size_t addressLen = outLength - 3;
    b58enc(out + 3, &addressLen, temp, sizeof(temp));
       
    if (addressLen + 3 >= outLength)
    {
            return 0;
    }
    return addressLen + 3;
}

举例

私钥:

6a49b749ee5588e7d8f59e42848072ba0de3484370f23afe12aea1ca16f89761

公钥:

037E1D3A7E57108FC7A35CCD8AD80F97A4B981E7421D8948F7328174CF1C11EAAC

==》

Raw Private: 6a49b749ee5588e7d8f59e42848072ba0de3484370f23afe12aea1ca16f89761
ETH Address: 0xb289c33560b6ef88ce481406f61b04a93f6ffaa0
BTC Private: KznKZLHWwxBt3YeCDWfcrwzHf8Gc1JeQ4omnpy1sHXNUAsBzpT7q
EOS Private: 5Jd6Zhcv1DWCZkRHb6pGNjpRAYZ5m2HBDC3u555jCuCD3nmnUgZ
EOS Address: EOS7nmwuAaB8WvYXJuH3YkXHGh7ABk4njitZRkjKCgaFCLcXEpAfA