// generateKeys is the high-level logic for generating public/private key pairs with the 'go-bitcoin-multisig keys' subcommand. // Takes flagCount (desired number of key pairs) and flagConcise (true hides warnings and helpful messages for conciseness) // as arguments. func generateKeys(flagKeyCount int) ([]string, []string, []string) { publicKeyHexs := make([]string, flagKeyCount) publicAddresses := make([]string, flagKeyCount) privateKeyWIFs := make([]string, flagKeyCount) for i := 0; i <= flagKeyCount-1; i++ { //Generate private key privateKey := btcutils.NewPrivateKey() //Generate public key from private key publicKey, err := btcutils.NewPublicKey(privateKey) if err != nil { log.Fatal(err) } //Get hex encoded version of public key publicKeyHexs[i] = hex.EncodeToString(publicKey) //Get public address by hashing with SHA256 and RIPEMD160 and base58 encoding with mainnet prefix 00 publicKeyHash, err := btcutils.Hash160(publicKey) if err != nil { log.Fatal(err) } publicAddresses[i] = base58check.Encode("00", publicKeyHash) //Get private key in Wallet Import Format (WIF) by base58 encoding with prefix 80 privateKeyWIFs[i] = base58check.Encode("80", privateKey) } return privateKeyWIFs, publicKeyHexs, publicAddresses }
// generateAddress is the high-level logic for creating P2SH multisig addresses with the 'go-bitcoin-multisig address' subcommand. // Takes flagM (number of keys required to spend), flagN (total number of keys) // and flagPublicKeys (comma separated list of N public keys) as arguments. func generateAddress(flagM int, flagN int, flagPublicKeys string) (string, string) { //Convert public keys argument into slice of public key bytes with necessary tidying flagPublicKeys = strings.Replace(flagPublicKeys, "'", "\"", -1) //Replace single quotes with double since csv package only recognizes double quotes publicKeyStrings, err := csv.NewReader(strings.NewReader(flagPublicKeys)).Read() if err != nil { log.Fatal(err) } publicKeys := make([][]byte, len(publicKeyStrings)) for i, publicKeyString := range publicKeyStrings { publicKeyString = strings.TrimSpace(publicKeyString) //Trim whitespace publicKeys[i], err = hex.DecodeString(publicKeyString) //Get private keys as slice of raw bytes if err != nil { log.Fatal(err, "\n", "Offending publicKey: \n", publicKeyString) } } //Create redeemScript from public keys redeemScript, err := btcutils.NewMOfNRedeemScript(flagM, flagN, publicKeys) if err != nil { log.Fatal(err) } redeemScriptHash, err := btcutils.Hash160(redeemScript) if err != nil { log.Fatal(err) } //Get P2SH address by base58 encoding with P2SH prefix 0x05 P2SHAddress := base58check.Encode("05", redeemScriptHash) //Get redeemScript in Hex redeemScriptHex := hex.EncodeToString(redeemScript) return P2SHAddress, redeemScriptHex }