See how a minor change to your commit message style can make you a better programmer.
Format: <type>(<scope>): <subject>
<scope> is optional
| package main | |
| import ( | |
| "fmt" | |
| "log" | |
| "net/http" | |
| ) | |
| func main() { | |
| http.Handle("/", http.FileServer(http.Dir("./public/"))) |
| // web framework | |
| app := echo.New() | |
| // middleware | |
| app.Use(middleware.Logger()) | |
| app.Use(middleware.Recover()) | |
| // service | |
| accountRepo := accountRepo.NewRepository(pgConn) | |
| as := accountService.NewAccountService(accountRepo) |
| pragma solidity ^0.7.0; | |
| // 這是一個叫做 Token 的合約 | |
| contract Token { | |
| // 貨幣的名稱叫做... | |
| string public name = "My Awesome Token"; | |
| // 貨幣的代號是... | |
| string public symbol = "MAT"; |
| const circomlib = require("circomlib"); | |
| const mimcsponge = circomlib.mimcsponge; | |
| export function MiMCSponge(left: string, right: string): string { | |
| return mimcsponge.multiHash([BigInt(left), BigInt(right)]).toString(); | |
| } | |
| export interface IMerkleTree { | |
| root: () => string; | |
| proof: (index: number) => { |
| // prover | |
| const levels = 2; | |
| const leaves = [10, 20 ,30 ,40]; | |
| const tree = new MerkleTree(levels, leaves); | |
| const index = 2; | |
| const proof = tree.proof(index); | |
| // verifier | |
| const root = "117086588437903260255921638146322982" | |
| console.log(verify(proof, root)); // true |
| proof = { | |
| root: "117086588437903260255921638146322982", | |
| pathElements: [ | |
| '40', | |
| '1978699832413026196628606142134435304247' | |
| ], | |
| pathIndices: [ 0, 1 ], | |
| leaf: '30' | |
| } |
| const circomlib = require("circomlib"); | |
| const mimcsponge = circomlib.mimcsponge; | |
| export function MiMCSponge(left: string, right: string): string { | |
| return mimcsponge.multiHash([BigInt(left), BigInt(right)]).toString(); | |
| } | |
| export interface IMerkleTree { | |
| root: () => string; | |
| proof: (index: number) => { | |
| root: string; | |
| pathElements: string[]; |
| ... | |
| proof(indexOfLeaf: number) { | |
| let pathElements: string[] = []; | |
| let pathIndices: number[] = []; | |
| const leaf = this.storage.get(MerkleTree.indexToKey(0, indexOfLeaf)); | |
| if (!leaf) throw new Error("leaf not found"); | |
| // store sibling into pathElements and target's indices into pathIndices | |
| const handleIndex = (level: number, currentIndex: number, siblingIndex: number) => { | |
| const siblingValue = this.storage.get(MerkleTree.indexToKey(level, siblingIndex)) || this.zeros[level]; | |
| pathElements.push(siblingValue); |
| contract WithoutZK { | |
| string greeting = "hello world"; | |
| uint256 answer = 1770; | |
| function greet() public view returns (string memory) { | |
| return greeting; | |
| } | |
| function _setGreeting(string memory _greeting) internal { | |
| greeting = _greeting; |