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())
}
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特
BTC 地址的更多相关文章
- 定制比特币btc地址address
https://99bitcoins.com/how-to-get-a-custom-bitcoin-address/ https://en.bitcoin.it/wiki/Vanitygen htt ...
- 利用vanitygen生成比特币个性地址的教程
比特币怎么生成地址?大家都知道比特币地址都是以1开头的一串乱码,很多朋友会新建过一排地址然后在里面挑选,下面小编为大家分享下比特币生成个性地址方法. 其实就是使用vanitygen软件来生成个性化 ...
- 如何跟踪比特币SV(BSV)地址余额?
Coin Balance Tracker 能够查看任何BSV/BCH/BTC地址的当前余额.您只需要确保你的电脑能连接Internet以及地址正确.此程序非常安全,因为它只使用公共数据,不需要登录和密 ...
- node.js与比特币(typescript实现)
BTC中的utxo模型 BTC中引入了许多创新的概念与技术,区块链.PoW共识.RSA加密.萌芽阶段的智能合约等名词是经常被圈内人所提及,诚然这些创新的实现使得BTC变成了一种有可靠性和安全性保证的封 ...
- 关于比特币的“冷存储”和Armory的使用
转自:http://8btc.com/thread-1164-1-1.html 最近随着比特币话题的火热,又有一批人卖房或倾产换成比特币入圈,这一次与以前不同的是,以前倾产入圈的人都是技术人员,有足够 ...
- 如何保护好我们的比特币(bitcoin)
转自:http://8btc.com/thread-819-1-1.html 随着比特币(BTC)的使用者越来越多:价格也很高(2013年,1比特币价格长期在100美元以上):同时比特币没有一个中央机 ...
- YIIMP矿池搭建
本文将以Verge(x17)和Raven(x16rv2)为例子来说明多算法矿池YIIMP的搭建过程. 1 环境准备 1.1 准备Ubuntu 准备虚拟机或物理机,操作系统为Ubuntu 18.04,之 ...
- Bminer
Bminer https://www.bminer.me/zh/ Bminer: When Crypto-mining Made Fast¶ Bminer是一款为NVIDIA和AMD GPU深度优化的 ...
- 业内首发 | 区块链数据服务 - BDS
区块链数据服务(Blockchain Data Service,BDS)是京东云区块链产品部发推出的,其将区块链的链式.非结构化数据通过技术手段进行结构化存储,实时同步到高性能数据仓库中. 用户可以通 ...
- 最著名的著名的比特币BTC钱包地址-中本聪的钱包
最著名的著名的比特币BTC钱包地址-中本聪的钱包1.比特币创始人中本聪 1PTFYUG6nCzRrByoRfGT5kefUNuZjNF84o这个地址还是比特币的创世地址,比特币从未移动过,其中的50币 ...
随机推荐
- 工作面试老大难-MySQL中的锁类型
MySQL 是支持ACID特性的数据库.我们都知道"C"代表Consistent,当不同事务操作同一行记录时,为了保证一致性,需要对记录加锁.在MySQL 中,不同的引擎下的锁行为 ...
- AI实战 | 手把手带你打造校园生活助手
大家好,我是努力的小雨.最近,我开始将我的经验逐渐分享到B站,希望能够帮助大家通过扣子助手真正解决一些问题.最近有粉丝提出了一个需求,为了满足大家的期待,我已经制作了视频,详细介绍了这个助手的搭建思路 ...
- WPF插件之 - PropertyChanged.Fody使用详解
总目录文章目录总目录一.PropertyChanged.Fody是什么?二.PropertyChanged.Fody的安装三.PropertyChanged.Fody的功能1. 特性1 实现属性通知的 ...
- .NET周刊【5月第4期 2024-05-26】
国内文章 开源低代码框架 ReZero API 正式版本发布 ,界面操作直接生成API https://www.cnblogs.com/sunkaixuan/p/18201175 ReZero是一款. ...
- 深入浅出Java异常机制
一次对Java异常机制的理解 近期有一个对接三方接口的任务,在这个过程中用到了许多 try-catch 处理,发现自己对异常处理是一知半解,浅浅研究了一下,记录一下,也帮助小伙伴如何正确使用 try- ...
- Windows程序读取不了中文路径问题
问题描述 今天调试发现win32接口GetFileAttributesW居然不支持中文路径,于是寻找解决方案,找了半天,尝试用boost的fileystem库发现能用,而且boost能跨平台! 不支持 ...
- 8.16考试总结(NOIP模拟41)[你相信引力吗·marshland·party?·半夜]
美丽的不是这个世界,而是看世界的你的眼神. T1 你相信引力吗 解题思路 好像只有我一个人没有看出来这个题是单调栈(现在一看区间问题就是双指针,线段树) 维护一个单调递减的栈. 我们把最大值放到左端点 ...
- C++笔记(3)引用
引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1.创建引用 int i = 0; int& r = i;/ ...
- echarts做饼图
今天记录下echarts做饼图 父组件 <el-card style="height:600px ;margin-top:20px" v-loading="card ...
- if语句嵌套
// if语句的嵌套 // 在if语句的{}中,执行程序中,再次有if语句 /* if(){ if(){ ...