BTC 地址
比特币地址(Bitcoin Address)是用于吸收和发送比特币的唯一标识符,雷同于传统金融系统中的银行账号。一个比特币地址由一串字母和数字组成,通常以1、3或bc1开头,具体长度为26至35个字符。以下是比特币地址的主要类型及其特点:[*]P2PKH地址(Pay-to-PubKey-Hash):
[*]以“1”开头。
[*]例子:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
[*]最为传统和常见的比特币地址类型。
[*]P2SH地址(Pay-to-Script-Hash):
[*]以“3”开头。
[*]例子:3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy
[*]用于实现更复杂的付出条件,比方多重签名地址。
[*]Bech32地址(也称为SegWit地址):
[*]以“bc1”开头。
[*]例子:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf3q0s
[*]这是比特币协议升级SegWit(隔离见证)后的新地址格式,提供更高的效率和安全性。
地址生成过程
比特币地址是通过以下步调生成的:
[*]私钥生成:通过随机生成一个256位的数字,即私钥。私钥是保密的,任何人掌握私钥就能控制相关地址中的比特币。
[*]公钥生成:利用椭圆曲线加密算法(通常是SECP256K1),从私钥生成公钥。
[*]公钥哈希:对公钥进行两次哈希:第一次利用SHA-256,第二次利用RIPEMD-160,生成公钥哈希(Public Key Hash)。
[*]添加版本字节和校验和:
[*]在公钥哈希前添加一个版本字节(比方,P2PKH地址的版本字节为0x00)。
[*]对上述数据进行两次SHA-256哈希,从中取前4字节作为校验和,并添加到数据末尾。
[*]Base58编码:末了,对结果进行Base58编码,生成终极的比特币地址。
利用与安全
[*]吸收比特币:用户可以将自己的比特币地址提供给他人,以吸收比特币。
[*]发送比特币:用户必要用相应的私钥对交易进行签名,证明其对地址内比特币的所有权,然后广播交易到比特币网络。
安全发起
[*]保管私钥:私钥应安全存储,不能泄露给他人。发起利用硬件钱包或离线冷钱包来存储私钥。
[*]备份:定期备份私钥或助记词,以防丢失。
[*]审慎利用:尽量避免在不安全的网络或设备上操作比特币交易。
btcd示例
利用btcutil来创建比特币地址涉及几个步调,包括生成密钥对(私钥和公钥),然后利用公钥生成地址。
func NewBTCAddress(){
// 生成私钥
privKey, err := btcec.NewPrivateKey()
if err != nil {
panic(err)
}
// 导出公钥
pubKey := privKey.PubKey()
// 生成BTC地址(P2PKH)
addressPKH, err := btcutil.NewAddressPubKey(pubKey.SerializeUncompressed(), &chaincfg.MainNetParams)
if err != nil{
panic(err)
}
fmt.Printf("Private Key: %x\n",privKey.Serialize())
fmt.Printf("Public Key: %x\n",pubKey.SerializeUncompressed())
fmt.Printf("BTC Address: %s\n",addressPKH.EncodeAddress())
// 生成公钥hash
pubKeyHash := btcutil.Hash160(pubKey.SerializeCompressed())
// 创建一个简单的多重签名脚本
script, err := txscript.NewScriptBuilder().AddOp(txscript.OP_DUP).
AddOp(txscript.OP_HASH160).AddData(pubKeyHash).
AddOp(txscript.OP_EQUALVERIFY).AddOp(txscript.OP_CHECKSIG).Script()
if err != nil {
panic(err)
}
// 生成P2SH地址
addressP2SH, err := btcutil.NewAddressScriptHashFromHash(pubKeyHash, &chaincfg.MainNetParams)
if err != nil{
panic(err)
}
fmt.Printf("P2SH Address: %s\n",addressP2SH.EncodeAddress())
// 生成Bech32地址(P2WPKH)
addressBech32,err := btcutil.NewAddressWitnessPubKeyHash(pubKeyHash, &chaincfg.MainNetParams)
if err != nil{
panic(err)
}
fmt.Printf("Bech32 Address: %s\n",addressBech32.EncodeAddress())
}https://img2023.cnblogs.com/blog/1007709/202308/1007709-20230810162948167-1526955652.jpg声明:本作品采用署名-非商业性利用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行允许,利用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]