투석기의 네메시스 블록에 39,000 계정의 초기 분배를 넣어보십시오.

18795 단어 catapultBlockchainNEM

소개



NEM의 투석 마이그레이션을 생각할 때 NIS1의 어딘가에 있는 블록 높이에서 스냅샷을 찍어서 투석기의 네메시스 블록에 넣는 방법을 생각할 수 있습니다. 하나의 방법입니다.

그래서 어쩐지 해보자.

이번에는, 네임스페이스라든지 모자이크라든지 멀티 시그는 무시하고, XEM의 잔고만을 해 본다.

데이터 획득



우선, NIS1의 데이터를 취득한다. NIS1의 노드는 h2라는 DB를 사용하고 있다.

테스트넷의 DB를 가져와서 들여다 본다.

참고 절차: htps : // m / 헤이 23 / ms / 1f126c9b68b15b3746


command
java -Dh2.bindAddress=0.0.0.0 -cp ./h2db/h2/bin/h2-1.4.197.jar org.h2.tools.Server -baseDir ~/h2db  -webAllowOthers -tcpAllowOthers



ACCOUNTS라는 테이블에 모든 출현한 적이 있는 주소가 적혀 있는 것 같다.

계정 목록



ACCOUNTS 테이블을 모두 가져옵니다.

command
java -cp ./h2db/h2/bin/h2-1.4.197.jar org.h2.tools.RunScript -url "jdbc:h2:./h2db/nis5_testnet" -script "./h2db/sql.txt" -showResults > ./h2db/result.txt

sql.txt
select printablekey from accounts;

result.txt
select printablekey from accounts;
--> TBULEAUG2CZQISUR442HWA6UAKGWIXHDABJVIPS4
--> TBONKWCOWBZYZB2I5JD3LSDBQVBYHB757VN3SKPP
--> TBGIMRE4SBFRUJXMH7DVF2IBY36L2EDWZ37GVSC4
--> TBLOODPLWOWMZ2TARX4RFPOSOWLULHXMROBN2WXI
--> TBALNEMNEMKIMWLF65HTUWMQVX5G55EBBIWS4WQC
--> TAOPATMADWFEPME6GHOJL477SI7D3UT6NFJN4LGB
--> TBMKRYST2J3GEZRWHS3MICWFIBSKVHH7F5FA6FH3
--> TBGJAGUAQY47BULYL4GRYBJLOI6XKXPJUXU25JRJ
--> TB7YGASZY2ROWNAVZO3DYH6IVYGMD3LZYTHIESWP
--> TDECM3D4JX4M2EIHMWP6PBWV4EBZY3TMAKOTO26J
--> TBSANAAURPWQDBZQSSQ5ZP3NYINUBSQY4RKYI6I7
--> TAFMINM2IMWQ3WXJLHGOGOGOBB7C46EQ3UFIREOA
--> TBGXMN6QEKTV32MGBJQK22E7GZKOEAN2FY2JUSAN
--> TB5FO7AWGNE7VEBWOCXBKWX6VTJVWDNMVEKHACHI
--> TD2IWIJ3EUNIJUICXCFDSPO6IDXSNKMPTMX4HMPJ
--> TCSGMTAJNWH7G6CLEVRTJC7WSDKQKOO6VP6SFNZU
--> TALICEBMLRCCYHAYBKUVAPLB2DMZIBZFFGIMJHSC
--> TALICEYUFXRQKTIONRNMS6LBJN3T5RCE2O2GVTJO
...

글쎄, 잔액은 어디에 있는지, 그렇게 쉽게 얻을 수있을 것 같지 않았습니다. 잔액은 거래 내역에서 모든 출금과 입금을 더한 값으로만 ​​얻을 수 있습니다.

잔액



이번에는 잔액을 계산하는 것이 본질적이지 않으므로 NIS API에 문의하여 잔액을 얻습니다. 취득중에 트랜잭션이 발생해 잔액이 바뀌어 버릴지도 모르지만, 눈을 부른다고 하는 것으로.
result.txt 는 1 행에 1 주소가 정형되어 기재되도록 하고 있습니다. 그런 다음 모든 계정의 총 잔액을 얻습니다.
process.env.NODE_URL = 'http://192.168.11.77:7890'

const fs = require('fs');
const axios = require('axios');

const text = fs.readFileSync('./result.txt', { encoding: 'utf8'});
const addresses = text.split('\n');
let totalSupply = 0;

function addressConvert(addressStinrg) {
    // 後述
}

async function sleep(millis) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, millis);
    });
}

async function exec() {
    for (let i = 0; i < addresses.length; i++) {
        const address = addresses[i];
        const data = await axios.get(`${process.env.NODE_URL}/account/get?address=${address}`);
        const balance = data.data.account.balance;
        const line = `${addressConvert(address)} = ${balance.toLocaleString()}`;
        console.log(i, line);
        if (balance !== 0) {
            totalSupply += balance;
        }
        fs.appendFileSync('nemesis.txt', line + "\n", 'utf8');
        await sleep(100);
    }
    console.log("totalSupply", totalSupply);
}

exec();

주소 변환



2019/05/18 시점에서 NIS1은 해시 함수에 Keccak을 사용하고 투석기는 SHA3을 사용합니다.

주소에는 체크섬이 붙어 있고, 체크섬의 도출에는 해시 함수를 사용합니다.

따라서 NIS1의 주소를 그대로 사용할 수 없습니다.

그래서 NIS1 주소에서 공개 키 해시를 계산하고이를 바탕으로 투석기 주소를 계산하기로 결정합니다. 또한 버전 접두사도 MIJIN_TEST용으로 변경합니다.

(덧붙여 Ed25519의 경우, 해시 함수가 다른 경우, 같은 비공개 키를 사용해도, 다른 공개 키가 도출됩니다.)
(이 도출된 주소의 비밀키는 아무도 모르게 됩니다만, 이 건에 대해서는 무시합니다.)
function addressConvert(addressStinrg) {
    const addressDecoded = nem2lib.address.stringToAddress(addressStinrg);
    const pubKeyHash = addressDecoded.subarray(1,20);
    const addressConverted = pubKeyHashToAddress(pubKeyHash);
    return nem2lib.address.addressToString(addressConverted);
}

// copy from nem2-library corders/address.js, coders/array.js
function pubKeyHashToAddress(ripemdHash) {
    const decodedAddress = new Uint8Array(25);
    decodedAddress[0] = 0x90;
    copy(decodedAddress, ripemdHash, 20, 1);
    const hash = sha3_256.arrayBuffer(decodedAddress.subarray(0, 21));
    copy(decodedAddress, uint8View(hash), 4, 21);
    return decodedAddress;
}

function copy(dest, src, numElementsToCopy, destOffset = 0, srcOffset = 0) {
    const length = undefined === numElementsToCopy ? dest.length : numElementsToCopy;
    for (let i = 0; i < length; ++i)
        dest[destOffset + i] = src[srcOffset + i];
}

function uint8View(input) {
    if (ArrayBuffer === input.constructor)
        return new Uint8Array(input); // note that wrapping an ArrayBuffer in an Uint8Array does not make a copy
    else if (Uint8Array === input.constructor)
        return input;

    throw Error('unsupported type passed to uint8View');
}

결과



nemesis.txt
SBULEAUG2CZQISUR442HWA6UAKGWIXHDACFRTZLK = 323,942,608
SBONKWCOWBZYZB2I5JD3LSDBQVBYHB75ACUVP7AF = 49,897,001,750,000
SBGIMRE4SBFRUJXMH7DVF2IBY36L2EDWACGDIB6V = 44,640,294,909,864
SBLOODPLWOWMZ2TARX4RFPOSOWLULHXMABZIGNGL = 50,026,293,690,123
SBALNEMNEMKIMWLF65HTUWMQVX5G55EBAAJUYB4T = 50,012,323,000,000
SAOPATMADWFEPME6GHOJL477SI7D3UT6ADULGNFU = 50,000,000,000,006
SBMKRYST2J3GEZRWHS3MICWFIBSKVHH7ABAHI6VO = 50,000,000,000,000
SBGJAGUAQY47BULYL4GRYBJLOI6XKXPJAD53HFDX = 50,000,234,000,000
SB7YGASZY2ROWNAVZO3DYH6IVYGMD3LZAARS7SHD = 50,008,505,000,000
SDECM3D4JX4M2EIHMWP6PBWV4EBZY3TMAC7DRXI3 = 50,001,800,000,000
SBSANAAURPWQDBZQSSQ5ZP3NYINUBSQYAAZAO4JX = 50,000,000,000,000
SAFMINM2IMWQ3WXJLHGOGOGOBB7C46EQACV7NGPF = 51,546,772,865,817
SBGXMN6QEKTV32MGBJQK22E7GZKOEAN2AC25PDPG = 50,000,000,000,000
SB5FO7AWGNE7VEBWOCXBKWX6VTJVWDNMADOI622S = 50,000,000,000,000
SD2IWIJ3EUNIJUICXCFDSPO6IDXSNKMPACXXZBJU = 50,000,000,000,000
...

totalSupply.txt
totalSupply 7999999990950000

시작해보기



네메시스 블록용 파일을 만듭니다. 계정 잔액의 ,'로 변환합니다. supply 를 변경합니다.

block-properties-file.properties
...
[mosaic>cat:currency]

divisibility = 6
duration = 0
supply = 7'999'999'990'950'000
isTransferable = true
isSupplyMutable = false
isLevyMutable = false

[distribution>cat:currency]

SBULEAUG2CZQISUR442HWA6UAKGWIXHDACFRTZLK = 323'942'608
SBONKWCOWBZYZB2I5JD3LSDBQVBYHB75ACUVP7AF = 49'897'001'750'000
SBGIMRE4SBFRUJXMH7DVF2IBY36L2EDWACGDIB6V = 44'640'294'909'864
SBLOODPLWOWMZ2TARX4RFPOSOWLULHXMABZIGNGL = 50'026'293'690'123
SBALNEMNEMKIMWLF65HTUWMQVX5G55EBAAJUYB4T = 50'012'323'000'000
SAOPATMADWFEPME6GHOJL477SI7D3UT6ADULGNFU = 50'000'000'000'006
SBMKRYST2J3GEZRWHS3MICWFIBSKVHH7ABAHI6VO = 50'000'000'000'000
SBGJAGUAQY47BULYL4GRYBJLOI6XKXPJAD53HFDX = 50'000'234'000'000
SB7YGASZY2ROWNAVZO3DYH6IVYGMD3LZAARS7SHD = 50'008'505'000'000
...

시작합니다.





보통 시작했습니다.

결론



네메시스 블록에 39,000 계정을 넣을 수 있었다.

지금의 설정으로, 1블록 120,000트랜잭션이 최대이지만, 네메시스 블록은 이것을 넘을 수 있는 것일까.
모자이크 분도 네메시스 블록에 넣으면 분명 120,000을 넘기 때문에 의욕이 있으면 해 본다.

좋은 웹페이지 즐겨찾기