比特币地址(Bitcoin Address)是用于接收和发送比特币的唯一标识符,类似于传统金融系统中的银行账号。一个比特币地址由一串字母和数字组成,通常以1、3或bc1开头,具体长度为26至35个字符。以下是比特币地址的主要类型及其特点:

  1. P2PKH地址(Pay-to-PubKey-Hash)

    • 以“1”开头。
    • 例子:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
    • 最为传统和常见的比特币地址类型。
  2. P2SH地址(Pay-to-Script-Hash)
    • 以“3”开头。
    • 例子:3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy
    • 用于实现更复杂的支付条件,例如多重签名地址。
  3. Bech32地址(也称为SegWit地址)
    • 以“bc1”开头。
    • 例子:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf3q0s
    • 这是比特币协议升级SegWit(隔离见证)后的新地址格式,提供更高的效率和安全性。

地址生成过程

比特币地址是通过以下步骤生成的:

  1. 私钥生成:通过随机生成一个256位的数字,即私钥。私钥是保密的,任何人掌握私钥就能控制相关地址中的比特币。
  2. 公钥生成:使用椭圆曲线加密算法(通常是SECP256K1),从私钥生成公钥。
  3. 公钥哈希:对公钥进行两次哈希:第一次使用SHA-256,第二次使用RIPEMD-160,生成公钥哈希(Public Key Hash)。
  4. 添加版本字节和校验和
    • 在公钥哈希前添加一个版本字节(例如,P2PKH地址的版本字节为0x00)。
    • 对上述数据进行两次SHA-256哈希,从中取前4字节作为校验和,并添加到数据末尾。
  5. Base58编码:最后,对结果进行Base58编码,生成最终的比特币地址。

使用与安全

  • 接收比特币:用户可以将自己的比特币地址提供给他人,以接收比特币。
  • 发送比特币:用户需要用相应的私钥对交易进行签名,证明其对地址内比特币的所有权,然后广播交易到比特币网络。

安全建议

  1. 保管私钥:私钥应安全存储,不能泄露给他人。建议使用硬件钱包或离线冷钱包来存储私钥。
  2. 备份:定期备份私钥或助记词,以防丢失。
  3. 谨慎使用:尽量避免在不安全的网络或设备上操作比特币交易。

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())
}

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特


BTC 地址的更多相关文章

  1. 定制比特币btc地址address

    https://99bitcoins.com/how-to-get-a-custom-bitcoin-address/ https://en.bitcoin.it/wiki/Vanitygen htt ...

  2. 利用vanitygen生成比特币个性地址的教程

      比特币怎么生成地址?大家都知道比特币地址都是以1开头的一串乱码,很多朋友会新建过一排地址然后在里面挑选,下面小编为大家分享下比特币生成个性地址方法. 其实就是使用vanitygen软件来生成个性化 ...

  3. 如何跟踪比特币SV(BSV)地址余额?

    Coin Balance Tracker 能够查看任何BSV/BCH/BTC地址的当前余额.您只需要确保你的电脑能连接Internet以及地址正确.此程序非常安全,因为它只使用公共数据,不需要登录和密 ...

  4. node.js与比特币(typescript实现)

    BTC中的utxo模型 BTC中引入了许多创新的概念与技术,区块链.PoW共识.RSA加密.萌芽阶段的智能合约等名词是经常被圈内人所提及,诚然这些创新的实现使得BTC变成了一种有可靠性和安全性保证的封 ...

  5. 关于比特币的“冷存储”和Armory的使用

    转自:http://8btc.com/thread-1164-1-1.html 最近随着比特币话题的火热,又有一批人卖房或倾产换成比特币入圈,这一次与以前不同的是,以前倾产入圈的人都是技术人员,有足够 ...

  6. 如何保护好我们的比特币(bitcoin)

    转自:http://8btc.com/thread-819-1-1.html 随着比特币(BTC)的使用者越来越多:价格也很高(2013年,1比特币价格长期在100美元以上):同时比特币没有一个中央机 ...

  7. YIIMP矿池搭建

    本文将以Verge(x17)和Raven(x16rv2)为例子来说明多算法矿池YIIMP的搭建过程. 1 环境准备 1.1 准备Ubuntu 准备虚拟机或物理机,操作系统为Ubuntu 18.04,之 ...

  8. Bminer

    Bminer https://www.bminer.me/zh/ Bminer: When Crypto-mining Made Fast¶ Bminer是一款为NVIDIA和AMD GPU深度优化的 ...

  9. 业内首发 | 区块链数据服务 - BDS

    区块链数据服务(Blockchain Data Service,BDS)是京东云区块链产品部发推出的,其将区块链的链式.非结构化数据通过技术手段进行结构化存储,实时同步到高性能数据仓库中. 用户可以通 ...

  10. 最著名的著名的比特币BTC钱包地址-中本聪的钱包

    最著名的著名的比特币BTC钱包地址-中本聪的钱包1.比特币创始人中本聪 1PTFYUG6nCzRrByoRfGT5kefUNuZjNF84o这个地址还是比特币的创世地址,比特币从未移动过,其中的50币 ...

随机推荐

  1. pymysql的基本操作

    1.Python3连接MySQL import pymysql pymysql.connect(host='localhost',user='root',password='1',database=' ...

  2. Android 12(S) MultiMedia Learning(五)NuPlayer

    之前几节看到MediaPlayer的java接口最终会调用到native层中的NuPlayer,NuPlayer由Render,DecoderBase,Source三部分组成. Render:负责AV ...

  3. rabbitmq添加延时通道时报错

    rabbitmq添加延时通道时报错 'x-delayed-type' must be an existing exchange type 解决方案: 我实际用的是x-delayed-type:topi ...

  4. 深入探讨Function Calling:实现外部函数调用的工作原理

    引言 Function Calling 是一个允许大型语言模型(如 GPT)在生成文本的过程中调用外部函数或服务的功能. Function Calling允许我们以 JSON 格式向 LLM 模型描述 ...

  5. 逆向WeChat(四)

    本篇在博客园地址https://www.cnblogs.com/bbqzsl/p/18209439 mars 先回顾一下,在上两篇我对wechat如何使用chrome::base框架的分析中存有错漏. ...

  6. NumPy 均匀分布模拟及 Seaborn 可视化教程

    均匀分布 简介 均匀分布是一种连续概率分布,表示在指定范围内的所有事件具有相等的发生概率.它常用于模拟随机事件,例如生成随机数或选择随机样本. 参数 均匀分布用两个参数来定义: a:下限,表示分布的最 ...

  7. C++笔记(4)友元

    通常情况下,公有类方法是访问类对象私有部分的唯一途径.除此之外,C++还提供了另外一种形式的访问权限:友元. 友元有三种: 友元函数 友元类 友元成员函数 通过让函数成为类的友元,可以赋予该函数与类的 ...

  8. golang 泛型的格式写法

    Go语言中的泛型(Generics)是在 Go 1.18 版本中引入的一个重要特性,它允许你编写可重用的代码,而不需要为每种数据类型重复编写相同的逻辑. 泛型通过参数化类型(type paramete ...

  9. Java对称加解密算法AES

    Java对称加解密算法AES import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.String ...

  10. http请求方式-CloseableHttpClient

    http请求方式-CloseableHttpClient import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObjec ...