X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=blobdiff_plain;f=account%2Faccounts.go;h=427b0421bbb1dc056f9a8bafcad10f06c1b11193;hp=010418356a332c03edd890805d832f76df4c1a84;hb=cc968002ceac2dfd7665c2ac2b4c32ab6017b525;hpb=8964bcf0ffc12618f95c54f6677fcf45c7919534 diff --git a/account/accounts.go b/account/accounts.go index 01041835..427b0421 100644 --- a/account/accounts.go +++ b/account/accounts.go @@ -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 -}