omniTransaction

package
v1.2.27 Latest Latest
Warning

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

Go to latest
Published: Mar 12, 2022 License: GPL-3.0 Imports: 7 Imported by: 14

README

Omni Transaction Driver

        transaction_test.go测试案例说明
        Test_case1    : 1 p2pkh to 1 p2pkh simple send
        Test_case2    : 2 p2pkh to 2 p2pkh simple send
        Test_case3    : 1 multisig to 1 p2pkh simple send
        Test_case4    : 1 p2pkh to 1 p2pkh send all

其他类染色币

        在txProfile.go里面添加其他染色币的PropertyID可以支持USDT之外的共404种染色币

当前支持

        交易单构建
        交易单签名
        交易单合并
        交易单验签

        现可支持404种染色币的12种交易模式,另外11种模式暂不支持
        具体交易模式以及交易时需要指定的OmniStruct结构体数据如下:
        SimpleSend                : txType + propertyID + amount
        SendAll                   : txType + ecosystem
        DExAccept                 : txType + propertyID + amount
        MetaDExCancelEcosystem    : txType + ecosystem
        CloseCrowdsale            : txType + propertyID
        Grant                     : txType + propertyID + amount + memo
        Revoke                    : txType + propertyID + amount + memo
        ChangeIssuer              : txType + propertyID
        EnableFreezing            : txType + propertyID
        DisableFreezing           : txType + propertyID
        FreezeTokens              : txType + propertyID + amount + address
        UnfreezeTokens            : txType + propertyID + amount + address

TODO

        a lot

用法:

创建空交易单 CreateEmptyRawTransaction
        前置条件:
                获取需要发送的utxo
                获取接收地址和找零地址
                确定手续费以及找零数额
        步骤:
                使用utxo的交易哈希(txid)和输出索引(vout)填充TxIn结构体的Prevout字段
                使用接收地址和找零地址以及对应数额填充TxOut结构体的Address字段和Amount字段
                确认交易单版本号
                确认交易单锁定时间
                确认交易是否可以追加手续费(replaceable)
                获取空交易单
        调用方式:
                CreateRawTransaction([]TxIn, []TxOut, transactionVersion, lockTime, replaceable)
        Tips:
                txid使用的是小端模式,即查询交易时的端序
                交易单版本号为目前的默认版本号02
创建用于签名的交易单哈希 CreateRawTransactionHashForSign
        前置条件:
                获取需要发送的utxo
                获取接收地址和找零地址
                确定手续费以及找零数额
        步骤:
                使用utxo的交易哈希(txid)和输出索引(vout)填充TxIn结构体的Prevout字段
                使用接收地址和找零地址以及对应数额填充TxOut结构体的Address字段和Amount字段
                确认交易单版本号
                确认交易单锁定时间
                确认交易是否可以追加手续费(replaceable)
                获取前置交易的锁定脚本
                确认签名类型
                获取交易单
        调用方式:
                CreateRawTransactionHashForSign([]TxIn []TxOut, transactionVersion, lockTime, replaceable, signType)
        Tips:
                txid使用的是小端模式,即查询交易时的端序
                交易单版本号为目前的默认版本号02
                签名类型一般为signAll
本地交易单签名 SignEmptyRawTransaction
        前置条件:
                获取空交易单emptyTrans
                获取utxo的锁定脚本以及脚本对应的私钥
        步骤:
                使用锁定脚本与私钥填充TxUnlock结构体
                确定签名类型
        调用方式:
                SignRawTransaction(emptyTrans, []TxUnlock, sigType)
        Tips:
                TxUnlock结构体数组的顺序应该与空交易单的utxo的txid顺序保持一致
                签名类型一般为signAll
客户端交易单哈希签名 SignRawTransactionHash
        前置条件:
                获得用于签名的交易单哈希
        步骤:
                获取前置交易的锁定脚本对应的私钥,填充TxUnlock结构体
                获取签名
        调用方式:
                SignRawTransactionHash(transForSig, []TxUnlock)
        Tips:
                TxUnlock结构体数组的顺序应该与空交易单的utxo的txid顺序保持一致
合并交易单 InsertSignaturesToEmptyRawTransaction
        前置条件:
                获得空交易单
                获得签名
        步骤:
                合并
        调用方式:
                InsertSignaturesToEmptyRawTransaction(emptyTrans, []SignaturePubkkey)
        Tips:
                签名数据结构体数组的顺序应该与utxo的txid顺序保持一致
交易单验签 VerifyRawTransaction
        前置条件:    
                获取签名后的交易单signedTrans
                获取utxo的锁定脚本
        步骤:
                使用锁定脚本填充TxUnlock结构体
        调用方式:
                VerifyRawTransaction(signedTrans, []TxUnlock)
        Tips:
                TxUnlock结构体数组的顺序应该与交易单的utxo的txid顺序保持一致

Documentation

Index

Constants

View Source
const (
	TypeEmpty    = 0
	TypeP2PKH    = 1
	TypeP2WPKH   = 2
	TypeBech32   = 3
	TypeMultiSig = 4
)
View Source
const (
	SimpleSend             = 0
	SendAll                = 4
	DExAccept              = 22
	MetaDExCancelEcosystem = 28
	CloseCrowdsale         = 53
	Grant                  = 55
	Revoke                 = 56
	ChangeIssuer           = 70
	EnableFreezing         = 71
	DisableFreezing        = 72
	FreezeTokens           = 185
	UnfreezeTokens         = 186
)

Omni transaction type

View Source
const (
	MainTetherUS_01 = uint32(31)
	MainTetherUS_02 = uint32(192)
	MainTetherUS_03 = uint32(330)
	MainTetherUS_04 = uint32(341)
	MainTetherUS_05 = uint32(396)
	MainTetherUS_06 = uint32(397)
	MainTetherUS_07 = uint32(398)
	MainTetherUS_08 = uint32(399)
	MainTetherUS_09 = uint32(404)

	TestTetherUS_01 = uint32(2147484026)
	TestTetherUS_02 = uint32(2147484061)
	TestTetherUS_03 = uint32(2147484062)

	DefaultTetherUSID = TestTetherUS_01
)

propertyID for USDT

View Source
const (
	EcoSystemMain = byte(1)
	EcoSystemTest = byte(2)

	DefaultEcoSystem = EcoSystemTest
)

ecosystem defination for send all payload

View Source
const (
	DefaultTxVersion     = uint32(2)
	DefaultHashType      = uint32(1)
	MaxScriptElementSize = 520
)
View Source
const (
	SequenceFinal        = uint32(0xFFFFFFFF)
	SequenceMaxBip125RBF = uint32(0xFFFFFFFD)
)
View Source
const (
	SegWitSymbol  = byte(0)
	SegWitVersion = byte(1)
	SigHashAll    = byte(1)
)
View Source
const (
	OpCodeHash160     = byte(0xA9)
	OpCodeEqual       = byte(0x87)
	OpCodeEqualVerify = byte(0x88)
	OpCodeCheckSig    = byte(0xAC)
	OpCodeDup         = byte(0x76)
	OpCode_1          = byte(0x51)
	OpCheckMultiSig   = byte(0xAE)
	OpPushData1       = byte(0x4C)
	OpPushData2       = byte(0x4D)
	OpPushData3       = byte(0x4E)
	OpReturn          = byte(0x6A)
)

Variables

View Source
var (
	ErrorInvalidAddress = errors.New("Invalid address!")

	BTCBech32Alphabet = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"

	CHARSET_REV = []int8{}/* 128 elements not displayed */

)
View Source
var (
	BTCMainnetAddressPrefix = AddressPrefix{[]byte{0x00}, []byte{0x05}, "bc"}
	BTCTestnetAddressPrefix = AddressPrefix{[]byte{0x6F}, []byte{0xC4}, "tb"}
)
View Source
var (
	OmniPrefix     = [4]byte{0x6F, 0x6D, 0x6E, 0x69}
	CurveOrder     = []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41}
	HalfCurveOrder = []byte{0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D, 0x57, 0x6E, 0x73, 0x57, 0xA4, 0x50, 0x1D, 0xDF, 0xE9, 0x2F, 0x46, 0x68, 0x1B, 0x20, 0xA0}
)
View Source
var (
	BitcoinAlphabet = NewAlphabet("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
)

Alphabet: copy from https://en.wikipedia.org/wiki/Base58

View Source
var (
	ErrorInvalidBase58String = errors.New("invalid base58 string")
)

Errors

Functions

func Bech32Decode

func Bech32Decode(address string) ([]byte, error)

func Bech32Encode

func Bech32Encode(prefix, alphabet string, payload []byte) string

func CreateEmptyRawTransaction

func CreateEmptyRawTransaction(vins []Vin, vouts []Vout, omniDetail OmniStruct, lockTime uint32, replaceable bool, addressPrefix AddressPrefix) (string, error)

func CreateMultiSig

func CreateMultiSig(required byte, pubkeys [][]byte, addressPrefix AddressPrefix) (string, string, error)

func Decode

func Decode(input string, alphabet *Alphabet) ([]byte, error)

Decode docode with custom alphabet

func DecodeCheck

func DecodeCheck(address string) ([]byte, []byte, error)

return prefix + hash + error

func Encode

func Encode(input []byte, alphabet *Alphabet) string

Encode encode with custom alphabet

func EncodeCheck

func EncodeCheck(prefix []byte, hash []byte) string

func InsertSignatureIntoEmptyTransaction

func InsertSignatureIntoEmptyTransaction(txHex string, txHashes []TxHash, unlockData []TxUnlock) (string, error)

func VerifyRawTransaction

func VerifyRawTransaction(txHex string, unlockData []TxUnlock, addressPrefix AddressPrefix) bool

Types

type AddressPrefix added in v1.0.29

type AddressPrefix struct {
	P2PKHPrefix  []byte
	P2WPKHPrefix []byte
	Bech32Prefix string
}

type Alphabet

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

Alphabet The base58 alphabet object.

func NewAlphabet

func NewAlphabet(alphabet string) *Alphabet

NewAlphabet create a custom alphabet from 58-length string. Note: len(rune(alphabet)) must be 58.

func (Alphabet) String

func (alphabet Alphabet) String() string

Alphabet's string representation

type MultiTx

type MultiTx struct {
	Pubkey  string
	SigType byte
	SigPub  SignaturePubkey
}

type NormalTx

type NormalTx struct {
	Address string
	SigType byte
	SigPub  SignaturePubkey
}

type OmniStruct

type OmniStruct struct {
	TxType     int
	PropertyId uint32
	Amount     uint64
	Ecosystem  byte
	Memo       string
	Address    string
}

type SignaturePubkey

type SignaturePubkey struct {
	Signature []byte
	Pubkey    []byte
}

func SignRawTransactionHash

func SignRawTransactionHash(txHash string, prikey []byte) (*SignaturePubkey, error)

type Transaction

type Transaction struct {
	Version  []byte
	Vins     []TxIn
	Vouts    []TxOut
	LockTime []byte
	Witness  bool
}

func DecodeRawTransaction

func DecodeRawTransaction(txBytes []byte, SegwitON bool) (*Transaction, error)

type TxHash

type TxHash struct {
	Hash      string
	NRequired byte
	Normal    *NormalTx
	Multi     []MultiTx
}

func CreateRawTransactionHashForSig

func CreateRawTransactionHashForSig(txHex string, unlockData []TxUnlock, addressPrefix AddressPrefix) ([]TxHash, error)

func (TxHash) GetMultiTxPubkeys

func (tx TxHash) GetMultiTxPubkeys() []string

func (TxHash) GetNormalTxAddress

func (tx TxHash) GetNormalTxAddress() string

func (TxHash) GetTxHashHex

func (tx TxHash) GetTxHashHex() string

func (TxHash) IsMultisig

func (tx TxHash) IsMultisig() bool

type TxIn

type TxIn struct {
	TxID []byte
	Vout []byte
	// contains filtered or unexported fields
}

func (TxIn) GetTxID

func (in TxIn) GetTxID() string

func (TxIn) GetUTXOType

func (in TxIn) GetUTXOType() int

func (TxIn) GetVout

func (in TxIn) GetVout() uint32

type TxOut

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

type TxUnlock

type TxUnlock struct {
	LockScript   string
	RedeemScript string
	Amount       uint64
	SigType      byte
}

type Vin

type Vin struct {
	TxID string
	Vout uint32
}

type Vout

type Vout struct {
	Address string
	Amount  uint64
}

Jump to

Keyboard shortcuts

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