UNPKG

wowok

Version:

Wowok Blockchain TypeScript API

1 lines 3.87 kB
import{PQError,PQErrorCode}from'./types.js';const DATA_SHARDS=0x1c,PARITY_SHARDS=0x1c,TOTAL_SHARDS=0x38,SHARD_DATA_SIZE=0x2c,SHARD_HEADER_SIZE=0x8,SHARD_SIZE=SHARD_DATA_SIZE+SHARD_HEADER_SIZE,EXP_TABLE=new Array(0x200),LOG_TABLE=new Array(0x100);function initGFTables(){if(EXP_TABLE[0x0]!==undefined)return;let a=0x1;for(let b=0x0;b<0xff;b++){EXP_TABLE[b]=a,EXP_TABLE[b+0xff]=a,LOG_TABLE[a]=b,a<<=0x1,a&0x100&&(a^=0x11d);}LOG_TABLE[0x0]=0x0;}function gfMul(c,d){if(c===0x0||d===0x0)return 0x0;return initGFTables(),EXP_TABLE[(LOG_TABLE[c]+LOG_TABLE[d])%0xff];}function gfDiv(c,d){if(c===0x0)return 0x0;if(d===0x0)throw new PQError(PQErrorCode['ERASURE_ERROR'],'Division\x20by\x20zero');initGFTables();const e=(LOG_TABLE[c]-LOG_TABLE[d]+0xff)%0xff;return EXP_TABLE[e];}function buildVandermondeMatrix(a,b,c=0x0){const d=[];for(let e=0x0;e<a;e++){d[e]=[];for(let f=0x0;f<b;f++){d[e][f]=gfPow(c+e,f);}}return d;}function buildEncodingMatrix(a,b){const c=[];for(let f=0x0;f<b;f++){c[f]=new Array(b)['fill'](0x0),c[f][f]=0x1;}const d=a-b,e=buildVandermondeMatrix(d,b,b);for(let g=0x0;g<d;g++){c[b+g]=e[g];}return c;}function gfPow(a,b){if(b===0x0)return 0x1;if(a===0x0)return 0x0;let c=0x1;for(let d=0x0;d<b;d++){c=gfMul(c,a);}return c;}function matrixInvert(a){const b=a['length'],c=[];for(let e=0x0;e<b;e++){c[e]=[...a[e]];for(let f=0x0;f<b;f++){c[e]['push'](e===f?0x1:0x0);}}for(let g=0x0;g<b;g++){let h=g;while(h<b&&c[h][g]===0x0){h++;}if(h===b)throw new PQError(PQErrorCode['ERASURE_ERROR'],'Matrix\x20is\x20singular');h!==g&&([c[g],c[h]]=[c[h],c[g]]);const k=gfDiv(0x1,c[g][g]);for(let l=0x0;l<0x2*b;l++){c[g][l]=gfMul(c[g][l],k);}for(let m=0x0;m<b;m++){if(m!==g){const o=c[m][g];if(o!==0x0)for(let p=0x0;p<0x2*b;p++){c[m][p]^=gfMul(o,c[g][p]);}}}}const d=[];for(let q=0x0;q<b;q++){d[q]=c[q]['slice'](b);}return d;}export function encodeShards(a){const b=DATA_SHARDS*SHARD_DATA_SIZE;if(a['length']>b)throw new PQError(PQErrorCode['ERASURE_ERROR'],'Data\x20too\x20large:\x20'+a['length']+'\x20>\x20'+b);const c=new Uint8Array(b);c['set'](a);const d=[];for(let f=0x0;f<DATA_SHARDS;f++){d[f]=c['slice'](f*SHARD_DATA_SIZE,(f+0x1)*SHARD_DATA_SIZE);}const e=buildVandermondeMatrix(PARITY_SHARDS,DATA_SHARDS,DATA_SHARDS);for(let g=0x0;g<PARITY_SHARDS;g++){const h=new Uint8Array(SHARD_DATA_SIZE);for(let l=0x0;l<SHARD_DATA_SIZE;l++){let m=0x0;for(let n=0x0;n<DATA_SHARDS;n++){m^=gfMul(e[g][n],d[n][l]);}h[l]=m;}d[DATA_SHARDS+g]=h;}return d;}export function decodeShards(a,b){const c=Array['from'](a['keys']())['sort']((l,m)=>l-m);if(c['length']<DATA_SHARDS)throw new PQError(PQErrorCode['ERASURE_ERROR'],'Need\x20at\x20least\x20'+DATA_SHARDS+'\x20shards,\x20got\x20'+c['length']);const d=c['slice'](0x0,DATA_SHARDS),e=buildEncodingMatrix(b,DATA_SHARDS),f=[];for(const l of d){f['push'](e[l]);}const g=matrixInvert(f),h=new Uint8Array(DATA_SHARDS*SHARD_DATA_SIZE);for(let m=0x0;m<DATA_SHARDS;m++){for(let n=0x0;n<SHARD_DATA_SIZE;n++){let o=0x0;for(let p=0x0;p<DATA_SHARDS;p++){const q=a['get'](d[p]);o^=gfMul(g[m][p],q[n]);}h[m*SHARD_DATA_SIZE+n]=o;}}return h;}export function packChunk(a){const b=new Uint8Array(SHARD_SIZE),c=new DataView(b['buffer']);return c['setUint32'](0x0,a['cycleId'],![]),c['setUint16'](0x4,a['chunkIndex'],![]),c['setUint16'](0x6,a['totalChunks'],![]),b['set'](a['data']['slice'](0x0,SHARD_DATA_SIZE),SHARD_HEADER_SIZE),b;}export function unpackChunk(a){if(a['length']<SHARD_SIZE)throw new PQError(PQErrorCode['ERASURE_ERROR'],'Chunk\x20too\x20small:\x20'+a['length']+'\x20<\x20'+SHARD_SIZE);const b=new DataView(a['buffer'],a['byteOffset'],a['byteLength']),c=b['getUint32'](0x0,![]),d=b['getUint16'](0x4,![]),e=b['getUint16'](0x6,![]),f=a['slice'](SHARD_HEADER_SIZE,SHARD_HEADER_SIZE+SHARD_DATA_SIZE);return{'cycleId':c,'chunkIndex':d,'totalChunks':e,'data':f};}export{DATA_SHARDS,PARITY_SHARDS,TOTAL_SHARDS,SHARD_DATA_SIZE,SHARD_HEADER_SIZE,SHARD_SIZE};