快速开始

安装

go get github.com/yu-org/yu

源代码地址:https://github.com/yu-org/yu/blob/main/apps/quickstart/chain.go

开发一个链上的 Writing 和 Reading

package main

import (
	"github.com/yu-org/yu/apps/poa"
	"github.com/yu-org/yu/core/context"
	"github.com/yu-org/yu/core/startup"
	"github.com/yu-org/yu/core/tripod"
	"net/http"
)

type QuickStart struct {
	*tripod.Tripod
}

func NewQuickStart() *QuickStart {
	tri := &QuickStart{
		tripod.NewTripod(),
	}
	// 此处需要手动将自定义的 Writing 注册到 tripod 中,
	tri.SetWritings(tri.WriteA)
	// 此处需要手动将自定义的 Reading 注册到 tripod 中
	tri.SetReadings(tri.ReadA)
	return tri
}

type WriteRequest struct {
	Key   string `json:"key"`
	Value string `json:"value"`
}

// 此处定制开发一个 Writing
// Writing会被全网节点共识并执行
func (q *QuickStart) WriteA(ctx *context.WriteContext) error {
	// 设置该 writing 所需消耗的lei (lei和gas同义)
	ctx.SetLei(100)
	// 解析请求体
	req := new(WriteRequest)
	err := ctx.BindJson(req)
	if err != nil {
		return err
	}
	// 将数据存入链上状态中。
	q.Set([]byte(req.Key), []byte(req.Value))
	// 向链外发射一个event
	ctx.EmitStringEvent("execute success")
	return nil
}

type ReadRequest struct {
	Key string `json:"key"`
}

type ReadResponse struct {
	Value string `json:"value"`
}

// 此处定制开发一个 Reading
func (q *QuickStart) ReadA(ctx *context.ReadContext) {
	req := new(ReadRequest)
	err := ctx.BindJson(req)
	if err != nil {
		ctx.Err(http.StatusBadRequest, err)
		return
	}
	value, err := q.Get([]byte(req.Key))
	if err != nil {
		ctx.ErrOk(err)
		return
	}
	ctx.JsonOk(ReadResponse{Value: string(value)})
}

// 在main函数中加载tripods并启动
func main() {
    // 启用poa tripod的默认配置
    poaCfg := poa.DefaultCfg(0)
    // 启用yu的默认配置
    yuCfg := startup.InitDefaultKernelConfig()

    poaTri := poa.NewPoa(poaCfg)
    qsTri := NewQuickStart()
	startup.InitDefaultKernel(yuCfg).
		WithTripods(poaTri, qsTri).
		Startup()
}

运行

go build -o yu-example

./yu-example 
 

至此,一条区块链便启动起来了。 后续可以加入更多区块链节点来构建区块链网络