github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/tools/mkmulti/mkmulti.go (about) 1 package main 2 3 import ( 4 "os" 5 "fmt" 6 "bytes" 7 "strconv" 8 "io/ioutil" 9 "encoding/hex" 10 "github.com/piotrnar/gocoin/lib/btc" 11 ) 12 13 /* 14 { 15 "address" : "2NAHUDSC1EmbTBwQQp4VQ2FNzWDqHtmk1i6", 16 "redeemScript" : "512102cdc4fff0ad031ea5f2d0d4337e2bf976b84334f8f80b08fe3f69886d58bc5a8a2102ebf54926d3edaae51bde71f2976948559a8d43fce52f5e7ed9ed85dbaa449d7f52ae" 17 } 18 */ 19 func main() { 20 var testnet bool 21 if len(os.Args)<3 { 22 fmt.Println("Specify one integer and at least one public key.") 23 fmt.Println("For Testent, make the integer negative.") 24 return 25 } 26 cnt, er := strconv.ParseInt(os.Args[1], 10, 32) 27 if er!=nil { 28 println("Count value:", er.Error()) 29 return 30 } 31 if cnt<0 { 32 testnet = true 33 cnt = -cnt 34 } 35 if cnt<1 || cnt>16 { 36 println("The integer (required number of keys) must be between 1 and 16") 37 return 38 } 39 buf := new(bytes.Buffer) 40 buf.WriteByte(byte(0x50+cnt)) 41 fmt.Println("Trying to prepare multisig address for", cnt, "out of", len(os.Args)-2, "public keys ...") 42 var pkeys byte 43 var ads string 44 for i:=2; i<len(os.Args); i++ { 45 if pkeys==16 { 46 println("Oh, give me a break. You don't need more than 16 public keys - stopping here!") 47 break 48 } 49 d, er := hex.DecodeString(os.Args[i]) 50 if er != nil { 51 println("pubkey", i, er.Error()) 52 } 53 _, er = btc.NewPublicKey(d) 54 if er != nil { 55 println("pubkey", i, er.Error()) 56 return 57 } 58 pkeys++ 59 buf.WriteByte(byte(len(d))) 60 buf.Write(d) 61 if ads!="" { 62 ads += ", " 63 } 64 ads += "\"" + btc.NewAddrFromPubkey(d, btc.AddrVerPubkey(testnet)).String() + "\"" 65 } 66 buf.WriteByte(0x50+pkeys) 67 buf.WriteByte(0xae) 68 69 p2sh := buf.Bytes() 70 addr := btc.NewAddrFromPubkey(p2sh, btc.AddrVerScript(testnet)) 71 72 rec := "{\n" 73 rec += fmt.Sprintf("\t\"multiAddress\" : \"%s\",\n", addr.String()) 74 rec += fmt.Sprintf("\t\"scriptPubKey\" : \"a914%s87\",\n", hex.EncodeToString(addr.Hash160[:])) 75 rec += fmt.Sprintf("\t\"keysRequired\" : %d,\n", cnt) 76 rec += fmt.Sprintf("\t\"keysProvided\" : %d,\n", pkeys) 77 rec += fmt.Sprintf("\t\"redeemScript\" : \"%s\",\n", hex.EncodeToString(p2sh)) 78 rec += fmt.Sprintf("\t\"listOfAddres\" : [%s]\n", ads) 79 rec += "}\n" 80 fname := addr.String()+".json" 81 ioutil.WriteFile(fname, []byte(rec), 0666) 82 fmt.Println("The address record stored in", fname) 83 }