ibase

package
v0.0.0-...-5eebaeb Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 19, 2023 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

Package ibase 脚本指令集处理基础性支持。 提炼出公共的部分,供不同子包使用(而不会有循环依赖)。

Index

Constants

View Source
const (
	ScopeMax = 128 // 局部域大小
	StackMax = 256 // 数据栈大小
	GotoMax  = 3   // 跳转次数限额(包含)
	JumpMax  = 9   // 嵌入次数限额(包含)
	ExprEnd  = -1  // 表达式结束标志
)

基本限制配置。

View Source
const (
	StackFlag int = iota // 数据栈(默认)
	ArgsFlag             // 实参空间
	ScopeFlag            // 当前局部域
)

3个存值区标识值。

Variables

View Source
var (
	ErrToHere = errors.New(_T("执行流不可能抵达这里,请检查源码"))
)

Functions

func CheckAward

func CheckAward(h int) int

兑奖检查。 返回合法兑奖的数量(聪)。

func CheckSig

func CheckSig(ver int, pubkey PubKey, msg, sig []byte) bool

单签名验证。 ver 为版本值。便于安全升级。 当前采用ed25519签名认证。

func CheckSigs

func CheckSigs(ver int, pubkeys []PubKey, msg []byte, sigs [][]byte) bool

多签名验证。 ver 为版本值。便于安全升级。 当前采用ed25519签名认证。

func MultiCheck

func MultiCheck(ver int, msg []byte, sigs, pks, pkhs [][]byte, pkaddr []byte, env *Envs) (bool, error)

系统内置验证(多重签名)。 公钥条目和公钥地址条目都已前置1字节的序位值(在公钥地址清单中的位置)。 解锁数据: - ver 为版本值。 - msg 签名消息。 - sigs 签名数据集。 - pks 签名公钥集(与签名集成员一一对应)。 - pkhs 未签名公钥地址集。 - pkaddr 多重签名公钥地址(付款者)。 - env 环境对象引用(添加信息)。 注记: 需要先对比两个来源的公钥地址是否相同。 不含金额的合法性检查。

func SingleCheck

func SingleCheck(ver int, pubkey PubKey, msg, sig, pkaddr []byte) bool

系统内置验证(单签名)。 解锁数据: - ver 为版本值。 - pubkey 用户的签名公钥。 - msg 签名的消息:脚本ID(4+4+2)。 - sig 用户的签名数据。 - pkaddr 付款者的公钥地址。 注记: 需要对比目标公钥地址和计算出来的是否相同。 不含金额的合法性检查,它们在前阶环节执行。

Types

type Actuator

type Actuator struct {
	Ver    int    // 版本信息
	ID     []byte // 脚本标识ID
	Ifs    *bool  // IF 状态值(nil, false, true)
	Script        // 脚本对象

	*Envs // 系统环境
	// contains filtered or unexported fields
}

脚本执行器 会作为脚本执行的实参传递,获得以脚本为单元的并发安全。 此处的ID用于唯一性地标识一段脚本。

func NewActuator

func NewActuator(id, code []byte, ch chan Middler, envs *Envs, ver int) *Actuator

创建全新执行器 仅在顶层脚本执行时才需要全新创建。 id 脚本的唯一性标识(4-4-2)。 code 脚本指令序列,应当为顶层全脚本。 ch 缓存区输入输出通道,由外部多Goroutines共享。 env 外部环境变量取值区。

func (*Actuator) Arguments

func (a *Actuator) Arguments(n int) []any

获取实参序列。 n 为指令所需实参数量: - 0 无需求 - n 特定数量(n个实参) - -1 不定数量(不适用实参直取) 返回值: nil 无需求 [] n个实参的切片(上级展开)

func (*Actuator) BlockNew

func (a *Actuator) BlockNew(code []byte) *Actuator

子块执行器创建。 用于普通的子代码块,如:IF, ELSE,以及循环内的每次迭代。 最少的环境条件重置。 code 为子块指令序列。

func (Actuator) BufinPick

func (s Actuator) BufinPick(n int) []any

从导入缓存区提取数据。

func (Actuator) BufoutPush

func (s Actuator) BufoutPush(vs ...any)

向导出缓存区添加数据。

func (Actuator) BufoutTake

func (s Actuator) BufoutTake() []any

提取导出缓存区全部数据。

func (*Actuator) CaseNew

func (a *Actuator) CaseNew(code []byte) *Actuator

case块执行器创建。

func (Actuator) CasePass

func (sc Actuator) CasePass() bool

分支测试。 按CASE顺序比较,成功则表示可进入该分支。 注:比较一项移除一项。

func (Actuator) CaseThrough

func (sc Actuator) CaseThrough(v bool)

设置 Case fallthrough 状态。

func (*Actuator) Change

func (s *Actuator) Change()

标记状态改变。

func (*Actuator) EmbedNew

func (a *Actuator) EmbedNew(id []byte, code []byte) *Actuator

嵌入脚本状态集创建。 用于共享主体环境的 JUMP 脚本,但有自己的标识ID。 环境: - 与主体代码共享各种数据空间。 - 不支持引用所在循环的迭代变量。

func (*Actuator) EvalNew

func (a *Actuator) EvalNew(code []byte) *Actuator

创建 EVAL 代码执行器。 环境: - 独立的数据栈、实参区和全局变量区。 - 禁止 GOTO 跳转和 JUMP 嵌入。 注记: 因为无法从普通字节序列转换为脚本类型,所以目标不会从外部来, 只能是源脚本中的 CODE{} 创建,故id不变。

func (*Actuator) ExprIn

func (a *Actuator) ExprIn()

表达式递进计数。

func (*Actuator) ExprNew

func (a *Actuator) ExprNew(code []byte) *Actuator

表达式片段状态集。 环境: - 与主体代码共享各种数据空间。 - 禁止 GOTO 跳转和 JUMP 嵌入。

func (*Actuator) ExprOut

func (a *Actuator) ExprOut()

表达式退出计数。

func (Actuator) Fallthrough

func (sc Actuator) Fallthrough() bool

检查是否穿越。

func (*Actuator) GlobalSet

func (a *Actuator) GlobalSet(i int, v any)

设置全局变量。

func (*Actuator) GlobalValue

func (a *Actuator) GlobalValue(i int) any

获取全局变量值。

func (Actuator) Gotos

func (c Actuator) Gotos() int

获取嵌入计数。

func (*Actuator) InExpr

func (a *Actuator) InExpr() bool

是否在表达式内。

func (Actuator) IncrGoto

func (c Actuator) IncrGoto()

增加一次 GOTO 计数。

func (Actuator) IncrJump

func (c Actuator) IncrJump()

增加一次 JUMP 计数。

func (Actuator) Input

func (s Actuator) Input(vs ...any)

向导入缓存区填充数据。 注意: 如果脚本中存在INPUT指令,外部用户需预先调用本接口灌入数据, 否则验证会因没有数据而结束(失败)。

func (Actuator) InputNil

func (s Actuator) InputNil() bool

导入缓存区是否为空。

func (Actuator) Jumps

func (c Actuator) Jumps() int

获取嵌入计数。

func (Actuator) LoopItem

func (l Actuator) LoopItem(i int) any

提取循环变量成员。

func (*Actuator) LoopNew

func (a *Actuator) LoopNew(code []byte) *Actuator

循环块执行器创建(EACH)。 约束: - 循环内禁止 GOTO 跳转,但允许 JUMP。 - 相同 JUMP 的迭代不重复计量,但总的次数不得超出限额。 - 初始化循环迭代变量空间([4]any)。

func (Actuator) LoopSet

func (l Actuator) LoopSet(k, v, d any, size int)

设置循环变量值。

func (Actuator) OutputNil

func (s Actuator) OutputNil() bool

导出缓存区是否为空。

func (Actuator) PutArgs

func (s Actuator) PutArgs(vs ...any)

放置实参条目。

func (*Actuator) ReturnPut

func (a *Actuator) ReturnPut(to int, vs []any)

返回值放置。 根据前置取值状态,放在3个不同的地方: - 添加到数据栈(默认)。 - 添加到实参区。 - 添加到局部域。 vs: - nil 指令无返回值,简单忽略。 - [] 包含成员的切片,应展开放置。

func (*Actuator) Revert

func (s *Actuator) Revert()

恢复为常态。 主要针对几个特殊指令对运行状态的改变。 注意: 上级调用管理器需要先获取状态,然后调用目标指令处理其返回值。 因为目标指令会在返回前调用此函数恢复常态。

func (Actuator) ScopeItem

func (s Actuator) ScopeItem(i int) any

获取局部域条目。 支持负数从末尾算起。越界时由系统(Go语言实现)抛出异常。

func (*Actuator) ScopeNew

func (a *Actuator) ScopeNew(code []byte) *Actuator

私有域执行器创建。 用于 MAP, FILTER 和 EVAL 需要私有环境的指令。 code 为私有域指令代码序列。 环境: - 独立的数据栈和实参区。 - 禁止 GOTO 跳转和 JUMP 嵌入。

func (*Actuator) ScriptNew

func (a *Actuator) ScriptNew(id []byte, code []byte) *Actuator

独立脚本执行器创建。 用于 GOTO 到的外部脚本的环境隔离。 环境: 数据栈、实参区、全局变量区独立。

func (Actuator) SetJumps

func (c Actuator) SetJumps(n int)

嵌入计数直接设置。 注:主要用于循环块内的JUMP计数处理。

func (*Actuator) SpentMsg

func (a *Actuator) SpentMsg(flag int) []byte

构造签名消息。 flag 签名消息类别。

func (Actuator) StackData

func (s Actuator) StackData() []any

提取数据栈成员。 新建一个切片以获得简洁空间(节省内存)。

func (Actuator) StackItem

func (s Actuator) StackItem(i int) any

获取栈内目标位置条目。 i 为位置下标,从栈底开始计数。

func (Actuator) StackItems

func (s Actuator) StackItems(i, n int) []any

获取栈内目标位置段条目集。

func (Actuator) StackPop

func (s Actuator) StackPop() any

弹出栈顶项。

func (Actuator) StackPops

func (s Actuator) StackPops(n int) []any

弹出栈顶多项。

func (Actuator) StackPush

func (s Actuator) StackPush(vs ...any)

数据栈添加条目。

func (Actuator) StackSize

func (s Actuator) StackSize() int

返回数据栈大小。

func (Actuator) StackTop

func (s Actuator) StackTop() any

引用栈顶项。

func (Actuator) StackTops

func (s Actuator) StackTops(n int) []any

引用栈顶多项。

func (*Actuator) SwitchNew

func (a *Actuator) SwitchNew(code []byte, target any, cases []any) *Actuator

switch块执行器创建。 code 为 switch 块指令序列。 target 为 switch 对比标的值。 cases 为 case 分支值序列。

func (Actuator) SwitchReset

func (sc Actuator) SwitchReset()

Swtich 重置。 预防 Default 分支之后的非法 Case。

func (*Actuator) XFrom

func (a *Actuator) XFrom(i int) any

获取源脚本信息条目。

type Envs

type Envs struct {
	// contains filtered or unexported fields
}

系统环境封装。 - 缓存环境指令需要的数据,惰性载入。 - 设置环境基础条件。

func NewEnvs

func NewEnvs(pkaddr []byte, size int) *Envs

创建一个环境对象。 初始化内部存储空间,部分成员默认值即可。 size 为当前交易输出集大小。 注记: 简单数据初始即赋值,复杂数据惰性处理。

func (*Envs) EnvItem

func (e *Envs) EnvItem(n int) any

环境变量条目获取。 n 为条目标识值(0-255)。 注:条目值惰性获取。

func (*Envs) GotoIn

func (e *Envs) GotoIn()

GOTO 进入。

func (*Envs) JumpIn

func (e *Envs) JumpIn()

JUMP 进入。

func (*Envs) MulSigN

func (e *Envs) MulSigN(n int) bool

检查目标序位是否签名。

func (*Envs) PubKeyAddr

func (e *Envs) PubKeyAddr() []byte

获取公钥地址。

func (*Envs) SetMulSig

func (e *Envs) SetMulSig(ns ...int)

设置多重签名序位。 ns 签名的公钥地址在多重公钥列表中的序位集。 注: 不同的签名集各自独立,因此每次都会新建一个存储集。

func (*Envs) TxInItem

func (e *Envs) TxInItem(n int) any

获取交易输入信息。 n 为输入项成员标识值。 注:条目值惰性获取。

func (*Envs) TxInOutItem

func (e *Envs) TxInOutItem(n int) any

获取交易输入的源输出项信息。 n 为输出项成员标识值。 注:条目值惰性获取。

func (*Envs) TxOutItem

func (e *Envs) TxOutItem(i, n int) any

获取交易输出信息。 i 为输出脚本序位(从0开始)。 n 为输出项成员标识值。 注:条目值惰性获取。

type Instx

type Instx struct {
	Call Wrapper // 指令调用器
	Argn int     // 指令实参数量
}

指令配置器。

type Middler

type Middler struct {
	ID   []byte // 脚本标识ID
	N    int    // 转出指令(BUFDUMP)序位
	Code []byte // 脚本源码副本
	Data []any  // 导出数据
}

中间数据体 脚本内数据(缓存)和外部世界的中间媒介。

type PubKey

type PubKey = ed25519.PublicKey

公钥类型引用。

func MulPubKeys

func MulPubKeys(pbks [][]byte) ([]int, []PubKey)

提取多重签名的公钥集。 即去除脚本中提供的公钥上前置的序位标识。 返回:序位集,公钥集。

type Script

type Script = instor.Script

脚本类型

type SigIdSet

type SigIdSet = intsets.Sparse

多重签名序位集。 注:用于 MULSIG 指令。

type Wrapper

type Wrapper func(*Actuator, []any, any, ...any) []any

* 指令调用器。 * 封装实际指令的各自的功能。 * 外部传递指令的附参、关联数据和所需的实参,执行指令调用。 * Actuator: * 脚本执行器,提供独立的共享区(友好并发),记录一些状态供各指令协调操作。 * 注:并发是以脚本为基本单元。 * []any: * 指令附参序列。 * any: * 指令关联数据。 * ...any: * 指令所需的不定数量实参序列。 * * 返回值: * 切片,应当被展开,以提供不定数量返回值的逻辑。其中: * - nil 无返回值 * - [1] 单个返回值,展开 * - [...] 多个返回值,同上展开 ******************************************************************************

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL