Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation


LicenseLanguageBuild Status

Yu is a highly customizable blockchain framework.

Book
中文文档

🏢 Enterprise Users

🌟 Reddio

Blockchain Infrastructure Provider

🔬 AWresearch

Web3 Game platform chain

🤝 Partners

Axiom

Zeroknowledge Proving infrastructure

Overall Structure

image

Usage

typeExamplestruct {
*tripod.Tripod
}
// Here is a custom development of an Writingfunc (e*Example) Write(ctx*context.WriteContext) error {
caller:=ctx.GetCaller()
// set this Writing lei costctx.SetLei(100)
// Store data in on-chain state.e.Set([]byte("1"), []byte("yu"))
// Emit an event.ctx.EmitStringEvent(fmt.Printf("execute success, caller: %s", caller.String()))
returnnil
}
// Here is a custom development of a Readingfunc (e*Example) Read(ctx*context.ReadContext) {
key:=ctx.GetString("key")
value, err:=e.Get(key.Bytes())
iferr!=nil {
ctx.JsonOk(err)
return
}
ctx.String(string(value))
returnnil
}

Then, register your Writing and Reading and start with main.

funcNewExample() *Example {
tri:=tripod.NewTripod()
e:=&Example{tri}
e.SetWritings(e.Write)
e.SetReadings(e.Read)
returne
}
funcmain() {
yuCfg:=startup.InitDefaultKernelConfig()
poaConf:=poa.DefaultCfg(0)
startup.DefaultStartup(yuCfg, poa.NewPoa(poaConf), NewExample())
}

Build and Run

go build -o yu-example
./yu-example 

Introduction

By using Yu, you can customize three levels to develop your own blockchain. The Tripod is for developers to customize their own business.
First level is define Writing and Reading on chain.
Second level is define blockchain lifecycle. ( including customizable Consensus Algorithm )
Third level is define basic components, such as block data structures, blockchain, txdb, txpool.

  • Define your Writing and Reading on chain.
    Writing is State-Transition, like Transaction in Ethereum but not only for transfer of Token, it changes the state on the chain and must be consensus on all nodes.
    Reading is like query in Ethereum, it doesn't change state, just query some data from the chain.
    P2pHandler is a p2p server handler. You can define the services in P2P server. Just like TCP handler.
type (
Writingfunc(ctx*context.WriteContext) errorReadingfunc(ctx*context.ReadContext)
P2pHandlerfunc([]byte) ([]byte, error)
)
  • Define Your blockchain lifecycle, this function is in Tripod interface.
    CheckTxn defines the rules for checking transactions(Writings) before inserting txpool.
    VerifyBlock defines the rules for verifying blocks.
    InitChain defines business when the blockchain starts up. You should use it to define Genesis Block.
    StartBlock defines business when a new block starts. In this func, you can set some attributes (including pack txns from txpool, mining) in the block.
    EndBlock defines business when all nodes accept the new block, usually we execute the txns of new block and append block into the chain.
    FinalizeBlock defines business when the block is finalized in the chain by all nodes.
typeTripodinterface {
......CheckTxn(*txn.SignedTxn) errorVerifyBlock(block*types.Block) boolInitChain(genesisBlock*types.Block) StartBlock(block*types.Block) EndBlock(block*types.Block) FinalizeBlock(block*types.Block) }

Examples

Asset Tripod
Asset Tripod imitates an Asset function, it has transfer accounts, create accounts.
QueryBalance queries someone's account balance. It implements type func Reading.

func (a*Asset) QueryBalance(ctx*context.ReadContext) error {
account:=ctx.GetAddress("account")
if!a.existAccount(account) {
returnnil, AccountNotFound(account)
}
amount:=a.getBalance(account)
returnctx.Json(context.H{"amount": amount})
}

CreateAccount creates an account. It implements type func Writing.
EmitStringEvent will emit a string event out of the chain.
The error returned will emit out of the chain.

func (a*Asset) CreateAccount(ctx*context.WriteContext) error {
ctx.SetLei(100)
addr:=ctx.Calleramount:=big.NewInt(int64(ctx.GetUint64("amount")))
ifa.existAccount(addr) {
ctx.EmitStringEvent("Account Exists!")
returnnil
}
a.setBalance(addr, amount)
ctx.EmitStringEvent("Account Created Success!")
returnnil
}

We need use SetWritings and SetReadings to set Writing and Reading into Asset Tripod.
When we set a Writing, we need declare how much Lei(耜) it consumes. (Lei is the same as gas in ethereum )

funcNewAsset(tokenNamestring) *Asset {
df:=NewDefaultTripod("asset")
a:=&Asset{df, tokenName}
a.SetWritings(a.Transfer, a.CreateAccount)
a.SetReadings(a.QueryBalance)
returna
}

Poa Tripod
Consensus Tripod is necessary for a blockchain, so you have to choose or implement one consensus algorithm.
Poa Tripod implements a Proof of Authority consensus algorithm. For detailed implementation and usage information, see the PoA README.

Finally set Asset Tripod, Poa Tripod into land in main function.

funcmain() {
startup.InitConfigFromPath("yu_conf/kernel.toml")
startup.DefaultStartup(
poa.NewPoa(poaConf),
asset.NewAsset("YuCoin"),
)
}

About

Yu is a highly customizable modular blockchain framework.

Resources

Stars

96 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages