比特币地址(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. MyBatis数据源模块源码分析

    数据源对象是比较复杂的对象,其创建过程相对比较复杂,对于 MyBatis 创建数据源,具体来讲有如下难点: MyBatis 不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 数据源的初始化参 ...

  2. zabbix笔记_006 zabbix web监控

    web监控 web监控是对http网站服务进行监控,模拟用户访问网站,对特定的结果进行告警,通知管理员网站状态. web监控是运维必备知识点,通过实验能够熟悉配置和了解zabbix是如何监控web站点 ...

  3. Qt-FFmpeg开发-保存视频流裸流(11)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-保存视频流裸流 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-保存视频流裸流 1.概述 2.实现效果 3.FFmpeg保存裸流代码流 ...

  4. RTMP协议中的Chunk Stream ID (CID)的作用

    一.协议分层 RTMP包是以Message的结构封装的,结构如下所示: 1)Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需 ...

  5. ncnn的blob_vkallocator、workspace_vkallocator、staging_vkallocator区别

    ncnn::Extractor中有三个成员函数: void set_blob_vkallocator(VkAllocator* allocator); void set_workspace_vkall ...

  6. 小米 红米 Redmi 屏幕录制默认参数设置

    小米 红米 Redmi 屏幕录制默认参数设置 视频画质:16Mbps. 帧数:60fps.

  7. C# .NET HttpWebRequest 按每个(单个)请求跳过证书校验

    C# .NET HttpWebRequest 按每个(单个)请求跳过证书校验 自签名证书 HTTPS TLS . 使用.NET 4.5 新加的属性 HttpWebRequest.ServerCerti ...

  8. C#.NET FRAMEWORK ASP.NET MVC 获取客户端IP

    C#.NET FRAMEWORK ASP.NET MVC 获取客户端IP 工具类: using System; namespace CommonUtils { public static class ...

  9. vue bus传参

    新建一个js文件,命名为bus.js.bus.js文件的内容为: import Vue from 'vue' const bus = new Vue() export default bus 页面de ...

  10. vue排行榜 加单位