@corpus-core/colibri-stateless 0.1.1 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/c4w.js +1 -1
- package/c4w.wasm +0 -0
- package/package.json +1 -1
- package/README.md +0 -1189
- package/c4_logo.png +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) .NET Foundation and Contributors
|
|
4
|
+
|
|
5
|
+
All rights reserved.
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
in the Software without restriction, including without limitation the rights
|
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
SOFTWARE.
|
package/c4w.js
CHANGED
|
@@ -5,7 +5,7 @@ var c4w = (() => {
|
|
|
5
5
|
async function(moduleArg = {}) {
|
|
6
6
|
var moduleRtn;
|
|
7
7
|
|
|
8
|
-
var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");var require=createRequire(import.meta.url)}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(!import.meta.url.startsWith("data:")){scriptDirectory=nodePath.dirname(require("url").fileURLToPath(import.meta.url))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.slice(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;var isFileURI=filename=>filename.startsWith("file://");function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["h"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("c4w.wasm")}return new URL("c4w.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["g"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{receiveInstance(mod,inst);resolve(mod.exports)})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}var ASM_CONSTS={55988:($0,$1)=>{var keyStr=UTF8ToString($0);var data=Module.storage.get(keyStr);if(data){var bufferPtr=_c4w_buffer_alloc($1,data.length);HEAPU8.set(data,bufferPtr);return 1}return 0},56176:($0,$1,$2)=>{var keyStr=UTF8ToString($0);var array=new Uint8Array($2);array.set(HEAPU8.subarray($1,$1+$2));Module.storage.set(keyStr,array)},56319:$0=>{var keyStr=UTF8ToString($0);Module.storage.del(keyStr)}};class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.unshift(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.unshift(cb);var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==106?HEAP64[buf>>3]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _fd_close=fd=>52;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func(...cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=(ident,returnType,argTypes,opts)=>{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var wasmImports={a:___assert_fail,b:_emscripten_asm_const_int,d:_emscripten_resize_heap,f:_fd_close,e:_fd_seek,c:_fd_write};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["h"];var _c4w_create_proof_ctx=Module["_c4w_create_proof_ctx"]=wasmExports["i"];var _c4w_free_proof_ctx=Module["_c4w_free_proof_ctx"]=wasmExports["j"];var _c4w_execute_proof_ctx=Module["_c4w_execute_proof_ctx"]=wasmExports["k"];var _c4w_req_set_response=Module["_c4w_req_set_response"]=wasmExports["l"];var _c4w_req_set_error=Module["_c4w_req_set_error"]=wasmExports["m"];var _c4w_verify_proof=Module["_c4w_verify_proof"]=wasmExports["n"];var _malloc=Module["_malloc"]=wasmExports["o"];var _free=Module["_free"]=wasmExports["p"];var _c4w_handle_client_updates=Module["_c4w_handle_client_updates"]=wasmExports["q"];var _c4w_req_free=Module["_c4w_req_free"]=wasmExports["r"];var _c4w_buffer_alloc=Module["_c4w_buffer_alloc"]=wasmExports["s"];var _c4w_init_chain=Module["_c4w_init_chain"]=wasmExports["t"];var _init_storage=Module["_init_storage"]=wasmExports["u"];var __emscripten_stack_restore=wasmExports["w"];var __emscripten_stack_alloc=wasmExports["x"];var _emscripten_stack_get_current=wasmExports["y"];Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise;
|
|
8
|
+
var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");var require=createRequire(import.meta.url)}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(!import.meta.url.startsWith("data:")){scriptDirectory=nodePath.dirname(require("url").fileURLToPath(import.meta.url))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.slice(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;var isFileURI=filename=>filename.startsWith("file://");function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["h"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("c4w.wasm")}return new URL("c4w.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["g"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{receiveInstance(mod,inst);resolve(mod.exports)})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}var ASM_CONSTS={56004:($0,$1)=>{var keyStr=UTF8ToString($0);var data=Module.storage.get(keyStr);if(data){var bufferPtr=_c4w_buffer_alloc($1,data.length);HEAPU8.set(data,bufferPtr);return 1}return 0},56192:($0,$1,$2)=>{var keyStr=UTF8ToString($0);var array=new Uint8Array($2);array.set(HEAPU8.subarray($1,$1+$2));Module.storage.set(keyStr,array)},56335:$0=>{var keyStr=UTF8ToString($0);Module.storage.del(keyStr)}};class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.unshift(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.unshift(cb);var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==106?HEAP64[buf>>3]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _fd_close=fd=>52;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func(...cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=(ident,returnType,argTypes,opts)=>{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var wasmImports={a:___assert_fail,b:_emscripten_asm_const_int,d:_emscripten_resize_heap,f:_fd_close,e:_fd_seek,c:_fd_write};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["h"];var _c4w_create_proof_ctx=Module["_c4w_create_proof_ctx"]=wasmExports["i"];var _c4w_free_proof_ctx=Module["_c4w_free_proof_ctx"]=wasmExports["j"];var _c4w_execute_proof_ctx=Module["_c4w_execute_proof_ctx"]=wasmExports["k"];var _c4w_req_set_response=Module["_c4w_req_set_response"]=wasmExports["l"];var _c4w_req_set_error=Module["_c4w_req_set_error"]=wasmExports["m"];var _c4w_verify_proof=Module["_c4w_verify_proof"]=wasmExports["n"];var _malloc=Module["_malloc"]=wasmExports["o"];var _free=Module["_free"]=wasmExports["p"];var _c4w_handle_client_updates=Module["_c4w_handle_client_updates"]=wasmExports["q"];var _c4w_req_free=Module["_c4w_req_free"]=wasmExports["r"];var _c4w_buffer_alloc=Module["_c4w_buffer_alloc"]=wasmExports["s"];var _c4w_init_chain=Module["_c4w_init_chain"]=wasmExports["t"];var _init_storage=Module["_init_storage"]=wasmExports["u"];var __emscripten_stack_restore=wasmExports["w"];var __emscripten_stack_alloc=wasmExports["x"];var _emscripten_stack_get_current=wasmExports["y"];Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise;
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
return moduleRtn;
|
package/c4w.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corpus-core/colibri-stateless",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Colibri is a stateless and trustless ethereum client, which is optimized for the mobile apps or embedded devices, because it does not hols the state, but verifies on demand.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {},
|
package/README.md
DELETED
|
@@ -1,1189 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
<img src="c4_logo.png" alt="C4 Logo" width="300"/>
|
|
4
|
-
|
|
5
|
-
# C4 (corpus core colibri client)
|
|
6
|
-
|
|
7
|
-

|
|
8
|
-
[](https://github.com/corpus-core/c4/actions/workflows/cmake-multi-platform.yml)
|
|
9
|
-
## Index
|
|
10
|
-
|
|
11
|
-
- [Index](#index)
|
|
12
|
-
- [Concept](#concept)
|
|
13
|
-
- [Updating the sync committee](#updating-the-sync-committee)
|
|
14
|
-
- [Verifying Blockhashes](#verifying-blockhashes)
|
|
15
|
-
- [Merkle Proofs](#merkle-proofs)
|
|
16
|
-
- [Patricia Merkle Proof](#patricia-merkle-proof)
|
|
17
|
-
- [SSZ Merkle Proof](#ssz-merkle-proof)
|
|
18
|
-
- [RPC Proofs](#rpc-proofs)
|
|
19
|
-
- [eth_getBalance](#eth_getbalance)
|
|
20
|
-
- [eth_getCode](#eth_getcode)
|
|
21
|
-
- [eth_getNonce](#eth_getnonce)
|
|
22
|
-
- [eth_getProof](#eth_getproof)
|
|
23
|
-
- [eth_getStorageAt](#eth_getstorageat)
|
|
24
|
-
- [eth_getTransactionReceipt](#eth_gettransactionreceipt)
|
|
25
|
-
- [eth_getTransactionByHash](#eth_gettransactionbyhash)
|
|
26
|
-
- [eth_getTransactionByBlockHashAndIndex](#eth_gettransactionbyblockhashandindex)
|
|
27
|
-
- [Building](#building)
|
|
28
|
-
- [Build Javascript bindings (WASM)](#build-javascript-bindings-(wasm))
|
|
29
|
-
- [CMake Options](#cmake-options)
|
|
30
|
-
- [SSZ Types](#ssz-types)
|
|
31
|
-
- [Attestation](#attestation)
|
|
32
|
-
- [AttestationData](#attestationdata)
|
|
33
|
-
- [AttesterSlashing](#attesterslashing)
|
|
34
|
-
- [BeaconBlock](#beaconblock)
|
|
35
|
-
- [BeaconBlockBody](#beaconblockbody)
|
|
36
|
-
- [BeaconBlockHeader](#beaconblockheader)
|
|
37
|
-
- [BlockHashProof](#blockhashproof)
|
|
38
|
-
- [BlsToExecutionChange](#blstoexecutionchange)
|
|
39
|
-
- [C4Request](#c4request)
|
|
40
|
-
- [Checkpoint](#checkpoint)
|
|
41
|
-
- [Deposit](#deposit)
|
|
42
|
-
- [DepositData](#depositdata)
|
|
43
|
-
- [Eth1Data](#eth1data)
|
|
44
|
-
- [EthAccessListData](#ethaccesslistdata)
|
|
45
|
-
- [EthAccountProof](#ethaccountproof)
|
|
46
|
-
- [EthLogsBlock](#ethlogsblock)
|
|
47
|
-
- [EthLogsTx](#ethlogstx)
|
|
48
|
-
- [EthReceiptData](#ethreceiptdata)
|
|
49
|
-
- [EthReceiptDataLog](#ethreceiptdatalog)
|
|
50
|
-
- [EthReceiptProof](#ethreceiptproof)
|
|
51
|
-
- [EthStateProof](#ethstateproof)
|
|
52
|
-
- [EthStorageProof](#ethstorageproof)
|
|
53
|
-
- [EthTransactionProof](#ethtransactionproof)
|
|
54
|
-
- [EthTxData](#ethtxdata)
|
|
55
|
-
- [ExecutionPayload](#executionpayload)
|
|
56
|
-
- [ExecutionPayloadHeader](#executionpayloadheader)
|
|
57
|
-
- [ForkData](#forkdata)
|
|
58
|
-
- [IndexAttestation](#indexattestation)
|
|
59
|
-
- [LightClientHeader](#lightclientheader)
|
|
60
|
-
- [LightClientUpdate](#lightclientupdate)
|
|
61
|
-
- [ProposerSlashing](#proposerslashing)
|
|
62
|
-
- [SignedBeaconBlock](#signedbeaconblock)
|
|
63
|
-
- [SignedBeaconBlockheader](#signedbeaconblockheader)
|
|
64
|
-
- [SignedBlsToExecutionChange](#signedblstoexecutionchange)
|
|
65
|
-
- [SignedVoluntaryExit](#signedvoluntaryexit)
|
|
66
|
-
- [SigningData](#signingdata)
|
|
67
|
-
- [SyncAggregate](#syncaggregate)
|
|
68
|
-
- [SyncCommittee](#synccommittee)
|
|
69
|
-
- [VoluntaryExit](#voluntaryexit)
|
|
70
|
-
- [Withdrawal](#withdrawal)
|
|
71
|
-
- [License](#license)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
## Concept
|
|
75
|
-
|
|
76
|
-
```mermaid
|
|
77
|
-
flowchart
|
|
78
|
-
P[Proofer] --> V[Verifier]
|
|
79
|
-
V --> P
|
|
80
|
-
P -.-> RPC
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
The idea behind C4 is to create a ultra light client or better verifier which can be used in Websites, Mobile applications, but especially in embedded systems. The Proofer is a library which can used within you mobile app or in the backend to create Proof that the given data is valid. The Verifier is a library which can be used within the embedded system to verify this Proof.
|
|
84
|
-
|
|
85
|
-
The verifier itself is almost stateless and only needs to store the state of the sync committee, which changes every 27h. But with the latest sync committee the verifier is able to verify any proof with the signatures matching the previously verified public keys of the sync committee.
|
|
86
|
-
This allows independent Verification and security on any devices without the need to process every blockheader (as light clients usually would do).
|
|
87
|
-
|
|
88
|
-
### Updating the sync committee
|
|
89
|
-
|
|
90
|
-
A Sync Committee holds 512 validators signing every block. Every 27h the validators are updated. Since the verifier is passive, it will not activly sync. So whenever a proof is presented requiring a newer sync committee than the last state, it will tell it as part of the response to the proofer. The Proofer will then fetch the LightClientUpdates from any Beacon Chain API and push them to the verifier along with the Proof-Request. The verifier will then verify the LightClientUpdates and update the sync committee stored.
|
|
91
|
-
|
|
92
|
-
The Data in the [LightClientUpdate](#lightclientupdate) is used to verify the transition between two periods of the SyncCommittee. This is done oin 2 Steps:
|
|
93
|
-
|
|
94
|
-
1. calculate the SigningRoot by calculating the hash_tree_root of the new validator pubkeys and following the merkle proof down to the blockBodyRoot hash adn finally the SigningRoot
|
|
95
|
-
2. verify the BLS signature against the Signing Root as message and the aggregated pubkey of the old sync committee
|
|
96
|
-
|
|
97
|
-
The following diagram shows the Structure of the Merkle Tree leading to the SigningRoot:
|
|
98
|
-
|
|
99
|
-
```mermaid
|
|
100
|
-
flowchart BT
|
|
101
|
-
|
|
102
|
-
classDef noBorder fill:none,stroke:none;
|
|
103
|
-
subgraph "header"
|
|
104
|
-
Slot
|
|
105
|
-
proposerIndex
|
|
106
|
-
parentRoot
|
|
107
|
-
stateRoot
|
|
108
|
-
bodyRoot
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
subgraph "SigningData"
|
|
112
|
-
blockheaderhash
|
|
113
|
-
Domain
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
subgraph "BeaconState"
|
|
117
|
-
beacon_mode(" ... ")
|
|
118
|
-
current_sync_committee
|
|
119
|
-
next_sync_committee
|
|
120
|
-
inactivity_scores
|
|
121
|
-
finalized_checkpoint
|
|
122
|
-
|
|
123
|
-
end
|
|
124
|
-
class beacon_mode noBorder
|
|
125
|
-
|
|
126
|
-
subgraph "SyncCommittee"
|
|
127
|
-
pubkeys
|
|
128
|
-
aggregate_pubkey
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
subgraph "ValidatorPubKeys"
|
|
132
|
-
Val1["Val 1"]
|
|
133
|
-
Val1_a["[0..31]"]
|
|
134
|
-
Val1_b["[32..64]"]
|
|
135
|
-
Val2["Val 2"]
|
|
136
|
-
Val2_a["[0..31]"]
|
|
137
|
-
Val2_b["[32..48]"]
|
|
138
|
-
val_mode(" ... ")
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
class val_mode noBorder
|
|
142
|
-
|
|
143
|
-
blockheaderhash --> SigningRoot
|
|
144
|
-
Domain --> SigningRoot
|
|
145
|
-
4{4} --> blockheaderhash
|
|
146
|
-
5{5} --> blockheaderhash
|
|
147
|
-
8{8} --> 4
|
|
148
|
-
9{9} --> 4
|
|
149
|
-
10{10} --> 5
|
|
150
|
-
11{11} --> 5
|
|
151
|
-
Slot --> 8
|
|
152
|
-
proposerIndex --> 8
|
|
153
|
-
parentRoot --> 9
|
|
154
|
-
stateRoot --> 9
|
|
155
|
-
bodyRoot --> 10
|
|
156
|
-
21{"zero"} --> 10
|
|
157
|
-
22{"zero"} --> 11
|
|
158
|
-
23{"zero"} --> 11
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
38{38} --> stateRoot
|
|
162
|
-
39{39} --> stateRoot
|
|
163
|
-
|
|
164
|
-
76{76} --> 38
|
|
165
|
-
77{77} --> 38
|
|
166
|
-
78{78} --> 39
|
|
167
|
-
79{79} --> 39
|
|
168
|
-
|
|
169
|
-
156{156} -->78
|
|
170
|
-
157{157} -->78
|
|
171
|
-
|
|
172
|
-
158("...") --> 79
|
|
173
|
-
|
|
174
|
-
314{314} --> 157
|
|
175
|
-
315{315} --> 157
|
|
176
|
-
|
|
177
|
-
finalized_checkpoint --> 314
|
|
178
|
-
inactivity_scores --> 314
|
|
179
|
-
current_sync_committee --> 315
|
|
180
|
-
next_sync_committee --> 315
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
pubkeys --> next_sync_committee
|
|
184
|
-
aggregate_pubkey --> next_sync_committee
|
|
185
|
-
|
|
186
|
-
2524{2524} --> pubkeys
|
|
187
|
-
2525{2525} --> pubkeys
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
5048{5048} --> 2524
|
|
191
|
-
5049{5049} --> 2524
|
|
192
|
-
10096{10096} --> 5048
|
|
193
|
-
10097{10097} --> 5048
|
|
194
|
-
20192{20192} --> 10096
|
|
195
|
-
20193{20193} --> 10096
|
|
196
|
-
40384{40384} --> 20192
|
|
197
|
-
40385{40385} --> 20192
|
|
198
|
-
80768{80768} --> 40384
|
|
199
|
-
80769{80769} --> 40384
|
|
200
|
-
161536{161536} --> 80768
|
|
201
|
-
161537{161537} --> 80768
|
|
202
|
-
323072{323072} --> 161536
|
|
203
|
-
323073{323073} --> 161536
|
|
204
|
-
Val1 --> 323072
|
|
205
|
-
Val2 --> 323072
|
|
206
|
-
|
|
207
|
-
Val1_a --> Val1
|
|
208
|
-
Val1_b --> Val1
|
|
209
|
-
Val2_a --> Val2
|
|
210
|
-
Val2_b --> Val2
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
class 158 noBorder
|
|
214
|
-
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
In order to validate, we need to calculate
|
|
218
|
-
- 512 x sha256 for each pubkey
|
|
219
|
-
- 512 x sha256 merkle proof for the pubkeys
|
|
220
|
-
- 2 x sha256 for the SyncCommittee
|
|
221
|
-
- 5 x sha256 for the stateRoot
|
|
222
|
-
- 3 x sha256 for the blockheader hash
|
|
223
|
-
- 1 x for the SigningRoot
|
|
224
|
-
|
|
225
|
-
So in total, we need to verify 1035 hashes and 1 bls signature.
|
|
226
|
-
|
|
227
|
-
### Verifying Blockhashes
|
|
228
|
-
|
|
229
|
-
Blocks in the execution layer are always verified by the blocks in the consensus layer. Each BeaconBlock has a executionPayload which holds the data of the Block in the execution layer. So many information like transactions, blockNumber and blockHash can directly be verified with the beacon block, while others like the receipts or the stateRoot, still needs Patricia Merkle Proofs from the execution layer to be verified.
|
|
230
|
-
|
|
231
|
-
But the most ciritcal verification is checking that a BeaconBlock is valid. This is done by using the SyncCommittee, which holds 512 public keys of validators and change very period (about every 27 hours). Having the correct keys is critical to verify the blockhash.
|
|
232
|
-
Now the C4 Client is always trying to hold the SyncCommittees public keys up to date, having the latest sync committee so we can checking the aggregated BLS Signature of them to verify blockhashes.
|
|
233
|
-
|
|
234
|
-
But what happens, if you want to verify a blockhash of an older block, because you need an older transaction?
|
|
235
|
-
In this case the you can use a new BeaconState and and create a MerkleProof for the historical roots. Since this is a list, there is practiclly no limit ( https://ethereum.github.io/consensus-specs/specs/phase0/beacon-chain/#state-list-lengths HISTORICAL_ROOTS_LIMIT = 2 ** 40 = 52262 years).
|
|
236
|
-
Since the capella Fork the state contains the [HistoricalSuummary](https://ethereum.github.io/consensus-specs/specs/capella/beacon-chain/#historicalsummary) which holds all the bloclhashes and state roots, so you can create a proof for the historical roots.
|
|
237
|
-
Unfortunatly the current specification for the [Beacon API](https://ethereum.github.io/beacon-APIs/) does not support providing proofs for those data yet, but we are planning to create an EIP to change this.
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
### Merkle Proofs
|
|
242
|
-
|
|
243
|
-
The Proofs contain different types of Merkle Proofs.
|
|
244
|
-
|
|
245
|
-
#### Patricia Merkle Proof
|
|
246
|
-
|
|
247
|
-
The [Patricia Merkle Proof](https://github.com/corpus-core/c4/blob/main/src/util/ssz_merkle.c#L100) is a proof for a single leaf and used in the execution layer of ethereum for states of accounts and storage, transaction receipts and more. This is what you get when calling eth_getProof.
|
|
248
|
-
|
|
249
|
-
#### SSZ Merkle Proof
|
|
250
|
-
|
|
251
|
-
This Merkle trees are used withn the beacon chain. The Structure is based on the defition of the SSZ Types and allows to proof individual properties.
|
|
252
|
-
Another feature is the option to [proof multiple leafs](https://ethereum.org/de/developers/docs/data-structures-and-encoding/ssz/#multiproofs) at once which is used in different types of proofs in the c4 client.
|
|
253
|
-
|
|
254
|
-
All ssz proofs for single or multiple leafs are following the same structure:
|
|
255
|
-
|
|
256
|
-
- Only required node (32 bytess each) are added.
|
|
257
|
-
- The nodes are alwayys sorted by their [generalized index](https://ethereum.org/de/developers/docs/data-structures-and-encoding/ssz/#generalized-index) starting with highest number.
|
|
258
|
-
|
|
259
|
-
WHile a merkle proof for a single proof has always the same fixed size (which is equal to its depth), the size of a multi proof depends on the number of leafs and their position within the tree.
|
|
260
|
-
So in order to verify a multi proof, we first need to figure out which nodes ( represented by ther generalized index) are required. For example a multi proof for a small tree with 4 leafes, would end up with as empty list if you actually request all 4 leafes because there would be no nodes left to proof.
|
|
261
|
-
|
|
262
|
-
```c
|
|
263
|
-
// define a small tree with 3 leafes
|
|
264
|
-
ssz_def_t TEST_SUB[] = {
|
|
265
|
-
SSZ_UINT8("a"),
|
|
266
|
-
SSZ_UINT8("b"),
|
|
267
|
-
SSZ_UINT8("c"),
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
ssz_def_t TEST_ROOT[] = {
|
|
271
|
-
SSZ_UINT8("count"),
|
|
272
|
-
SSZ_CONTAINER("sub", TEST_SUB),
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
ssz_def_t TEST_TYPE_CONTAINER = SSZ_CONTAINER("TEST_ROOT", TEST_ROOT);
|
|
276
|
-
|
|
277
|
-
// create a container with the defined ssz type
|
|
278
|
-
uint8_t ssz_data[] = {1, 2, 3, 4}; // serialized data of the container
|
|
279
|
-
ssz_ob_t val = ssz_ob(TEST_TYPE_CONTAINER, bytes(ssz_data, 4));
|
|
280
|
-
|
|
281
|
-
// create a multi proof the properties count, a and b
|
|
282
|
-
bytes_t multi_proof = ssz_create_multi_proof(res, 3,
|
|
283
|
-
ssz_gindex(res.def, 1, "count"),
|
|
284
|
-
ssz_gindex(res.def, 2, "sub", "a"),
|
|
285
|
-
ssz_gindex(res.def, 2, "sub", "b")
|
|
286
|
-
);
|
|
287
|
-
|
|
288
|
-
// this proof has only one witness
|
|
289
|
-
|
|
290
|
-
// verify the proof
|
|
291
|
-
// create a leafes array for the required leafes
|
|
292
|
-
uint8_t leafes[96] = {0};
|
|
293
|
-
leafes[0] = 1; // count = 1
|
|
294
|
-
leafes[32] = 2; // a = 2
|
|
295
|
-
leafes[64] = 3; // b = 3
|
|
296
|
-
|
|
297
|
-
// define the gindexes of the required lproperties
|
|
298
|
-
gindex_t gindexes[] = {
|
|
299
|
-
ssz_gindex(res.def, 1, "count"),
|
|
300
|
-
ssz_gindex(res.def, 2, "sub", "a"),
|
|
301
|
-
ssz_gindex(res.def, 2, "sub", "b")};
|
|
302
|
-
|
|
303
|
-
// verify the proof and store the calculated root hash in proofed_root
|
|
304
|
-
bytes32_t proofed_root = {0};
|
|
305
|
-
ssz_verify_multi_merkle_proof(multi_proof, bytes(leafes, sizeof(leafes)), gindexes, proofed_root);
|
|
306
|
-
|
|
307
|
-
// now the root contains the root hash, which you can compare with the hash_tree_root of the container
|
|
308
|
-
bytes32_t root = {0};
|
|
309
|
-
ssz_hash_tree_root(val, root);
|
|
310
|
-
|
|
311
|
-
// assert
|
|
312
|
-
TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(root, proofed_root, 32, "root hash must be the same after merkle proof");
|
|
313
|
-
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
## RPC Proofs
|
|
318
|
-
|
|
319
|
-
All requests send to the verifier are encoded using SSZ. The request itself is sepcified by the [C4Request](#c4request) type. This objects suports different types as data or proofs.
|
|
320
|
-
|
|
321
|
-
In order to proof the RPC-Request, the proofer will use different proofs.
|
|
322
|
-
|
|
323
|
-
### eth_getBalance
|
|
324
|
-
|
|
325
|
-
- Data: Bytes32
|
|
326
|
-
- Proof: [EthAccountProof](#ethaccountproof)
|
|
327
|
-
|
|
328
|
-
### eth_getCode
|
|
329
|
-
|
|
330
|
-
- Data: Bytes
|
|
331
|
-
- Proof: [EthAccountProof](#ethaccountproof)
|
|
332
|
-
|
|
333
|
-
### eth_getNonce
|
|
334
|
-
|
|
335
|
-
- Data: Bytes32
|
|
336
|
-
- Proof: [EthAccountProof](#ethaccountproof)
|
|
337
|
-
|
|
338
|
-
### eth_getProof
|
|
339
|
-
|
|
340
|
-
not implemented yet
|
|
341
|
-
|
|
342
|
-
### eth_getStorageAt
|
|
343
|
-
|
|
344
|
-
not implemented yet
|
|
345
|
-
|
|
346
|
-
### eth_getTransactionReceipt
|
|
347
|
-
|
|
348
|
-
- Data: [EthReceiptData](#ethreceiptdata)
|
|
349
|
-
- Proof: [EthReceiptProof](#ethreceiptproof)
|
|
350
|
-
|
|
351
|
-
### eth_getTransactionByHash
|
|
352
|
-
|
|
353
|
-
- Data: [EthTransactionData](#ethtransactiondata)
|
|
354
|
-
- Proof: [EthTransactionProof](#ethtransactionproof)
|
|
355
|
-
|
|
356
|
-
### eth_getTransactionByBlockHashAndIndex
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
- Data: [EthTransactionData](#ethtransactiondata)
|
|
360
|
-
- Proof: [EthTransactionProof](#ethtransactionproof)
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
## Building
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
```sh
|
|
370
|
-
#clone
|
|
371
|
-
git clone https://github.com/colibri-labs/c4.git
|
|
372
|
-
cd c4
|
|
373
|
-
|
|
374
|
-
#build
|
|
375
|
-
mkdir build
|
|
376
|
-
cd build
|
|
377
|
-
cmake -DCMAKE_BUILD_TYPE=Debug ..
|
|
378
|
-
make
|
|
379
|
-
|
|
380
|
-
#run
|
|
381
|
-
bin/verify ../test/data/proof_data.ssz
|
|
382
|
-
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
### Build Javascript bindings (WASM)
|
|
386
|
-
|
|
387
|
-
In order to build the Javascript bindings, you need to have [emscripten installed](https://emscripten.org/docs/getting_started/downloads.html).
|
|
388
|
-
|
|
389
|
-
```sh
|
|
390
|
-
cd build
|
|
391
|
-
emcmake cmake -DWASM=true -DCURL=false ..
|
|
392
|
-
make
|
|
393
|
-
```
|
|
394
|
-
The js-module will be in the `build/emscripten` folder.
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
### CMake Options
|
|
398
|
-
|
|
399
|
-
- **-DBLS_DESERIALIZE**: if true bls keys will be stored deserialized, which increases the state per sync committee period from 25kB to 50kB, but make verification 5x faster
|
|
400
|
-
Default: ON
|
|
401
|
-
Usage: `cmake -DBLS_DESERIALIZE=ON` ..
|
|
402
|
-
|
|
403
|
-
- **-DCLI**: generates the CLI tools.
|
|
404
|
-
Default: ON
|
|
405
|
-
Usage: `cmake -DCLI=ON` ..
|
|
406
|
-
|
|
407
|
-
- **-DCMAKE_BUILD_TYPE**: Build type
|
|
408
|
-
Default: Release
|
|
409
|
-
Options: Debug, Release, RelWithDebInfo, MinSizeRel
|
|
410
|
-
Usage: `cmake -DCMAKE_BUILD_TYPE=Release` ..
|
|
411
|
-
|
|
412
|
-
- **-DCOVERAGE**: if true the coverage will be build
|
|
413
|
-
Default: OFF
|
|
414
|
-
Usage: `cmake -DCOVERAGE=OFF` ..
|
|
415
|
-
|
|
416
|
-
- **-DCURL**: if true curl will be used as transport
|
|
417
|
-
Default: ON
|
|
418
|
-
Usage: `cmake -DCURL=ON` ..
|
|
419
|
-
|
|
420
|
-
- **-DFILE_STORAGE**: if activated the verfifier will use a simple file-implementaion to store states in the current folder or in a folder specified by the env varC4_STATE_DIR
|
|
421
|
-
Default: ON
|
|
422
|
-
Usage: `cmake -DFILE_STORAGE=ON` ..
|
|
423
|
-
|
|
424
|
-
- **-DMESSAGES**: if activated the binaries will contain error messages, but for embedded systems this is not needed and can be turned off to save memory
|
|
425
|
-
Default: ON
|
|
426
|
-
Usage: `cmake -DMESSAGES=ON` ..
|
|
427
|
-
|
|
428
|
-
- **-DPRECOMPILE_ZERO_HASHES**: if activated zero hashes are cached which costs up to 1kb in RAM, but are needed in order to calc BeaconBodys in the proofer, but not in the verfier
|
|
429
|
-
Default: ON
|
|
430
|
-
Usage: `cmake -DPRECOMPILE_ZERO_HASHES=ON` ..
|
|
431
|
-
|
|
432
|
-
- **-DSHAREDLIB**: if true the shared library will be build
|
|
433
|
-
Default: OFF
|
|
434
|
-
Usage: `cmake -DSHAREDLIB=OFF` ..
|
|
435
|
-
|
|
436
|
-
- **-DTEST**: if true the test will be build
|
|
437
|
-
Default: OFF
|
|
438
|
-
Usage: `cmake -DTEST=OFF` ..
|
|
439
|
-
|
|
440
|
-
- **-DWASM**: if true the wasm will be build
|
|
441
|
-
Default: OFF
|
|
442
|
-
Usage: `cmake -DWASM=OFF` ..
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
## SSZ Types
|
|
446
|
-
|
|
447
|
-
### Attestation
|
|
448
|
-
|
|
449
|
-
an attestation is a list of aggregation bits, a data and a signature
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L66).
|
|
453
|
-
|
|
454
|
-
```python
|
|
455
|
-
class Attestation(Container):
|
|
456
|
-
aggregationBits: BitList [2048]
|
|
457
|
-
data : AttestationData
|
|
458
|
-
signature : ByteVector [96]
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### AttestationData
|
|
462
|
-
|
|
463
|
-
the data of an attestation
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L25).
|
|
467
|
-
|
|
468
|
-
```python
|
|
469
|
-
class AttestationData(Container):
|
|
470
|
-
slot : Uint64 # the slot of the attestation
|
|
471
|
-
index : Uint64 # the index of the attestation
|
|
472
|
-
beaconBlockRoot: Bytes32 # the root of the beacon block
|
|
473
|
-
source : Checkpoint # the source of the attestation
|
|
474
|
-
target : Checkpoint # the target of the attestation
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
### AttesterSlashing
|
|
478
|
-
|
|
479
|
-
an attester slashing is a list of two index attestations
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L53).
|
|
483
|
-
|
|
484
|
-
```python
|
|
485
|
-
class AttesterSlashing(Container):
|
|
486
|
-
signedHeader1: IndexAttestation
|
|
487
|
-
signedHeader2: IndexAttestation
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
### BeaconBlock
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L158).
|
|
494
|
-
|
|
495
|
-
```python
|
|
496
|
-
class BeaconBlock(Container):
|
|
497
|
-
slot : Uint64 # the slot of the block or blocknumber
|
|
498
|
-
proposerIndex: Uint64 # the index of the validator proposing the block
|
|
499
|
-
parentRoot : Bytes32 # the hash_tree_root of the parent block header
|
|
500
|
-
stateRoot : Bytes32 # the hash_tree_root of the state at the end of the block
|
|
501
|
-
body : BeaconBlockBody
|
|
502
|
-
```
|
|
503
|
-
|
|
504
|
-
### BeaconBlockBody
|
|
505
|
-
|
|
506
|
-
const ssz_def_t ssz_bls_pubky[] = {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L143).
|
|
510
|
-
|
|
511
|
-
```python
|
|
512
|
-
class BeaconBlockBody(Container):
|
|
513
|
-
randaoReveal : ByteVector [96]
|
|
514
|
-
eth1Data : Eth1Data
|
|
515
|
-
graffiti : Bytes32
|
|
516
|
-
proposerSlashings : List [ProposerSlashing, MAX_PROPOSER_SLASHINGS]
|
|
517
|
-
attesterSlashings : List [AttesterSlashing, MAX_ATTESTER_SLASHINGS]
|
|
518
|
-
attestations : List [Attestation, MAX_ATTESTATIONS]
|
|
519
|
-
deposits : List [Deposit, MAX_DEPOSITS]
|
|
520
|
-
voluntaryExits : List [SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]
|
|
521
|
-
syncAggregate : SyncAggregate
|
|
522
|
-
executionPayload : ExecutionPayload
|
|
523
|
-
blsToExecutionChanges: List [SignedBlsToExecutionChange, MAX_BLS_TO_EXECUTION_CHANGES]
|
|
524
|
-
blobKzgCommitments : List [blsPubky, 4096]
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### BeaconBlockHeader
|
|
528
|
-
|
|
529
|
-
the header of a beacon block
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
The Type is defined in [verifier/types_beacon.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_beacon.c#L8).
|
|
533
|
-
|
|
534
|
-
```python
|
|
535
|
-
class BeaconBlockHeader(Container):
|
|
536
|
-
slot : Uint64 # the slot of the block or blocknumber
|
|
537
|
-
proposerIndex: Uint64 # the index of the validator proposing the block
|
|
538
|
-
parentRoot : Bytes32 # the hash_tree_root of the parent block header
|
|
539
|
-
stateRoot : Bytes32 # the hash_tree_root of the state at the end of the block
|
|
540
|
-
bodyRoot : Bytes32 # the hash_tree_root of the block body
|
|
541
|
-
```
|
|
542
|
-
|
|
543
|
-
### BlockHashProof
|
|
544
|
-
|
|
545
|
-
the block hash proof is used as part of different other types since it contains all relevant
|
|
546
|
-
proofs to validate the blockhash of the execution layer
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L12).
|
|
550
|
-
|
|
551
|
-
```python
|
|
552
|
-
class BlockHashProof(Container):
|
|
553
|
-
blockhash_proof : List [bytes32, 256] # the merkle prooof from the executionPayload.blockhash down to the blockBodyRoot hash
|
|
554
|
-
header : BeaconBlockHeader # the header of the beacon block
|
|
555
|
-
sync_committee_bits : BitVector [512] # the bits of the validators that signed the block
|
|
556
|
-
sync_committee_signature: ByteVector [96] # the signature of the sync committee
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
### BlsToExecutionChange
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L123).
|
|
563
|
-
|
|
564
|
-
```python
|
|
565
|
-
class BlsToExecutionChange(Container):
|
|
566
|
-
validatorIndex : Uint64
|
|
567
|
-
fromBlsPubkey : ByteVector [48]
|
|
568
|
-
toExecutionAddress: Address
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
### C4Request
|
|
572
|
-
|
|
573
|
-
the main container defining the incoming data processed by the verifier
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L283).
|
|
577
|
-
|
|
578
|
-
```python
|
|
579
|
-
class C4Request(Container):
|
|
580
|
-
data : Union[ # the data to proof
|
|
581
|
-
None,
|
|
582
|
-
Bytes32 # the blochash which is used for blockhash proof,
|
|
583
|
-
Bytes32 # the balance of an account,
|
|
584
|
-
EthTxData # the transaction data,
|
|
585
|
-
EthReceiptData # the transaction receipt,
|
|
586
|
-
List [EthReceiptDataLog, 1024] # result of eth_getLogs
|
|
587
|
-
]
|
|
588
|
-
proof : Union[ # the proof of the data
|
|
589
|
-
None,
|
|
590
|
-
BlockHashProof,
|
|
591
|
-
EthAccountProof,
|
|
592
|
-
EthTransactionProof,
|
|
593
|
-
EthReceiptProof # a Proof of a TransactionReceipt,
|
|
594
|
-
List [EthLogsBlock, 256] # a Proof for multiple Receipts and txs
|
|
595
|
-
]
|
|
596
|
-
sync_data: Union[ # the sync data containing proofs for the transition between the two periods
|
|
597
|
-
None,
|
|
598
|
-
List [LightClientUpdate, 512] # this light client update can be fetched directly from the beacon chain API
|
|
599
|
-
]
|
|
600
|
-
```
|
|
601
|
-
|
|
602
|
-
### Checkpoint
|
|
603
|
-
|
|
604
|
-
a checkpoint is a tuple of epoch and root
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L19).
|
|
608
|
-
|
|
609
|
-
```python
|
|
610
|
-
class Checkpoint(Container):
|
|
611
|
-
epoch: Uint64 # the epoch of the checkpoint
|
|
612
|
-
root : Bytes32 # the root of the checkpoint
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
### Deposit
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L79).
|
|
619
|
-
|
|
620
|
-
```python
|
|
621
|
-
class Deposit(Container):
|
|
622
|
-
proof: Vector [bytes32, 33]
|
|
623
|
-
data : DepositData
|
|
624
|
-
```
|
|
625
|
-
|
|
626
|
-
### DepositData
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L72).
|
|
630
|
-
|
|
631
|
-
```python
|
|
632
|
-
class DepositData(Container):
|
|
633
|
-
pubkey : ByteVector [48]
|
|
634
|
-
withdrawalCredentials: Bytes32
|
|
635
|
-
amount : Uint64
|
|
636
|
-
signature : ByteVector [96]
|
|
637
|
-
```
|
|
638
|
-
|
|
639
|
-
### Eth1Data
|
|
640
|
-
|
|
641
|
-
the eth1 data is a deposit root, a deposit count and a block hash
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L59).
|
|
645
|
-
|
|
646
|
-
```python
|
|
647
|
-
class Eth1Data(Container):
|
|
648
|
-
depositRoot : Bytes32
|
|
649
|
-
depositCount: Uint64
|
|
650
|
-
blockHash : Bytes32
|
|
651
|
-
```
|
|
652
|
-
|
|
653
|
-
### EthAccessListData
|
|
654
|
-
|
|
655
|
-
Entry in thr access list
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L38).
|
|
659
|
-
|
|
660
|
-
```python
|
|
661
|
-
class EthAccessListData(Container):
|
|
662
|
-
address : Address
|
|
663
|
-
storageKeys: List [bytes32, 256]
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
### EthAccountProof
|
|
667
|
-
|
|
668
|
-
1. **Patricia Merkle Proof** for the Account Object in the execution layer (balance, nonce, codeHash, storageHash) and the storage values with its own Proofs. (using eth_getProof): Result StateRoot
|
|
669
|
-
2. **State Proof** is a SSZ Merkle Proof from the StateRoot to the ExecutionPayload over the BeaconBlockBody to its root hash which is part of the header.
|
|
670
|
-
3. **BeaconBlockHeader** is passed because also need the slot in order to find out which period and which sync committee is used.
|
|
671
|
-
4. **Signature of the SyncCommittee** (taken from the following block) is used to verify the SignData where the blockhash is part of the message and the Domain is calculated from the fork and the Genesis Validator Root.
|
|
672
|
-
```mermaid
|
|
673
|
-
flowchart TB
|
|
674
|
-
subgraph "ExecutionLayer"
|
|
675
|
-
class ExecutionLayer transparent
|
|
676
|
-
subgraph "Account"
|
|
677
|
-
balance --> account
|
|
678
|
-
nonce --> account
|
|
679
|
-
codeHash --> account
|
|
680
|
-
storageHash --> account
|
|
681
|
-
end
|
|
682
|
-
subgraph "Storage"
|
|
683
|
-
key1 --..PM..-->storageHash
|
|
684
|
-
key2 --..PM..-->storageHash
|
|
685
|
-
key3 --..PM..-->storageHash
|
|
686
|
-
end
|
|
687
|
-
end
|
|
688
|
-
subgraph "ConsensusLayer"
|
|
689
|
-
subgraph "ExecutionPayload"
|
|
690
|
-
account --..PM..--> stateRoot
|
|
691
|
-
end
|
|
692
|
-
subgraph "BeaconBlockBody"
|
|
693
|
-
stateRoot --SSZ D:5--> executionPayload
|
|
694
|
-
m[".."]
|
|
695
|
-
end
|
|
696
|
-
subgraph "BeaconBlockHeader"
|
|
697
|
-
slot
|
|
698
|
-
proposerIndex
|
|
699
|
-
parentRoot
|
|
700
|
-
s[stateRoot]
|
|
701
|
-
executionPayload --SSZ D:4--> bodyRoot
|
|
702
|
-
end
|
|
703
|
-
end
|
|
704
|
-
```
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L245).
|
|
708
|
-
|
|
709
|
-
```python
|
|
710
|
-
class EthAccountProof(Container):
|
|
711
|
-
accountProof: List [bytes_1024, 256] # Patricia merkle proof
|
|
712
|
-
address : Address # the address of the account
|
|
713
|
-
balance : Bytes32 # the balance of the account
|
|
714
|
-
codeHash : Bytes32 # the code hash of the account
|
|
715
|
-
nonce : Bytes32 # the nonce of the account
|
|
716
|
-
storageHash : Bytes32 # the storage hash of the account
|
|
717
|
-
storageProof: List [EthStorageProof, 256] # the storage proofs of the selected
|
|
718
|
-
state_proof : EthStateProof # the state proof of the account
|
|
719
|
-
```
|
|
720
|
-
|
|
721
|
-
### EthLogsBlock
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L149).
|
|
725
|
-
|
|
726
|
-
```python
|
|
727
|
-
class EthLogsBlock(Container):
|
|
728
|
-
blockNumber : Uint64 # the number of the execution block containing the transaction
|
|
729
|
-
blockHash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
730
|
-
proof : List [bytes32, 64] # the multi proof of the transaction, receipt_root,blockNumber and blockHash
|
|
731
|
-
header : BeaconBlockHeader # the header of the beacon block
|
|
732
|
-
sync_committee_bits : BitVector [512] # the bits of the validators that signed the block
|
|
733
|
-
sync_committee_signature: ByteVector [96] # the signature of the sync committee
|
|
734
|
-
txs : List [EthLogsTx, 256] # the transactions of the block
|
|
735
|
-
```
|
|
736
|
-
|
|
737
|
-
### EthLogsTx
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L142).
|
|
741
|
-
|
|
742
|
-
```python
|
|
743
|
-
class EthLogsTx(Container):
|
|
744
|
-
transaction : Bytes[1073741824] # the raw transaction payload
|
|
745
|
-
transactionIndex: Uint32 # the index of the transaction in the block
|
|
746
|
-
proof : List [bytes_1024, 64] # the Merklr Patricia Proof of the transaction receipt ending in the receipt root
|
|
747
|
-
```
|
|
748
|
-
|
|
749
|
-
### EthReceiptData
|
|
750
|
-
|
|
751
|
-
the transaction data
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L83).
|
|
755
|
-
|
|
756
|
-
```python
|
|
757
|
-
class EthReceiptData(Container):
|
|
758
|
-
blockHash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
759
|
-
blockNumber : Uint64 # the number of the execution block containing the transaction
|
|
760
|
-
transactionHash : Bytes32 # the hash of the transaction
|
|
761
|
-
transactionIndex : Uint32 # the index of the transaction in the block
|
|
762
|
-
type : Uint8 # the type of the transaction
|
|
763
|
-
from : Address # the sender of the transaction
|
|
764
|
-
to : Bytes[20] # the target of the transaction
|
|
765
|
-
cumulativeGasUsed: Uint64 # the cumulative gas used
|
|
766
|
-
gasUsed : Uint64 # the gas address of the created contract
|
|
767
|
-
logs : List [EthReceiptDataLog, 256] # the logs of the transaction
|
|
768
|
-
logsBloom : ByteVector [256] # the bloom filter of the logs
|
|
769
|
-
status : Uint8 # the status of the transaction
|
|
770
|
-
effectiveGasPrice: Uint64 # the effective gas price of the transaction
|
|
771
|
-
```
|
|
772
|
-
|
|
773
|
-
### EthReceiptDataLog
|
|
774
|
-
|
|
775
|
-
a log entry in the receipt
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L69).
|
|
779
|
-
|
|
780
|
-
```python
|
|
781
|
-
class EthReceiptDataLog(Container):
|
|
782
|
-
blockHash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
783
|
-
blockNumber : Uint64 # the number of the execution block containing the transaction
|
|
784
|
-
transactionHash : Bytes32 # the hash of the transaction
|
|
785
|
-
transactionIndex: Uint32 # the index of the transaction in the block
|
|
786
|
-
address : Address # the address of the log
|
|
787
|
-
logIndex : Uint32 # the index of the log in the transaction
|
|
788
|
-
removed : Boolean # whether the log was removed
|
|
789
|
-
topics : List [bytes32, 8] # the topics of the log
|
|
790
|
-
data : Bytes[1073741824] # the data of the log
|
|
791
|
-
```
|
|
792
|
-
|
|
793
|
-
### EthReceiptProof
|
|
794
|
-
|
|
795
|
-
the gasPrice of the transaction
|
|
796
|
-
represents the proof for a transaction receipt
|
|
797
|
-
1. All Receipts of the execution blocks are serialized into a Patricia Merkle Trie and the merkle proof is created for the requested receipt.
|
|
798
|
-
2. The **payload of the transaction** is used to create its SSZ Hash Tree Root from the BeaconBlock. This is needed in order to verify that the receipt actually belongs to the given transactionhash.
|
|
799
|
-
3. The **SSZ Multi Merkle Proof** from the Transactions, Receipts, BlockNumber and BlockHash of the ExecutionPayload to the BlockBodyRoot. (Total Depth: 29)
|
|
800
|
-
4. **BeaconBlockHeader** is passed because also need the slot in order to find out which period and which sync committee is used.
|
|
801
|
-
5. **Signature of the SyncCommittee** (taken from the following block) is used to verify the SignData where the blockhash is part of the message and the Domain is calculated from the fork and the Genesis Validator Root.
|
|
802
|
-
```mermaid
|
|
803
|
-
flowchart TB
|
|
804
|
-
subgraph "ExecutionPayload"
|
|
805
|
-
transactions
|
|
806
|
-
receipts
|
|
807
|
-
blockNumber
|
|
808
|
-
blockHash
|
|
809
|
-
end
|
|
810
|
-
Receipt --PM--> receipts
|
|
811
|
-
TX --SSZ D:21--> transactions
|
|
812
|
-
subgraph "BeaconBlockBody"
|
|
813
|
-
transactions --SSZ D:5--> executionPayload
|
|
814
|
-
blockNumber --SSZ D:5--> executionPayload
|
|
815
|
-
blockHash --SSZ D:5--> executionPayload
|
|
816
|
-
m[".."]
|
|
817
|
-
end
|
|
818
|
-
subgraph "BeaconBlockHeader"
|
|
819
|
-
slot
|
|
820
|
-
proposerIndex
|
|
821
|
-
parentRoot
|
|
822
|
-
s[stateRoot]
|
|
823
|
-
executionPayload --SSZ D:4--> bodyRoot
|
|
824
|
-
end
|
|
825
|
-
```
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L131).
|
|
829
|
-
|
|
830
|
-
```python
|
|
831
|
-
class EthReceiptProof(Container):
|
|
832
|
-
transaction : Bytes[1073741824] # the raw transaction payload
|
|
833
|
-
transactionIndex : Uint32 # the index of the transaction in the block
|
|
834
|
-
blockNumber : Uint64 # the number of the execution block containing the transaction
|
|
835
|
-
blockHash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
836
|
-
receipt_proof : List [bytes_1024, 64] # the Merklr Patricia Proof of the transaction receipt ending in the receipt root
|
|
837
|
-
block_proof : List [bytes32, 64] # the multi proof of the transaction, receipt_root,blockNumber and blockHash
|
|
838
|
-
header : BeaconBlockHeader # the header of the beacon block
|
|
839
|
-
sync_committee_bits : BitVector [512] # the bits of the validators that signed the block
|
|
840
|
-
sync_committee_signature: ByteVector [96] # the signature of the sync committee
|
|
841
|
-
```
|
|
842
|
-
|
|
843
|
-
### EthStateProof
|
|
844
|
-
|
|
845
|
-
the stateRoot proof is used as part of different other types since it contains all relevant
|
|
846
|
-
proofs to validate the stateRoot of the execution layer
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L20).
|
|
850
|
-
|
|
851
|
-
```python
|
|
852
|
-
class EthStateProof(Container):
|
|
853
|
-
state_proof : List [bytes32, 256] # the merkle prooof from the executionPayload.state down to the blockBodyRoot hash
|
|
854
|
-
header : BeaconBlockHeader # the header of the beacon block
|
|
855
|
-
sync_committee_bits : BitVector [512] # the bits of the validators that signed the block
|
|
856
|
-
sync_committee_signature: ByteVector [96] # the signature of the sync committee
|
|
857
|
-
```
|
|
858
|
-
|
|
859
|
-
### EthStorageProof
|
|
860
|
-
|
|
861
|
-
represents the storage proof of a key
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L29).
|
|
865
|
-
|
|
866
|
-
```python
|
|
867
|
-
class EthStorageProof(Container):
|
|
868
|
-
key : Bytes32 # the key to be proven
|
|
869
|
-
proof: List [bytes_1024, 5] # Patricia merkle proof
|
|
870
|
-
value: Bytes32
|
|
871
|
-
```
|
|
872
|
-
|
|
873
|
-
### EthTransactionProof
|
|
874
|
-
|
|
875
|
-
represents the account and storage values, including the Merkle proof, of the specified account.
|
|
876
|
-
1. The **payload of the transaction** is used to create its SSZ Hash Tree Root.
|
|
877
|
-
2. The **SSZ Merkle Proof** from the Transactions of the ExecutionPayload to the BlockBodyRoot. (Total Depth: 29)
|
|
878
|
-
3. **BeaconBlockHeader** is passed because also need the slot in order to find out which period and which sync committee is used.
|
|
879
|
-
4. **Signature of the SyncCommittee** (taken from the following block) is used to verify the SignData where the blockhash is part of the message and the Domain is calculated from the fork and the Genesis Validator Root.
|
|
880
|
-
```mermaid
|
|
881
|
-
flowchart TB
|
|
882
|
-
subgraph "ExecutionPayload"
|
|
883
|
-
transactions
|
|
884
|
-
blockNumber
|
|
885
|
-
blockHash
|
|
886
|
-
end
|
|
887
|
-
TX --SSZ D:21--> transactions
|
|
888
|
-
subgraph "BeaconBlockBody"
|
|
889
|
-
transactions --SSZ D:5--> executionPayload
|
|
890
|
-
blockNumber --SSZ D:5--> executionPayload
|
|
891
|
-
blockHash --SSZ D:5--> executionPayload
|
|
892
|
-
m[".."]
|
|
893
|
-
end
|
|
894
|
-
subgraph "BeaconBlockHeader"
|
|
895
|
-
slot
|
|
896
|
-
proposerIndex
|
|
897
|
-
parentRoot
|
|
898
|
-
s[stateRoot]
|
|
899
|
-
executionPayload --SSZ D:4--> bodyRoot
|
|
900
|
-
end
|
|
901
|
-
```
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L189).
|
|
905
|
-
|
|
906
|
-
```python
|
|
907
|
-
class EthTransactionProof(Container):
|
|
908
|
-
transaction : Bytes[1073741824] # the raw transaction payload
|
|
909
|
-
transactionIndex : Uint32 # the index of the transaction in the block
|
|
910
|
-
blockNumber : Uint64 # the number of the execution block containing the transaction
|
|
911
|
-
blockHash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
912
|
-
proof : List [bytes32, 64] # the multi proof of the transaction, blockNumber and blockHash
|
|
913
|
-
header : BeaconBlockHeader # the header of the beacon block
|
|
914
|
-
sync_committee_bits : BitVector [512] # the bits of the validators that signed the block
|
|
915
|
-
sync_committee_signature: ByteVector [96] # the signature of the sync committee
|
|
916
|
-
```
|
|
917
|
-
|
|
918
|
-
### EthTxData
|
|
919
|
-
|
|
920
|
-
the transaction data
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
The Type is defined in [verifier/types_verify.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_verify.c#L45).
|
|
924
|
-
|
|
925
|
-
```python
|
|
926
|
-
class EthTxData(Container):
|
|
927
|
-
blockHash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
928
|
-
blockNumber : Uint64 # the number of the execution block containing the transaction
|
|
929
|
-
hash : Bytes32 # the blockHash of the execution block containing the transaction
|
|
930
|
-
transactionIndex : Uint32 # the index of the transaction in the block
|
|
931
|
-
type : Uint8 # the type of the transaction
|
|
932
|
-
nonce : Uint64 # the gasPrice of the transaction
|
|
933
|
-
input : Bytes[1073741824] # the raw transaction payload
|
|
934
|
-
r : Bytes32 # the r value of the transaction
|
|
935
|
-
s : Bytes32 # the s value of the transaction
|
|
936
|
-
chainId : Uint32 # the s value of the transaction
|
|
937
|
-
v : Uint8 # the v value of the transaction
|
|
938
|
-
gas : Uint64 # the gas limnit
|
|
939
|
-
from : Address # the sender of the transaction
|
|
940
|
-
to : Bytes[20] # the target of the transaction
|
|
941
|
-
value : Uint256 # the value of the transaction
|
|
942
|
-
gasPrice : Uint64
|
|
943
|
-
maxFeePerGas : Uint64
|
|
944
|
-
maxPriorityFeePerGas: Uint64
|
|
945
|
-
accessList : List [EthAccessListData, 256]
|
|
946
|
-
blobVersionedHashes : List [bytes32, 16]
|
|
947
|
-
yParity : Uint8 # the gasPrice of the transaction
|
|
948
|
-
```
|
|
949
|
-
|
|
950
|
-
### ExecutionPayload
|
|
951
|
-
|
|
952
|
-
the block header of the execution layer proved within the beacon block
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L104).
|
|
956
|
-
|
|
957
|
-
```python
|
|
958
|
-
class ExecutionPayload(Container):
|
|
959
|
-
parentHash : Bytes32 # the hash of the parent block
|
|
960
|
-
feeRecipient : Address # the address of the fee recipient
|
|
961
|
-
stateRoot : Bytes32 # the merkle root of the state at the end of the block
|
|
962
|
-
receiptsRoot : Bytes32 # the merkle root of the transactionreceipts
|
|
963
|
-
logsBloom : ByteVector [256] # the bloom filter of the logs
|
|
964
|
-
prevRandao : Bytes32 # the randao of the previous block
|
|
965
|
-
blockNumber : Uint64 # the block number
|
|
966
|
-
gasLimit : Uint64 # the gas limit of the block
|
|
967
|
-
gasUsed : Uint64 # the gas used of the block
|
|
968
|
-
timestamp : Uint64 # the timestamp of the block
|
|
969
|
-
extraData : Bytes[32] # the extra data of the block
|
|
970
|
-
baseFeePerGas: Uint256 # the base fee per gas of the block
|
|
971
|
-
blockHash : Bytes32 # the hash of the block
|
|
972
|
-
transactions : List [transactionsBytes, 1048576] # the list of transactions
|
|
973
|
-
withdrawals : List [Withdrawal, 16] # the list of withdrawels
|
|
974
|
-
blobGasUsed : Uint64 # the gas used for the blob transactions
|
|
975
|
-
excessBlobGas: Uint64 # the excess blob gas of the block
|
|
976
|
-
```
|
|
977
|
-
|
|
978
|
-
### ExecutionPayloadHeader
|
|
979
|
-
|
|
980
|
-
the block header of the execution layer proved within the beacon block
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
The Type is defined in [verifier/types_beacon.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_beacon.c#L23).
|
|
984
|
-
|
|
985
|
-
```python
|
|
986
|
-
class ExecutionPayloadHeader(Container):
|
|
987
|
-
parentHash : Bytes32 # the hash of the parent block
|
|
988
|
-
feeRecipient : Address # the address of the fee recipient
|
|
989
|
-
stateRoot : Bytes32 # the merkle root of the state at the end of the block
|
|
990
|
-
receiptsRoot : Bytes32 # the merkle root of the transactionreceipts
|
|
991
|
-
logsBloom : ByteVector [256] # the bloom filter of the logs
|
|
992
|
-
prevRandao : Bytes32 # the randao of the previous block
|
|
993
|
-
blockNumber : Uint64 # the block number
|
|
994
|
-
gasLimit : Uint64 # the gas limit of the block
|
|
995
|
-
gasUsed : Uint64 # the gas used of the block
|
|
996
|
-
timestamp : Uint64 # the timestamp of the block
|
|
997
|
-
extraData : Bytes[32] # the extra data of the block
|
|
998
|
-
baseFeePerGas : Uint256 # the base fee per gas of the block
|
|
999
|
-
blockHash : Bytes32 # the hash of the block
|
|
1000
|
-
transactionsRoot: Bytes32 # the merkle root of the transactions
|
|
1001
|
-
withdrawalsRoot : Bytes32 # the merkle root of the withdrawals
|
|
1002
|
-
blobGasUsed : Uint64 # the gas used for the blob transactions
|
|
1003
|
-
excessBlobGas : Uint64 # the excess blob gas of the block
|
|
1004
|
-
```
|
|
1005
|
-
|
|
1006
|
-
### ForkData
|
|
1007
|
-
|
|
1008
|
-
the fork data is used to create the domain
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
The Type is defined in [verifier/verify_blockhash_proof.c](https://github.com/corpus-core/c4/blob/main/src/verifier/verify_blockhash_proof.c#L24).
|
|
1012
|
-
|
|
1013
|
-
```python
|
|
1014
|
-
class ForkData(Container):
|
|
1015
|
-
version: ByteVector [4] # the version of the fork
|
|
1016
|
-
state : Bytes32 # the state of the Genisis Block
|
|
1017
|
-
```
|
|
1018
|
-
|
|
1019
|
-
### IndexAttestation
|
|
1020
|
-
|
|
1021
|
-
an index attestation is a list of attesting indices, a data and a signature
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L34).
|
|
1025
|
-
|
|
1026
|
-
```python
|
|
1027
|
-
class IndexAttestation(Container):
|
|
1028
|
-
attestingIndices: List [uint8, 2048] # the list of attesting indices
|
|
1029
|
-
data : AttestationData # the data of the attestation
|
|
1030
|
-
signature : ByteVector [96] # the BLS signature of the attestation
|
|
1031
|
-
```
|
|
1032
|
-
|
|
1033
|
-
### LightClientHeader
|
|
1034
|
-
|
|
1035
|
-
the header of the light client update
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
The Type is defined in [verifier/types_beacon.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_beacon.c#L48).
|
|
1039
|
-
|
|
1040
|
-
```python
|
|
1041
|
-
class LightClientHeader(Container):
|
|
1042
|
-
beacon : BeaconBlockHeader # the header of the beacon block
|
|
1043
|
-
execution : ExecutionPayloadHeader # the header of the execution layer proved within the beacon block
|
|
1044
|
-
executionBranch: Vector [bytes32, 4] # the merkle proof of the execution layer proved within the beacon block
|
|
1045
|
-
```
|
|
1046
|
-
|
|
1047
|
-
### LightClientUpdate
|
|
1048
|
-
|
|
1049
|
-
the light client update is used to verify the transition between two periods of the SyncCommittee.
|
|
1050
|
-
This data will be fetched directly through the beacon Chain API since it contains all required data.
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
The Type is defined in [verifier/types_beacon.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_beacon.c#L55).
|
|
1054
|
-
|
|
1055
|
-
```python
|
|
1056
|
-
class LightClientUpdate(Container):
|
|
1057
|
-
attestedHeader : LightClientHeader # the header of the beacon block attested by the sync committee
|
|
1058
|
-
nextSyncCommittee : SyncCommittee
|
|
1059
|
-
nextSyncCommitteeBranch: Vector [bytes32, 5] # will be 6 in electra
|
|
1060
|
-
finalizedHeader : LightClientHeader # the header of the finalized beacon block
|
|
1061
|
-
finalityBranch : Vector [bytes32, 6] # will be 7 in electra
|
|
1062
|
-
syncAggregate : SyncAggregate # the aggregates signature of the sync committee
|
|
1063
|
-
signatureSlot : Uint64 # the slot of the signature
|
|
1064
|
-
```
|
|
1065
|
-
|
|
1066
|
-
### ProposerSlashing
|
|
1067
|
-
|
|
1068
|
-
a proposer slashing is a list of two signed beacon block headers
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L47).
|
|
1072
|
-
|
|
1073
|
-
```python
|
|
1074
|
-
class ProposerSlashing(Container):
|
|
1075
|
-
signedHeader1: SignedBeaconBlockheader
|
|
1076
|
-
signedHeader2: SignedBeaconBlockheader
|
|
1077
|
-
```
|
|
1078
|
-
|
|
1079
|
-
### SignedBeaconBlock
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L165).
|
|
1083
|
-
|
|
1084
|
-
```python
|
|
1085
|
-
class SignedBeaconBlock(Container):
|
|
1086
|
-
message : BeaconBlock
|
|
1087
|
-
signature: ByteVector [96]
|
|
1088
|
-
```
|
|
1089
|
-
|
|
1090
|
-
### SignedBeaconBlockheader
|
|
1091
|
-
|
|
1092
|
-
a signed beacon block header is a beacon block header and a signature
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L41).
|
|
1096
|
-
|
|
1097
|
-
```python
|
|
1098
|
-
class SignedBeaconBlockheader(Container):
|
|
1099
|
-
message : BeaconBlockHeader # the beacon block header
|
|
1100
|
-
signature: ByteVector [96] # the BLS signature of the beacon block header
|
|
1101
|
-
```
|
|
1102
|
-
|
|
1103
|
-
### SignedBlsToExecutionChange
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L129).
|
|
1107
|
-
|
|
1108
|
-
```python
|
|
1109
|
-
class SignedBlsToExecutionChange(Container):
|
|
1110
|
-
message : BlsToExecutionChange
|
|
1111
|
-
signature: ByteVector [96]
|
|
1112
|
-
```
|
|
1113
|
-
|
|
1114
|
-
### SignedVoluntaryExit
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L89).
|
|
1118
|
-
|
|
1119
|
-
```python
|
|
1120
|
-
class SignedVoluntaryExit(Container):
|
|
1121
|
-
message : VoluntaryExit
|
|
1122
|
-
signature: ByteVector [96]
|
|
1123
|
-
```
|
|
1124
|
-
|
|
1125
|
-
### SigningData
|
|
1126
|
-
|
|
1127
|
-
combining the root with a domain to ensure uniqueness of the signing message
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
The Type is defined in [verifier/verify_blockhash_proof.c](https://github.com/corpus-core/c4/blob/main/src/verifier/verify_blockhash_proof.c#L17).
|
|
1131
|
-
|
|
1132
|
-
```python
|
|
1133
|
-
class SigningData(Container):
|
|
1134
|
-
root : Bytes32 # the hashed root of the data to sign
|
|
1135
|
-
domain: Bytes32 # the domain of the data to sign
|
|
1136
|
-
```
|
|
1137
|
-
|
|
1138
|
-
### SyncAggregate
|
|
1139
|
-
|
|
1140
|
-
the aggregates signature of the sync committee
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
The Type is defined in [verifier/types_beacon.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_beacon.c#L43).
|
|
1144
|
-
|
|
1145
|
-
```python
|
|
1146
|
-
class SyncAggregate(Container):
|
|
1147
|
-
syncCommitteeBits : BitVector [512] # the bits of the validators that signed the block (each bit represents a validator)
|
|
1148
|
-
syncCommitteeSignature: ByteVector [96] # the signature of the sync committee
|
|
1149
|
-
```
|
|
1150
|
-
|
|
1151
|
-
### SyncCommittee
|
|
1152
|
-
|
|
1153
|
-
the public keys sync committee used within a period ( about 27h)
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
The Type is defined in [verifier/types_beacon.c](https://github.com/corpus-core/c4/blob/main/src/verifier/types_beacon.c#L18).
|
|
1157
|
-
|
|
1158
|
-
```python
|
|
1159
|
-
class SyncCommittee(Container):
|
|
1160
|
-
pubkeys : Vector [blsPubky, 512] # the 512 pubkeys (each 48 bytes) of the validators in the sync committee
|
|
1161
|
-
aggregatePubkey: ByteVector [48] # the aggregate pubkey (48 bytes) of the sync committee
|
|
1162
|
-
```
|
|
1163
|
-
|
|
1164
|
-
### VoluntaryExit
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L84).
|
|
1168
|
-
|
|
1169
|
-
```python
|
|
1170
|
-
class VoluntaryExit(Container):
|
|
1171
|
-
epoch : Uint64
|
|
1172
|
-
validatorIndex: Uint64
|
|
1173
|
-
```
|
|
1174
|
-
|
|
1175
|
-
### Withdrawal
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
The Type is defined in [proofer/ssz_types.c](https://github.com/corpus-core/c4/blob/main/src/proofer/ssz_types.c#L94).
|
|
1179
|
-
|
|
1180
|
-
```python
|
|
1181
|
-
class Withdrawal(Container):
|
|
1182
|
-
index : Uint64
|
|
1183
|
-
validatorIndex: Uint64
|
|
1184
|
-
address : Address
|
|
1185
|
-
amount : Uint64
|
|
1186
|
-
```
|
|
1187
|
-
## License
|
|
1188
|
-
|
|
1189
|
-
MIT
|
package/c4_logo.png
DELETED
|
Binary file
|