ライトコイン掘削アルゴリズムScript詳細解


Scriptアルゴリズムの概要
ライトコインの採掘アルゴリズムはScriptアルゴリズムです.Scriptアルゴリズムを使用した最初のデジタル通貨はTenebrixであり、その後、このアルゴリズムはライトコインによって使用される.ライト元の創始者はライト元の創世帖の中でライト元が採用した共通認識のメカニズムを紹介しました.採掘のアルゴリズム、発行総量、採掘の難しさなどに関する重要な情報を紹介しました.この帖の中で、李啓威はライトコインが使っている採掘アルゴリズムがデジタルマネーTenebrixに使われているScryptアルゴリズムであることを説明しています.これもPoW共通認識メカニズムに適合するアルゴリズムです.Scriptアルゴリズムは、ハッシュ値の計算も必要であるが、Scrypt計算には多くのメモリリソースが必要である.
他にもScriptアルゴリズムを使用したデジタル通貨にはデジタルコイン、ドッグコイン、ラッキーコイン、ワールドコインなどがあります.
Scriptアルゴリズムプロセス
Scriptアルゴリズムで使用されているいくつかの関数がループバックルされており、本節では関数によって内側から外への呼び出し順序で説明されています.
SAlsa 20/8
#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
void salsa20_word_specification(uint32 out[16],uint32 in[16])
{
    int i;
    uint32 x[16];
    for (i = 0;i < 16;++i) x[i] = in[i];
    for (i = 8;i > 0;i -= 2) {
        x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9);
        x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18);
        x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9);
        x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18);
        x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9);
        x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18);
        x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9);
        x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18);
        x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9);
        x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18);
        x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9);
        x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18);
        x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9);
        x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18);
        x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9);
        x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18);
    }
    for (i = 0;i < 16;++i) out[i] = x[i] + in[i];
}
scrypt BlockMix
   Parameters:
            r Block size parameter.
   Input:
            B[0] || B[1] || ... || B[2 * r - 1]
                   Input octet string (of size 128 * r octets),
                   treated as 2 * r 64-octet blocks,
                   where each element in B is a 64-octet block.
   Output:
            B'[0] || B'[1] || ... || B'[2 * r - 1]
                   Output octet string.
   Steps:
     1. X = B[2 * r - 1]
     2. for i = 0 to 2 * r - 1 do
          T = X xor B[i]
          X = Salsa (T)
          Y[i] = X
        end for
     3. B' = (Y[0], Y[2], ..., Y[2 * r - 2],
              Y[1], Y[3], ..., Y[2 * r - 1])
scryptromix
   Input:
            r Block size parameter.
            B Input octet vector of length 128 * r octets.
            N CPU/Memory cost parameter, must be larger than 1,
                    a power of 2, and less than 2^(128 * r / 8).
   Output:
            B' Output octet vector of length 128 * r octets.
   Steps:
     1. X = B
     2. for i = 0 to N - 1 do
          V[i] = X
          X = scryptBlockMix (X)
        end for
     3. for i = 0 to N - 1 do
          j = Integerify (X) mod N
                 where Integerify (B[0] ... B[2 * r - 1]) is defined
                 as the result of interpreting B[2 * r - 1] as a
                 little-endian integer.
          T = X xor V[j]
          X = scryptBlockMix (T)
        end for
     4. B' = X
scrypt
   Input:
            P Passphrase, an octet string.
            S Salt, an octet string.
            N CPU/Memory cost parameter, must be larger than 1,
                    a power of 2, and less than 2^(128 * r / 8).
            r Block size parameter.
            p Parallelization parameter, a positive integer
                    less than or equal to ((2^32-1) * hLen) / MFLen
                    where hLen is 32 and MFlen is 128 * r.
            dkLen Intended output length in octets of the derived
                    key; a positive integer less than or equal to
                    (2^32 - 1) * hLen where hLen is 32.
   Output:
            DK Derived key, of length dkLen octets.
   Steps:
    1. Initialize an array B consisting of p blocks of 128 * r octets
       each:
        B[0] || B[1] || ... || B[p - 1] =
          PBKDF2-HMAC-SHA256 (P, S, 1, p * 128 * r)
    2. for i = 0 to p - 1 do
          B[i] = scryptROMix (r, B[i], N)
        end for
    3. DK = PBKDF2-HMAC-SHA256 (P, B[0] || B[1] || ... || B[p - 1], 
                                        1, dkLen)
ライトコインの採掘アルゴリズムで選択されたパラメータは以下の通りです.
  • P:ブロックヘッダ;
  • S:ブロックヘッド;
  • N:1024に固定されています.
  • r:1に固定します.
  • p:1に固定します.
  • dkLen:32に固定されています.すなわち出力長は32バイトです.
  • したがって、ライト元のブロックヘッダのハッシュ値はpowhash=scrypt(blockheader、blockheader、1024、1、32)である.ランドブロックのハッシュのGo言語バージョンを参照して実装することができる.
    参考資料
  • Litecoin-a lite version of Bitcoin.Launched!ライト元の創始者がBitcointalk.orgに書いた招待状はライト元に白書がないため、ライト元の創始者である李啓威がBitcointalk.orgに発表した招待状は一応白書です.
  • Tenebrix,a CPU-friendly,GPU-hostile crypt currency:Tenebrixの書き込みを紹介します.
  • http://www.tarsnap.com/scrypt.html:Scriptアルゴリズムのホームページを紹介します.
  • https://datatracker.ietf.org/doc/rfc7914/?include_text=1:Scryptアルゴリズムの標準文書.
  • crypt/scrypt/go:ScryptアルゴリズムのGo言語実現コード.