투석기의 네메시스 블록에 39,000 계정의 초기 분배를 넣어보십시오.
18795 단어 catapultBlockchainNEM
소개
NEM의 투석 마이그레이션을 생각할 때 NIS1의 어딘가에 있는 블록 높이에서 스냅샷을 찍어서 투석기의 네메시스 블록에 넣는 방법을 생각할 수 있습니다. 하나의 방법입니다.
그래서 어쩐지 해보자.
이번에는, 네임스페이스라든지 모자이크라든지 멀티 시그는 무시하고, XEM의 잔고만을 해 본다.
데이터 획득
우선, NIS1의 데이터를 취득한다. NIS1의 노드는 h2라는 DB를 사용하고 있다.
테스트넷의 DB를 가져와서 들여다 본다.
참고 절차: htps : // m / 헤이 23 / ms / 1f126c9b68b15b3746
commandjava -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 테이블을 모두 가져옵니다.
commandjava -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.txtselect printablekey from accounts;
result.txtselect 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.txtSBULEAUG2CZQISUR442HWA6UAKGWIXHDACFRTZLK = 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.txttotalSupply 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을 넘기 때문에 의욕이 있으면 해 본다.
Reference
이 문제에 관하여(투석기의 네메시스 블록에 39,000 계정의 초기 분배를 넣어보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/planethouki/items/1b73e1b6101eb283e95d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
우선, 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을 넘기 때문에 의욕이 있으면 해 본다.
Reference
이 문제에 관하여(투석기의 네메시스 블록에 39,000 계정의 초기 분배를 넣어보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/planethouki/items/1b73e1b6101eb283e95d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
...
[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을 넘기 때문에 의욕이 있으면 해 본다.
Reference
이 문제에 관하여(투석기의 네메시스 블록에 39,000 계정의 초기 분배를 넣어보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/planethouki/items/1b73e1b6101eb283e95d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)