OSDN Git Service

670b98026dc85194a1876a9250a649f8a4eb4616
[bytom/vapor.git] / federation / util / script.go
1 package util
2
3 import (
4         "sort"
5
6         log "github.com/sirupsen/logrus"
7
8         "github.com/vapor/crypto"
9         "github.com/vapor/crypto/ed25519/chainkd"
10         "github.com/vapor/federation/config"
11         "github.com/vapor/protocol/vm/vmutil"
12 )
13
14 func SegWitWrap(script []byte) []byte {
15         scriptHash := crypto.Sha256(script)
16         wscript, err := vmutil.P2WSHProgram(scriptHash)
17         if err != nil {
18                 log.Panicf("Fail converts scriptHash to witness: %v", err)
19         }
20
21         return wscript
22 }
23
24 func ParseFedProg(warders []config.Warder, quorum int) []byte {
25         SortWarders(warders)
26
27         xpubs := []chainkd.XPub{}
28         for _, w := range warders {
29                 xpubs = append(xpubs, w.XPub)
30         }
31
32         fedScript, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(xpubs), quorum)
33         if err != nil {
34                 log.Panicf("fail to generate federation scirpt for federation: %v", err)
35         }
36
37         return fedScript
38 }
39
40 type byPosition []config.Warder
41
42 func (w byPosition) Len() int           { return len(w) }
43 func (w byPosition) Swap(i, j int)      { w[i], w[j] = w[j], w[i] }
44 func (w byPosition) Less(i, j int) bool { return w[i].Position < w[j].Position }
45
46 func SortWarders(warders []config.Warder) []config.Warder {
47         sort.Sort(byPosition(warders))
48         return warders
49 }