Documentation ¶
Overview ¶
Package ibase 脚本指令集处理基础性支持。 提炼出公共的部分,供不同子包使用(而不会有循环依赖)。
Index ¶
- Constants
- Variables
- func CheckAward(h int) int
- func CheckSig(ver int, pubkey PubKey, msg, sig []byte) bool
- func CheckSigs(ver int, pubkeys []PubKey, msg []byte, sigs [][]byte) bool
- func MultiCheck(ver int, msg []byte, sigs, pks, pkhs [][]byte, pkaddr []byte, env *Envs) (bool, error)
- func SingleCheck(ver int, pubkey PubKey, msg, sig, pkaddr []byte) bool
- type Actuator
- func (a *Actuator) Arguments(n int) []any
- func (a *Actuator) BlockNew(code []byte) *Actuator
- func (s Actuator) BufinPick(n int) []any
- func (s Actuator) BufoutPush(vs ...any)
- func (s Actuator) BufoutTake() []any
- func (a *Actuator) CaseNew(code []byte) *Actuator
- func (sc Actuator) CasePass() bool
- func (sc Actuator) CaseThrough(v bool)
- func (s *Actuator) Change()
- func (a *Actuator) EmbedNew(id []byte, code []byte) *Actuator
- func (a *Actuator) EvalNew(code []byte) *Actuator
- func (a *Actuator) ExprIn()
- func (a *Actuator) ExprNew(code []byte) *Actuator
- func (a *Actuator) ExprOut()
- func (sc Actuator) Fallthrough() bool
- func (a *Actuator) GlobalSet(i int, v any)
- func (a *Actuator) GlobalValue(i int) any
- func (c Actuator) Gotos() int
- func (a *Actuator) InExpr() bool
- func (c Actuator) IncrGoto()
- func (c Actuator) IncrJump()
- func (s Actuator) Input(vs ...any)
- func (s Actuator) InputNil() bool
- func (c Actuator) Jumps() int
- func (l Actuator) LoopItem(i int) any
- func (a *Actuator) LoopNew(code []byte) *Actuator
- func (l Actuator) LoopSet(k, v, d any, size int)
- func (s Actuator) OutputNil() bool
- func (s Actuator) PutArgs(vs ...any)
- func (a *Actuator) ReturnPut(to int, vs []any)
- func (s *Actuator) Revert()
- func (s Actuator) ScopeItem(i int) any
- func (a *Actuator) ScopeNew(code []byte) *Actuator
- func (a *Actuator) ScriptNew(id []byte, code []byte) *Actuator
- func (c Actuator) SetJumps(n int)
- func (a *Actuator) SpentMsg(flag int) []byte
- func (s Actuator) StackData() []any
- func (s Actuator) StackItem(i int) any
- func (s Actuator) StackItems(i, n int) []any
- func (s Actuator) StackPop() any
- func (s Actuator) StackPops(n int) []any
- func (s Actuator) StackPush(vs ...any)
- func (s Actuator) StackSize() int
- func (s Actuator) StackTop() any
- func (s Actuator) StackTops(n int) []any
- func (a *Actuator) SwitchNew(code []byte, target any, cases []any) *Actuator
- func (sc Actuator) SwitchReset()
- func (a *Actuator) XFrom(i int) any
- type Envs
- type Instx
- type Middler
- type PubKey
- type Script
- type SigIdSet
- type Wrapper
Constants ¶
const ( ScopeMax = 128 // 局部域大小 StackMax = 256 // 数据栈大小 GotoMax = 3 // 跳转次数限额(包含) JumpMax = 9 // 嵌入次数限额(包含) ExprEnd = -1 // 表达式结束标志 )
基本限制配置。
const ( StackFlag int = iota // 数据栈(默认) ArgsFlag // 实参空间 ScopeFlag // 当前局部域 )
3个存值区标识值。
Variables ¶
var (
ErrToHere = errors.New(_T("执行流不可能抵达这里,请检查源码"))
)
Functions ¶
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 环境对象引用(添加信息)。 注记: 需要先对比两个来源的公钥地址是否相同。 不含金额的合法性检查。
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 ¶
创建全新执行器 仅在顶层脚本执行时才需要全新创建。 id 脚本的唯一性标识(4-4-2)。 code 脚本指令序列,应当为顶层全脚本。 ch 缓存区输入输出通道,由外部多Goroutines共享。 env 外部环境变量取值区。
func (*Actuator) Arguments ¶
获取实参序列。 n 为指令所需实参数量: - 0 无需求 - n 特定数量(n个实参) - -1 不定数量(不适用实参直取) 返回值: nil 无需求 [] n个实参的切片(上级展开)
func (Actuator) CasePass ¶
func (sc Actuator) CasePass() bool
分支测试。 按CASE顺序比较,成功则表示可进入该分支。 注:比较一项移除一项。
func (*Actuator) EmbedNew ¶
嵌入脚本状态集创建。 用于共享主体环境的 JUMP 脚本,但有自己的标识ID。 环境: - 与主体代码共享各种数据空间。 - 不支持引用所在循环的迭代变量。
func (*Actuator) EvalNew ¶
创建 EVAL 代码执行器。 环境: - 独立的数据栈、实参区和全局变量区。 - 禁止 GOTO 跳转和 JUMP 嵌入。 注记: 因为无法从普通字节序列转换为脚本类型,所以目标不会从外部来, 只能是源脚本中的 CODE{} 创建,故id不变。
func (Actuator) Input ¶
func (s Actuator) Input(vs ...any)
向导入缓存区填充数据。 注意: 如果脚本中存在INPUT指令,外部用户需预先调用本接口灌入数据, 否则验证会因没有数据而结束(失败)。
func (*Actuator) LoopNew ¶
循环块执行器创建(EACH)。 约束: - 循环内禁止 GOTO 跳转,但允许 JUMP。 - 相同 JUMP 的迭代不重复计量,但总的次数不得超出限额。 - 初始化循环迭代变量空间([4]any)。
func (*Actuator) ReturnPut ¶
返回值放置。 根据前置取值状态,放在3个不同的地方: - 添加到数据栈(默认)。 - 添加到实参区。 - 添加到局部域。 vs: - nil 指令无返回值,简单忽略。 - [] 包含成员的切片,应展开放置。
func (*Actuator) Revert ¶
func (s *Actuator) Revert()
恢复为常态。 主要针对几个特殊指令对运行状态的改变。 注意: 上级调用管理器需要先获取状态,然后调用目标指令处理其返回值。 因为目标指令会在返回前调用此函数恢复常态。
func (*Actuator) ScopeNew ¶
私有域执行器创建。 用于 MAP, FILTER 和 EVAL 需要私有环境的指令。 code 为私有域指令代码序列。 环境: - 独立的数据栈和实参区。 - 禁止 GOTO 跳转和 JUMP 嵌入。
type Envs ¶
type Envs struct {
// contains filtered or unexported fields
}
系统环境封装。 - 缓存环境指令需要的数据,惰性载入。 - 设置环境基础条件。
func (*Envs) TxInOutItem ¶
获取交易输入的源输出项信息。 n 为输出项成员标识值。 注:条目值惰性获取。
type Middler ¶
type Middler struct { ID []byte // 脚本标识ID N int // 转出指令(BUFDUMP)序位 Code []byte // 脚本源码副本 Data []any // 导出数据 }
中间数据体 脚本内数据(缓存)和外部世界的中间媒介。
type Wrapper ¶
* 指令调用器。 * 封装实际指令的各自的功能。 * 外部传递指令的附参、关联数据和所需的实参,执行指令调用。 * Actuator: * 脚本执行器,提供独立的共享区(友好并发),记录一些状态供各指令协调操作。 * 注:并发是以脚本为基本单元。 * []any: * 指令附参序列。 * any: * 指令关联数据。 * ...any: * 指令所需的不定数量实参序列。 * * 返回值: * 切片,应当被展开,以提供不定数量返回值的逻辑。其中: * - nil 无返回值 * - [1] 单个返回值,展开 * - [...] 多个返回值,同上展开 ******************************************************************************