OSDN Git Service

fix ci
[bytom/vapor.git] / account / accounts.go
index 0104183..427b042 100644 (file)
@@ -2,11 +2,8 @@
 package account
 
 import (
-       "crypto/hmac"
-       "crypto/sha256"
        "encoding/hex"
        "encoding/json"
-       "fmt"
        "reflect"
        "sort"
        "strings"
@@ -22,11 +19,9 @@ import (
        "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"
@@ -795,7 +790,10 @@ func (m *Manager) SaveControlPrograms(progs ...*CtrlProgram) error {
 
 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)
@@ -831,15 +829,6 @@ func (m *Manager) GetPeginControlPrograms(claimScript []byte) (string, []byte) {
        return address.EncodeAddress(), program
 }
 
-var lockWith2of3KeysFmt = `
-contract LockWith2of3Keys(%s) locks amount of asset {
-  clause unlockWith2Sigs(%s) {
-    verify checkTxMultiSig(%s)
-    unlock amount of asset
-  }
-}
-`
-
 func (m *Manager) CreatePeginContractPrograms(accountID string, change bool) (string, []byte, error) {
        // 通过配置获取
        claimCtrlProg, err := m.CreateAddress(accountID, change)
@@ -848,7 +837,7 @@ func (m *Manager) CreatePeginContractPrograms(accountID string, change bool) (st
        }
        claimScript := claimCtrlProg.ControlProgram
 
-       peginContractPrograms, err := m.GetPeginContractPrograms(claimScript)
+       peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
        if err != nil {
                return "", nil, err
        }
@@ -856,33 +845,41 @@ func (m *Manager) CreatePeginContractPrograms(accountID string, change bool) (st
 
 }
 
-func (m *Manager) CreatePeginContractAddress(accountID string, change bool) (string, []byte, error) {
+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
 
-       peginContractPrograms, err := m.GetPeginContractPrograms(claimScript)
+       peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
        if err != nil {
-               return "", nil, err
+               return "", nil, nil, err
        }
 
        scriptHash := crypto.Sha256(peginContractPrograms)
 
        address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
        if err != nil {
-               return "", nil, err
+               return "", nil, nil, err
        }
 
-       return address.EncodeAddress(), claimScript, nil
+       redeemContract := address.ScriptAddress()
+
+       program := []byte{}
+       program, err = vmutil.P2WSHProgram(redeemContract)
+       if err != nil {
+               return "", nil, nil, err
+       }
+
+       return address.EncodeAddress(), program, 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
        }
@@ -903,114 +900,3 @@ func (m *Manager) GetPeginContractControlPrograms(claimScript []byte) (string, [
 
        return address.EncodeAddress(), program
 }
-
-func (m *Manager) GetPeginContractPrograms(claimScript []byte) ([]byte, error) {
-
-       pubkeys := getNewXpub(consensus.ActiveNetParams.FedpegXPubs, claimScript)
-       num := len(pubkeys)
-       if num == 0 {
-               return nil, errors.New("Fedpeg's XPubs is empty")
-       }
-       params := ""
-       unlockParams := ""
-       checkParams := "["
-
-       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 += "],["
-
-       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)
-       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")
-       }
-
-       contractArgs, err := convertArguments(contract, pubkeys)
-       if err != nil {
-               fmt.Println("Convert arguments into contract parameters error:", err)
-               return nil, errors.New("Convert arguments into contract parameters error")
-       }
-
-       instantProg, err := instantiateContract(contract, contractArgs)
-       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 pubkeys
-}
-
-func getNumberOfSignaturesRequired(pubkeys []ed25519.PublicKey) int {
-       return len(pubkeys)/2 + 1
-}
-
-// 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)
-       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":
-                       argument.S = (*chainjson.HexBytes)(&args[i])
-               default:
-                       return nil, errors.New("Contract parameter type error")
-               }
-               contractArgs = append(contractArgs, argument)
-       }
-
-       return contractArgs, nil
-}