return nil, err
}
- control, err := vmutil.P2PKHSigProgram([]byte(pubHash))
+ control, err := vmutil.P2WPKHProgram([]byte(pubHash))
if err != nil {
return nil, err
}
return nil, err
}
- control, err := vmutil.P2SHProgram(scriptHash)
+ control, err := vmutil.P2WSHProgram(scriptHash)
if err != nil {
return nil, err
}
switch address.(type) {
case *common.AddressWitnessPubKeyHash:
- program, err = vmutil.P2PKHSigProgram(redeemContract)
+ program, err = vmutil.P2WPKHProgram(redeemContract)
case *common.AddressWitnessScriptHash:
- program, err = vmutil.P2SHProgram(redeemContract)
+ program, err = vmutil.P2WSHProgram(redeemContract)
default:
return errors.New("unsupport address type")
}
PowMinBits = uint64(2161727821138738707)
BlocksPerRetarget = uint64(1024)
TargetSecondsPerBlock = uint64(60)
+
+ PayToWitnessPubKeyHashDataSize = 20
+ PayToWitnessScriptHashDataSize = 32
)
// BTMAssetID is BTM's asset id, the soul asset of Bytom
--- /dev/null
+package segwit
+
+import (
+ "errors"
+
+ "github.com/bytom/consensus"
+ "github.com/bytom/protocol/vm"
+ "github.com/bytom/protocol/vm/vmutil"
+)
+
+func IsP2WPKHScript(prog []byte) bool {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return false
+ }
+ if len(insts) != 2 {
+ return false
+ }
+ if insts[0].Op > vm.OP_16 {
+ return false
+ }
+ return insts[1].Op == vm.OP_DATA_20 && len(insts[1].Data) == consensus.PayToWitnessPubKeyHashDataSize
+}
+
+func IsP2WSHScript(prog []byte) bool {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return false
+ }
+ if len(insts) != 2 {
+ return false
+ }
+ if insts[0].Op > vm.OP_16 {
+ return false
+ }
+ return insts[1].Op == vm.OP_DATA_32 && len(insts[1].Data) == consensus.PayToWitnessScriptHashDataSize
+}
+
+func ConvertP2PKHSigProgram(prog []byte) ([]byte, error) {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return nil, err
+ }
+ if insts[0].Op == vm.OP_0 {
+ return vmutil.P2PKHSigProgram(insts[1].Data)
+ }
+ return nil, errors.New("unknow P2PKH version number")
+}
+
+func ConvertP2SHProgram(prog []byte) ([]byte, error) {
+ insts, err := vm.ParseProgram(prog)
+ if err != nil {
+ return nil, err
+ }
+ if insts[0].Op == vm.OP_0 {
+ return vmutil.P2SHProgram(insts[1].Data)
+ }
+ return nil, errors.New("unknow P2SHP version number")
+}
import (
"bytes"
+ "github.com/bytom/consensus/segwit"
"github.com/bytom/crypto/sha3pool"
"github.com/bytom/errors"
"github.com/bytom/protocol/bc"
result := &vm.Context{
VMVersion: prog.VmVersion,
- Code: prog.Code,
+ Code: witnessProgram(prog.Code),
Arguments: args,
EntryID: entryID.Bytes(),
return result
}
+func witnessProgram(prog []byte) []byte {
+ if segwit.IsP2WPKHScript(prog) {
+ if witnessProg, err := segwit.ConvertP2PKHSigProgram([]byte(prog)); err == nil {
+ return witnessProg
+ }
+ } else if segwit.IsP2WSHScript(prog) {
+ if witnessProg, err := segwit.ConvertP2SHProgram([]byte(prog)); err == nil {
+ return witnessProg
+ }
+ }
+ return prog
+}
+
type entryContext struct {
entry bc.Entry
entries map[bc.Hash]bc.Entry
return builder.Build()
}
+// P2WPKHProgram return the segwit pay to public key hash
+func P2WPKHProgram(hash []byte) ([]byte, error) {
+ builder := NewBuilder()
+ builder.AddInt64(0)
+ builder.AddData(hash)
+ return builder.Build()
+}
+
+// P2WSHProgram return the segwit pay to script hash
+func P2WSHProgram(hash []byte) ([]byte, error) {
+ builder := NewBuilder()
+ builder.AddInt64(0)
+ builder.AddData(hash)
+ return builder.Build()
+}
+
// P2PKHSigProgram generates the script for control with pubkey hash
func P2PKHSigProgram(pubkeyHash []byte) ([]byte, error) {
builder := NewBuilder()
import (
"fmt"
- "testing"
- "time"
- "os"
cfg "github.com/bytom/config"
"github.com/bytom/crypto/ed25519/chainkd"
- "github.com/bytom/node"
"github.com/bytom/util"
)
}
// Test node running.
-func TestRunNode(t *testing.T) {
+/*func TestRunNode(t *testing.T) {
// Create & start node
config := mockConfig()
n := node.NewNodeDefault(config)
}()
// Trap signal, run forever.
n.RunForever()
-}
+}*/