package account
import (
- "crypto/hmac"
- "crypto/sha256"
+ "encoding/hex"
"encoding/json"
- "fmt"
"reflect"
"sort"
"strings"
"github.com/vapor/consensus"
"github.com/vapor/consensus/segwit"
"github.com/vapor/crypto"
- "github.com/vapor/crypto/ed25519"
"github.com/vapor/crypto/ed25519/chainkd"
"github.com/vapor/crypto/sha3pool"
- chainjson "github.com/vapor/encoding/json"
- "github.com/vapor/equity/compiler"
+ "github.com/vapor/equity/pegin_contract"
"github.com/vapor/errors"
"github.com/vapor/protocol"
"github.com/vapor/protocol/bc"
func (m *Manager) CreatePeginAddress(accountID string, change bool) (string, []byte, error) {
// 通过配置获取
- claimCtrlProg, _ := m.CreateAddress(accountID, change)
+ claimCtrlProg, err := m.CreateAddress(accountID, change)
+ if err != nil {
+ return "", nil, err
+ }
claimScript := claimCtrlProg.ControlProgram
federationRedeemScript := vmutil.CalculateContract(consensus.ActiveNetParams.FedpegXPubs, claimScript)
return address.EncodeAddress(), program
}
-var lockWith2of3KeysFmt = `
-contract LockWith3Keys(%s) locks amount of asset {
- clause unlockWith2Sigs(%s) {
- verify checkTxMultiSig(%s)
- unlock amount of asset
- }
-}
-`
-
-func (m *Manager) CreatePeginContractAddress(accountID string, change bool) (string, []byte, error) {
+func (m *Manager) CreatePeginContractPrograms(accountID string, change bool) (string, []byte, error) {
// 通过配置获取
claimCtrlProg, err := m.CreateAddress(accountID, change)
if err != nil {
}
claimScript := claimCtrlProg.ControlProgram
- peginContractPrograms, err := m.getPeginContractPrograms(claimScript)
+ peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
if err != nil {
return "", nil, err
}
+ return hex.EncodeToString(peginContractPrograms), claimScript, nil
- scriptHash := crypto.Sha256(peginContractPrograms)
+}
- address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
+func (m *Manager) CreatePeginContractAddress(accountID string, change bool) (string, []byte, []byte, error) {
+ // 通过配置获取
+ claimCtrlProg, err := m.CreateAddress(accountID, change)
if err != nil {
- return "", nil, err
+ return "", nil, nil, err
}
+ claimScript := claimCtrlProg.ControlProgram
- return address.EncodeAddress(), claimScript, nil
-
-}
-
-func (m *Manager) GetPeginContractControlPrograms(claimScript []byte) (string, []byte) {
-
- peginContractPrograms, err := m.getPeginContractPrograms(claimScript)
+ peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
if err != nil {
- return "", nil
+ return "", nil, nil, err
}
+
scriptHash := crypto.Sha256(peginContractPrograms)
address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
if err != nil {
- return "", nil
+ return "", nil, nil, err
}
redeemContract := address.ScriptAddress()
program := []byte{}
program, err = vmutil.P2WSHProgram(redeemContract)
if err != nil {
- return "", nil
+ return "", nil, nil, err
}
- return address.EncodeAddress(), program
-}
-
-func (m *Manager) getPeginContractPrograms(claimScript []byte) ([]byte, error) {
-
- pubkeys := getNewXpub(consensus.ActiveNetParams.FedpegXPubs, claimScript)
- num := len(pubkeys)
- fmt.Println(pubkeys)
- if num == 0 {
- return nil, errors.New("Fedpeg's XPubs is empty")
- }
- params := ""
- unlockParams := ""
- checkParams := "["
+ return address.EncodeAddress(), program, claimScript, nil
- for index := 0; index < num; index++ {
- param := fmt.Sprintf("pubkey%d", index+1)
- params += param
- checkParams += param
- if (index + 1) < num {
- params += ","
- checkParams += ","
- }
- }
- params += ": PublicKey"
- checkParams += "],["
-
- fmt.Println(params)
- signNum := getNumberOfSignaturesRequired(pubkeys)
- for index := 0; index < signNum; index++ {
- param := fmt.Sprintf("sig%d", index+1)
- unlockParams += param
- checkParams += param
- if index+1 < signNum {
- unlockParams += ","
- checkParams += ","
- }
- }
-
- unlockParams += ": Signature"
- checkParams += "]"
-
- lockWith2of3Keys := fmt.Sprintf(lockWith2of3KeysFmt, params, unlockParams, checkParams)
- fmt.Println(lockWith2of3Keys)
- r := strings.NewReader(lockWith2of3Keys)
- compiled, err := compiler.Compile(r)
- if err != nil {
- return nil, errors.New("Compile contract failed")
- }
-
- contract := compiled[len(compiled)-1]
+}
- if num < len(contract.Params) {
- return nil, errors.New("Compile contract failed")
- }
+func (m *Manager) GetPeginContractControlPrograms(claimScript []byte) (string, []byte) {
- contractArgs, err := convertArguments(contract, pubkeys)
+ peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
if err != nil {
- fmt.Println("Convert arguments into contract parameters error:", err)
- return nil, errors.New("Convert arguments into contract parameters error")
+ return "", nil
}
+ scriptHash := crypto.Sha256(peginContractPrograms)
- instantProg, err := instantiateContract(contract, contractArgs)
+ address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
if err != nil {
- fmt.Println("Instantiate contract error:", err)
- return nil, errors.New("Instantiate contract error")
- }
-
- return instantProg, nil
-}
-
-func getNewXpub(federationRedeemXPub []chainkd.XPub, claimScript []byte) []ed25519.PublicKey {
-
- var pubkeys []ed25519.PublicKey
- for _, xpub := range federationRedeemXPub {
- // pub + scriptPubKey 生成一个随机数A
- var tmp [32]byte
- h := hmac.New(sha256.New, xpub[:])
- h.Write(claimScript)
- tweak := h.Sum(tmp[:])
- // pub + A 生成一个新的公钥pub_new
- chaildXPub := xpub.Child(tweak)
- pubkeys = append(pubkeys, chaildXPub.PublicKey())
+ return "", nil
}
- return pubkeys
-}
-func getNumberOfSignaturesRequired(pubkeys []ed25519.PublicKey) int {
- return len(pubkeys)/2 + 1
-}
+ redeemContract := address.ScriptAddress()
-// InstantiateContract instantiate contract parameters
-func instantiateContract(contract *compiler.Contract, args []compiler.ContractArg) ([]byte, error) {
- program, err := compiler.Instantiate(contract.Body, contract.Params, contract.Recursive, args)
+ program := []byte{}
+ program, err = vmutil.P2WSHProgram(redeemContract)
if err != nil {
- return nil, err
- }
-
- return program, nil
-}
-
-func convertArguments(contract *compiler.Contract, args []ed25519.PublicKey) ([]compiler.ContractArg, error) {
- var contractArgs []compiler.ContractArg
- for i, p := range contract.Params {
- var argument compiler.ContractArg
- switch p.Type {
- case "PublicKey":
- if len(args[i]) != 64 {
- return nil, errors.New("mismatch length for Asset/Hash/PublicKey argument")
- }
- argument.S = (*chainjson.HexBytes)(&args[i])
- default:
- return nil, errors.New("Contract parameter type error")
- }
- contractArgs = append(contractArgs, argument)
+ return "", nil
}
- return contractArgs, nil
+ return address.EncodeAddress(), program
}