script

package
v0.0.0-...-3c905e5 Latest Latest
Warning

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

Go to latest
Published: Dec 24, 2023 License: BSD-3-Clause Imports: 14 Imported by: 0

README

脚本使用

钱包资产找回

相关概念

脚本地址 X

该地址由钱包找回脚本哈希生成地址, 由于私钥未知, 地址上的资产需要使用钱包找回脚本对应的约束进行提取

控制地址 A

该地址为钱包找回主地址, 可以基于比特币脚本构造签名, 实时提取地址 X 中的资产

找回地址 B

该地址为钱包找回副本地址, 可以基于比特币脚本构造签名, 延时提取地址 X 中的资产, 目前仅支持 2 个找回地址

钱包找回脚本 S

一种比特币脚本, 由地址 A 和 B 对应公钥, 以及延时等数据构成

基本场景

  • 用户生成地址 A 和 B 及 X, 地址 X 用于线上资产存储, 地址 A 离线控制 X 资产存取
  • 地址 A 私钥丢失时, 可使用地址 B 的私钥进行延时找回地址 X 资产
  • 实际使用中, 地址 B 也可由第三方托管控制
操作步骤

获取钱包找回脚本地址 X

  • 已知钱包找回控制地址 A,找回地址 B,相对延时时长 T
  • 调用接口获取获取钱包找回地址 X,相关 rpc
  • 用户使用链上转账功能,将需要被钱包找回控制的的资产转入到地址 X
  • X 对应的私钥未知,需要由地址 A 或 B 的私钥构造比特币脚本签名,进行资产操作

实时提取 X 资产

  • 控制地址 A 可以随时对 X 的资产进行提取,即构造发送方为 X 的原始转账交易
  • 交易需要采用比特币脚本类型签名, 相关 rpc
  • 发送交易到链上执行

延时提取 X 资产

  • 找回地址 B 可以基于延时交易提取 X 的资产, 即构造发送方为 X 的原始转账交易 tx1, 但 tx1 需要提交到链上并等待延时打包
  • 交易 tx1 需要采用比特币脚本类型签名, 相关 rpc
  • 基于 tx1, 相对延时 T, 构造延时存证交易 tx2,构造方法
  • 将 tx2 签名并发送至链上执行,tx1 将作为 tx2 的交易内容, 暂存于链上等待延时打包
  • 通过 tx1 哈希, 查询 tx1 是否被打包执行
rpc 接口
chain.GetWalletRecoverAddress

请求结构 ReqGetWalletRecoverAddr

字段名称 类型 含义
ctrPubKey string 控制地址公钥, secp256k1 算法, 16 进制
recoverPubKey []string 找回地址公钥数组, secp256k1 算法, 16 进制, 目前只支持两个地址,即数组长度为 2
relativeDelayTime int64 钱包找回相对延时时长, 单位秒

响应

名称 类型 含义
result string 脚本地址 X
chain.SignWalletRecoverTx

请求结构 ReqSignWalletRecoverTx

字段名称 类型 含义
walletRecoverParam ReqGetWalletRecoverAddr 钱包找回信息结构
signAddr string 签名地址
privKey string 签名地址的私钥, secp256k1 算法, 16 进制, 不指定私钥时,将从本地钱包获取对应私钥
rawTx string 原始交易, 16 进制

响应

名称 类型 含义
result string 签名后的交易, hex 格式

Documentation

Index

Constants

View Source
const (
	// TyPay2PubKey Pay to pub key
	TyPay2PubKey = iota
	// TyPay2PubKeyHash Pay to pub key Hash
	TyPay2PubKeyHash
	// TyPay2ScriptHash Pay to Script Hash
	TyPay2ScriptHash
)

Variables

View Source
var (

	// ErrInvalidMultiSigRequiredNum error required multi sig pub key num
	ErrInvalidMultiSigRequiredNum = errors.New("ErrInvalidMultiSigRequiredNum")
	// ErrInvalidBtcPubKey invalid bitcoin pubkey
	ErrInvalidBtcPubKey = errors.New("ErrInvalidBtcPubKey")
	// ErrBuildBtcScript build btc script error
	ErrBuildBtcScript = errors.New("ErrBuildBtcScript")
	// ErrNewBtcAddress new btc address pub key error
	ErrNewBtcAddress = errors.New("ErrNewBtcAddress")
	// ErrGetBtcTxInSig get btc tx input signature error
	ErrGetBtcTxInSig = errors.New("ErrGetBtcTxInSig")
	// ErrNewBtcScriptSig new btc script sig error
	ErrNewBtcScriptSig = errors.New("ErrNewBtcScriptSig")

	// ErrBtcKeyNotExist btc key not exist when sign
	ErrBtcKeyNotExist = errors.New("ErrBtcKeyNotExist")
	// ErrBtcScriptNotExist btc script not exist when sign
	ErrBtcScriptNotExist = errors.New("ErrBtcScriptNotExist")
)
View Source
var ChainBtcParams = &chaincfg.Params{
	Name: "chain-btc-Script",

	PubKeyHashAddrID:        0x00,
	ScriptHashAddrID:        0x05,
	PrivateKeyID:            0x80,
	WitnessPubKeyHashAddrID: 0x06,
	WitnessScriptHashAddrID: 0x0A,
}

ChainBtcParams 比特币相关区块链参数

Functions

func CheckBtcScript

func CheckBtcScript(msg []byte, sig *Signature) error

CheckBtcScript check btc Script signature

func GetBtcLockScript

func GetBtcLockScript(scriptTy int32, pkScript []byte) (btcutil.Address, []byte, error)

GetBtcLockScript 根据地址类型,生成锁定脚本

func GetBtcUnlockScript

func GetBtcUnlockScript(signMsg, lockScript, prevScript []byte,
	kdb txscript.KeyDB, sdb txscript.ScriptDB) ([]byte, error)

GetBtcUnlockScript 生成比特币解锁脚本

func GetWalletRecoverySignature

func GetWalletRecoverySignature(isRetrieve bool, signMsg, privKey, walletRecoverScript []byte, utxoSequence int64) (sig []byte, pubKey []byte, err error)

GetWalletRecoverySignature get wallet asset recover signature isRetrieve set false when input control address private key, set true for wallet recovery signMsg msg for sign privKey private key of control address or recover address walletRecoverScript result of NewWalletRecoveryScript utxoSequence utxo sequence, set relative delay time for wallet recovery

func MakeKeyDB

func MakeKeyDB(keyAddr ...*BtcAddr2Key) txscript.KeyDB

MakeKeyDB make btc script key db

func MakeScriptDB

func MakeScriptDB(scriptArr ...*BtcAddr2Script) txscript.ScriptDB

MakeScriptDB make btc script db

func NewBtcKeyFromBytes

func NewBtcKeyFromBytes(priv []byte) (*btcec.PrivateKey, *btcec.PublicKey)

NewBtcKeyFromBytes 获取比特币公私钥

func NewBtcScriptSig

func NewBtcScriptSig(lockScript, unlockScript []byte) ([]byte, error)

NewBtcScriptSig new btc script signature

func NewBtcScriptSigWithDelay

func NewBtcScriptSigWithDelay(lockScript, unlockScript []byte, lockTime, utxoSeq int64) ([]byte, error)

NewBtcScriptSigWithDelay new btc script signature with lockTime or sequence

func NewMultiSigScript

func NewMultiSigScript(pubKeys [][]byte, required int) (script []byte, err error)

NewMultiSigScript multi-sig pubKey script

func NewWalletRecoveryScript

func NewWalletRecoveryScript(controlPubKey []byte, recoverPubKeys [][]byte, relativeDelayTime int64) (script []byte, err error)

NewWalletRecoveryScript wallet assets recovery pubKey script controlPubKey secp256k1 pub key recoverPubKey secp256k1 pub key relativeDelayTime relative time of second or block height IF <A's Pubkey> CHECKSIG ELSE <sequence> CHECKSEQUENCEVERIFY DROP <B's Pubkey> CHECKSIG ENDIF

func Script2PubKey

func Script2PubKey(lockScript []byte) []byte

Script2PubKey transform script to fixed length public key

Types

type BtcAddr2Key

type BtcAddr2Key struct {
	Addr string
	Key  *btcec.PrivateKey
}

BtcAddr2Key 比特币编码地址及对应的私钥,用于签名KeyDB

type BtcAddr2Script

type BtcAddr2Script struct {
	Addr   string
	Script []byte
}

BtcAddr2Script 比特币编码地址及对应的脚本,用于签名ScriptDB

type Signature

type Signature struct {
	LockScript   []byte `protobuf:"bytes,1,opt,name=lockScript,proto3" json:"lockScript,omitempty"`
	UnlockScript []byte `protobuf:"bytes,2,opt,name=unlockScript,proto3" json:"unlockScript,omitempty"`
	LockTime     int64  `protobuf:"varint,3,opt,name=lockTime,proto3" json:"lockTime,omitempty"`
	UtxoSequence int64  `protobuf:"varint,4,opt,name=utxoSequence,proto3" json:"utxoSequence,omitempty"`
	// contains filtered or unexported fields
}

func (*Signature) Descriptor deprecated

func (*Signature) Descriptor() ([]byte, []int)

Deprecated: Use Signature.ProtoReflect.Descriptor instead.

func (*Signature) GetLockScript

func (x *Signature) GetLockScript() []byte

func (*Signature) GetLockTime

func (x *Signature) GetLockTime() int64

func (*Signature) GetUnlockScript

func (x *Signature) GetUnlockScript() []byte

func (*Signature) GetUtxoSequence

func (x *Signature) GetUtxoSequence() int64

func (*Signature) ProtoMessage

func (*Signature) ProtoMessage()

func (*Signature) ProtoReflect

func (x *Signature) ProtoReflect() protoreflect.Message

func (*Signature) Reset

func (x *Signature) Reset()

func (*Signature) String

func (x *Signature) String() string

Jump to

Keyboard shortcuts

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