㈠ 【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,
以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的
通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k1曲线,
公钥采用uncompressed模式,生成的私钥为长度32字节的16进制字串,公钥为长度64的公钥字串。公钥04开头。
把公钥去掉04,剩下的进行keccak-256的哈希,得到长度64字节的16进制字串,丢掉前面24个,拿后40个,再加上"0x",即为以太坊地址。
整个过程可以归纳为:
2)有些网关或系统只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。Base64使用【字母azAZ数字09和+/】这64个字符编码。原理是将3个字节转换成4个字节(3 X 8) = 24 = (4 X 6)
当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用'='占位,因此编码后输出的文本末尾可能会出现1至2个'='。
1)Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。 校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。使用 Base58check编码格式时,编码软件会计算原始数据的校验码并和结果数据中自带的校验码进行对比。二者不匹配则表明有错误产生,那么这个 Base58Check格式的数据就是无效的。例如,一个错误比特币地址就不会被钱包认为是有效的地址,否则这种错误会造成资金的丢失。
为了使用Base58Check编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数 据的类型。例如,比特币地址的前缀是0(十六进制是0x00),而对私钥编码时前缀是128(十六进制是0x80)。 表4-1会列出一些常见版本的前缀。
接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次SHA256哈希算法:
checksum = SHA256(SHA256(prefix+data))
在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。
结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程。
相同:
1) 哈希算法、Merkle树、公钥密码算法
https://blog.csdn.net/s_lisheng/article/details/77937202?from=singlemessage
2)全新的 SHA-3 加密标准 —— Keccak
https://blog.csdn.net/renq_654321/article/details/79797428
3)在线加密算法
http://tools.jb51.net/password/hash_md5_sha
4)比特币地址生成算法详解
https://www.cnblogs.com/zhaoweiwei/p/address.html
5)Base58Check编码实现示例
https://blog.csdn.net/QQ604666459/article/details/82419527
6) 比特币交易中的签名与验证
https://www.jianshu.com/p/a21b7d72532f
㈡ 关于比特币的谜题(完结)
你可曾想过: 为什么矿机算力越大越好?(既然是解数学题那为什么不是拼谁的算法厉害啊喂!) 比特币的数量总和为什么是2100万? 比特币盗窃是怎么回事? 我不玩比特币,就真的与比特币无关了吗…… 🤔️
关于大众不再感到陌生的比特币,背后还有许多巧妙之处。本文介绍了比特币的基本原理和主要原则,并结合对部分技术细节的剖析,来对上述的一些疑问作出解答。全文较长,约7000字,阅读时间约为22分钟,建议收藏后阅读😁
文章可以分成以下几个部分:
* 比特币先验知识
-- 密码学相关
-- 比特币重要概念
* 交易的生命周期
* 区块链的构成
* 区块链的生长
-- “挖矿”的数学本质
-- “矿工”的收益
* 比特币的共识机制
-- 比特币的去中心化共识
-- “最长链优先”原则
* 比特币安全性
比特币作为第一个去中心化的数字货币,其设计中运用了不少的密码学相关知识,主要包括非对称加密技术、哈希函数等等。理解这些密码学知识,能帮助我们更好地理解比特币中的一些概念及规则。
以下是比特币的一些定义及概念解说,了解过的小伙伴们可以直接跳过~
在比特币这个创新的支付网络中,一个交易的生命周期大概可以分为几个阶段:创建、传播和被验证交织、被打包进区块记录到区块链中、获得更多的确认。图1对这几个阶段做出了示意。
注:
1⃣️一个支付方A在发起一个比特币交易时,会使用自己的私钥对交易信息的哈希值进行签名。因此A向全网广播的内容除了交易信息之外,还有自己的公钥信息、对消息的签名。其他矿工只要利用A的公钥即可对这个交易进行验证,判断是否真的由A创建。
2⃣️”交易传播和交易验证“交替意味着 各个节点基于一定的规则独立验证每个交易(共识基础1) , 一个节点只有认为这个交易有效才会把它继续传播出去。
比特币的底层技术是区块链。区块链系统是一种分布式共识系统,区块链网络中所有的参与节点将就交易的状态达成一致。
区块链到底是什么呢?你可以把它理解成一种分布式的交易的共享账本,以区块为基本单位链接在一起。交易信息将被整理并打包记录在区块中。每一个区块,包含区块头,以及紧跟其后的交易列表。区块头包含3个区块元数据集合:前序区块哈希(严格来说是前序区块头哈希,因为只有区块头被用于哈希运算)、元数据集(包括难度、时间戳、随机数等)、一个基于加密哈希来高效概括区块中所有交易的默克尔树(merkle tree)。了解这个结构,将帮助我们更好地理解挖矿的数学本质。
你可能听说过“挖矿”这个词,或者听说众人争相购买挖矿机器来发家致富。但让人疑惑的是:都说打包区块的本质是解数学难题,但单凭那些看似简陋的机器嗡嗡嗡疯狂耗费电力,就能确保自己解出比特币难题的胜率高了吗?比特币技术原理中,矿工们解决的数学题,难道是一个暴力破解题?
看了一圈,发现矿工们解决的题,还真有点暴力破解的意思,每次尝试解题的过程几乎都是茫茫然、去碰运气的。拼的是谁足够幸运,也拼谁算的足够快;算的快了么,试错次数多,自然胜算也就大了。
解题的背景是这样的—— 挖矿节点通过基于工作量证明算法(Proof-of-Work,POW)的证明运算,独立将交易汇聚到新区块中(共识基础2)。 当矿工从网络中接收到一个新的区块的时候,他发现自己已经在上一轮竞争中失败了,所以立即开始新区块的挖矿过程。为了创建一个新的区块,他从内存池中选择交易来填充区块(加入区块的第一笔交易是一个“铸币交易”,3.2节会给出详相关细节)。接下来是填充字段来创建区块头(包括前序区块的区块头哈希、交易的默克尔树(Merkel树)、时间戳、难度目标值、随机数),然后开始计算这个新区块的工作量证明。
这个计算的过程简单来说是对区块头部进行两次sha256运算,得到一个RESULT,如果这个RESULT满足特定要求,这个人才能算是算对了、才有权利去记账。满足要求的RESULT被称为“工作量证明”(中本聪论文中称为“proof of work”)。
关于这个计算过程,强调以下几点:
第一,区块头部,包含了前序区块头部的哈希、本区块交易信息的默克尔树、时间戳、难度目标值、随机数等信息(见图2)。
第二,哈希运算具有“知道y,无法推出使得h(x)=y成立的x”、“即使输入只改变一点点,输出也会差很多”、“利用任意长度的数据作为输入,生成一个固定长度的确定结果”的特性。所以大家也不知道什么样子的输入才能产生自己想要的结果,矿工只能不断尝试。
第三,前面说到,区块头哈希值需要满足一个特定要求才能成为工作量证明——小于某一阈值,或者说哈希值含有给定前缀。阈值的大小求和挖矿难度有关:挖矿难度是一个动态参数,其值越大,则阈值越小,说明哈希值符合要求的概率更小,矿工每次计算能成为工作量证明的概率越小。比特币有一个自我调节过程——通过对现有的挖矿算力情况进行估算,来对应调整挖矿难度,可以保证区块链每十分钟出一个块,达到控制发行速度的目的。(这个过程的基本思想类似产品笔试的数据估算题,根据“一个提供、一个需要“的思路去构造一个等式,然后求解等式一边的一个因子;想了解挖矿难度系统和调整方式的同学可以进一步查阅~)
综合以上三点来看,为了产生工作量证明,用户基本上会通过调整随机数来碰运气(因为其他字段基本不变)、进行多次运算直至符合要求,别无他法。如此一看,随机数就具有“幸运数字”的意味了。因此,平均来讲,谁计算的能力越强(尝试的次数越多),就更有希望打包块。
你可能会想,矿工这么心甘情愿地消耗算力去维护区块链,是受到怎样的利益驱使呢?简单来说,矿工的收益来源有二:1、计算出工作量证明,创造一个新区块所获得的新币奖励;2、记账矿工费。
当矿工找到工作量证明、打包一个新区块,并把区块传送给他的所有对等节点。 每一个挖矿节点都独立验证新区块、把合格的新区块整合进区块链(共识基础3) ,并把这个区块继续传给自己的对等节点。结果是,只有经过验证的区块才会在网络当中广泛传播,保证了诚实矿工挖出的新区块能被区块链所接纳。挖矿成功的个体节点或集体节点,可以同时获得新币奖励和记账矿工费。
新币奖励类似于货币的发行,其遵循规则是,第一个四年每一个新区块产生50btc,第二个四年每一个新区块产生25btc,第三个四年每个新区块产生12.5btc,如此周期指数递减。按照等比数列求和可知,到2140年,比特币产生的总和约为21000000(所以说比特币数量有限,天生紧缩)。届时,不再随区块的产生增加新的比特币,矿工不再拥有第一项收益。但现实中,由于挖矿成本高昂,挖矿成功的往往是是一个矿池的所有参与者。收益被分给矿池地址,矿池按照组内算力贡献比例来分摊收益的。
记账矿工费又称交易费用,以交易输入和交易输出之间的差值的形式存在;一个区块的总交易费用是对加入区块的所有交易的(交易输入-交易输出)求和。一般来说,矿工费越高的交易,会越快被处理。而矿工费在这里起到两个作用,一个是奖励矿工,另一个是防止主链滥用(防止大家发送交易垃圾信息,因为提出交易是有一定代价的)。
矿工的收益以什么样的形式被验证呢?这里不得不提到 “铸币交易” 。每个计算机节点在进行工作量证明计算之前加入区块的第一笔交易,正是“铸币交易”。这个交易从无到有生成比特币,其金额是新币奖励与记账矿工费的总和,被支付到挖矿矿工自己的比特币地址。如果矿工找到了一个工作量证明使区块有效,他就赢得了这个奖励,因为他构造的“铸币交易”生效了。
关于铸币交易和“新币奖励”,之前有一个读者问我:一个矿工把自己挖到新区块的消息公布出去,他的工作量证明 不会被别人剽窃 吗?
个人认为,至少“铸币交易”能防止这件事情发生。让我们来重申一下计算工作量证明的过程——一个矿工E在新区块里加入了奖赏自己的“铸币交易”,并利用时间戳、前序区块头哈希、随机数、本区块交易的merkle树等信息计算出一个符合要求的工作量证明。
在这个过程中,merkle树啥样子,取决于包括“铸币交易”在内的本区块所有交易信息。因此可以把铸币交易视为工作量证明的间接变量之一。那么,即使其他人拿到了E的工作量证明,这个工作量证明也是带有E的印记的、与奖赏E的铸币交易相关的,别人根本无法纳为己用。
你还可以通过设想以下的场景来加深对共识基础2“挖矿节点通过基于工作量证明算法的证明运算,独立将交易汇聚到新区块中”的理解。
为什么一个挖出新区块的矿工不悄悄使个心眼,在创建区块之初就把铸币交易的金额设成1000BTC呢?原因在于每个节点都是基于相同的规则来独立验证区块的。矿工必须创建完美的、符合公共规则的、正确依据工作量证明方法的区块;而一个无效的铸币交易会导致整个区块无效,并被其他节点拒绝,永远无法成为账本的一部分。可以预想,为了生成这个工作量证明,矿工们已经投入了巨大的算力和电量去挖矿,如果涉嫌欺诈而被否决,其为挖矿付出成本都付诸东流。
综上所述,矿工不能冒领他人的奖励,而拿到奖励的矿工也必须只能拿取符合规定的数额。
比特币的卓越之处,在于建立了一种去中心化的自发共识。这种共识是自发产生的,是成千上万在网络中遵循着共同规则的节点,在异步交互中形成的,不依赖于任何中央机构的调解和干涉。
关于比特币的4项主要共识基础,本文在讲解对应细节时有提及,下面做一个整合:
这四个过程相辅相成、互相作用,形成了自发的全网共识,促使全网节点组合出可信、公开、权威的总账。
你可能会想,比特币是一个去中心化的、基于大众信任的、依靠众人力量运转的一个东西。万一有一部分矿工被坏人收买了咋办呢?“51%攻击”指的又是什么?比特币交易所要求的“6个确认”又是怎么回事?
这里首先要提到比特币的一个规则“ 最长链优先 ”。意思是, 比特币的账单链在出现分叉的时候,每个矿工会独立选择长(累积了最多工作量证明)的链条,在上面继续挖矿工作(共识基础4) 。
这个原则主要涉及到两个问题:
当有两个矿工A和B同时挖矿成功(算出符合要求的数学答案)时,他们分别把自己计算出来的工作量证明作为下一个块的前序区块哈希,生成一个块衔接到原有的链后面,由此出现了两个分支。
这个时候,这两个成功的矿工广播了自己打包成功的消息。由于区块链是一个去中心化的数据结构,区块消息到达不同节点的时间点不一致,故不同的节点可能拥有不完全一样的区块链视图——有的矿工会先收到A的消息,有的则先收到B的消息。为了解决这个问题,收到消息的矿工们遵循一个原则:选择并尝试延长最长的链。
因此,这两条分支会各自成长一小段时间,直到他们的长度出现差异(不可能长度一直相同),比如说其中一条链的矿工们,更快地打包在支链后面又加上一块。按照“最长链优先“的规则,较短的链会被抛弃,原本工作在短链上的矿工们都回到长链上工作。
换言之,分叉只是不同节点暂时的不一致现象,当新区块被加入到其中某一分支时,最终收敛将解决这一个问题。[读者可以思考一下,为什么区块链被设置成每十分钟挖出来一个块:如果时间短了,是不是就增加了分支产生的次数?如果时间长了,是不是交易结算的效率就太低了?]
双重支付的本质其实也是区块链的分叉,但这种分叉却是“非自然恶意蓄谋”的产物。
我们假设小敏是密谋双重支付的一方,她把自己仅有的10BTC先给小强、交换一块黄金,待这条交易信息P被打包进区块Q后,她从小强手中拿到了黄金。这时,小敏使了个心眼,她想偷偷抹去、篡改区块Q上的交易信息P,“白嫖”这块黄金。为了实现这样的目的,根据“最长链优先”法则,小敏必须剔除该笔交易P后、重新进行结算工作,集中算力来形成分叉,并让分叉以更快的增速超过并取代Q所在的主链。如果小敏确实能让分叉更长,分叉就成为了主链,其他节点也会转向新主链上继续工作。这样,小强付出了黄金,却没有收到这10个比特币,“赔了夫人又折兵”。
在这个过程中,小敏需要和原链进行“抗争”,使新分叉成为最长的主链,这被称为“共识攻击”。“共识攻击”本质上是对下一区块的争夺,攻击方越“强壮”、哈希算力越大,就越容易成功。
“共识攻击“成功的可能性有多大呢?
大多数比特币交易所规定,一个交易传送到区块链上后需要6个「确认」来完成验证该笔交易。这一规定的根据是,假设意图造假的矿工拥有10%的算力(挖矿成功概率0.1),那么造假矿工要构造另一条伪链实施长度超越,必须至少成功挖矿6次。那么原链被取代、被抛弃的概率约为0.1的6次方,趋近于0。你可以把比特币理解为地质构造层,表层可能因为季节变换而有所改变,甚至可能被风刮走,但一旦深入到地下,地质层就能更加稳定、不受干扰。
而假设有一群拥有了51%算力的矿工,他们控制了一半以上的全网哈希算力,可以故意在区块链中制造分叉、进行双重支付交易 。但事实是,全网哈希算力的大量增加,个体矿工几乎不可能控制哪怕1%的哈希算力了(但矿池带来的算力集中化控制,存在一定的风险)。更何况,如果真有拥有如此强大算力的组织,他完全可以凭借自己强大的算力投入到挖矿中去获取开发新区块所获的的比特币奖励,诚实挖矿比双花更有利可图。
尽管实际上并未出现51%攻击的问题,但不可否认的是,算力的集中违背了比特币去中心化这一初衷,并成为其继续发展的一大隐患。
一个系统的安全性,往往取决于系统安全的最薄弱环节,这也就是所谓的“木桶原理“。与区块链系统相关的安全性问题包括但不限于以下几项:
(1)在区块链上被广泛使用的公钥系统基本上是安全的,但量子算法在理论上能够破解公钥系统;因此,区块链的算法安全性是相对的。
(2)区块链协议本身存在逻辑缺陷,例如受到黑客攻击的区块链系统共识机制。
(3)所有数字货币系统高度依赖私钥,私钥在存储、使用方面的安全性成为区块链系统安全性中至关紧要的一环。
尽管区块链是去中心化系统,但目前绝大多数数字交易所却是中心化的,存在着人为安全漏洞及技术安全漏洞。这些数字交易所拥有存放大量加密货币的私钥,这对于黑客来说无疑是最瞩目的目标;只要黑客偷走了这些私钥,就可以获取到这些加密货币。
作者会继续阅读相关资料、不断完善本文,目标是完成一篇通俗易懂的比特币科普文章。:)
**本文系网上信息与个人理解的结合,如有偏差及误读,欢迎读者指出。也欢迎给出关于文章结构上的指导~
㈢ BCC怎么挖矿
BCC挖矿和比特币挖矿是一样的,唯一不同的是采用了动态挖矿的策略。
BCC在刚诞生的时候延续了BTC的挖矿难度,矿工是出于信仰赔钱挖矿的,在比特币诞生之初甚至12个小时才出一个块,为了保证BCC网络稳定的发展,燃滚BCC采用挖矿难度动态调整策略,这样可以保证BCC的出块速度能够很好的适应算力的下降。
BTC是每2016个区块进行一次难度调整,而BCC在此基础之上增加了“如果过去6个区块的MTP间隔时间大于12小时,则下一个难度下调20%“的规则。目前,BCC挖矿难度已经降低了很多,是BTC挖矿难度的13%左右。BCC目前的出块速度已经接近平均10分钟出一个块。
BCC挖矿原理:
BCC的前世就是比特币,分叉之前它存储的区块链中的数据以及运行的软件是和所有比特币节点兼容的,而到了分叉那一刻以后,它开始执行新的代码,打包大区块,这样就在链上形成了一个硬分叉。目前BCC还是一个期货,将于8月1日正式分叉成为一个新币种。
比特币面临的安全问题:
用户的第一个安全威胁来自用户激活的硬分叉或UAHF-在分叉时控制其私钥的所有BTC持有人获得了相等数量的BCC。
那问题就来了:国内很多设计比特币的交易平台,但是需要注意的是:许多投资者使用第三方交易或不支持的软件钱包,但投资者本人没有控制其私钥,所以最终是第三方交易平台收到了新的货币。有些平台会通知客户,有些则不会。
许多投资者纷纷在硬分叉前几个小时将其持有的资产转移到支持的比特币钱包,而不拥有独立钱包的投资者只能等待。
网络钓鱼攻击或其他恶意攻击的机会众多,特别是考虑到大多数针对Bitcoin的成功恶意攻击都集中在控制私钥或黑客交换,而不是直接攻击货币。关于比特币安全,也可以加本人微信号seciot交流。
BCC在技术上与BTC非常相似,增加了更大皮猛余的区块化和事务重放保护,后者以一种新的签名方式形式。Bitcoin现金交易使用一个新的SIGHASH_FORKID,这可以防止Bitcoin现金交易在比特币块上被重播。
新签名HASH也带来了额外的好处,如输入值签名改进了硬件钱包的安全性,并消除的二次HASH问题。总之,它可以说在理论上比BTC更安全,它的目的是要启动和使用更快更便捷。
然而,BCC确实面临着一个主要的威胁,即大多数攻击,即单个实体获得网络处理能力的51%以上的安全风险。同时两个块链共享的共同敌人是中断攻击,多数攻知悄击者利用网络中断来分裂网络,用来提高成功几率。
同时分区网络和网络延迟攻击都是威胁,根据最新的研究paper显示,对于所谓的分散式网络来说,容易比假定的更少,其中20%的比特币节点被托管在少于100个IP前缀中。
㈣ 4. 比特币的密钥、地址和钱包 - 精通比特币笔记
比特币的所有权是通过密钥、比特币地址和数字签名共同确定的。密钥不存在于比特币网络中,而是用户自己保存,或者利用管理私钥的软件-钱包来生成及管理。
比特币的交易必须有有效签名才会被存储在区块中,因此拥有密钥就拥有对应账户中的比特币。密钥都是成对出现的,由一个公钥和一个私钥组成。公钥相当于银行账号,私钥就相当于银行卡密码。通常情况下密钥由钱包软件管理,用户不直接使用密钥。
比特币地址通常是由公钥计算得来,也可以由比特币脚本得来。
比特币私钥通常是数字,由比特币系统随机( 因为算法的可靠性与随机性正相关,所以随机性必须是真随机,不是伪随机,因此比特币系统可以作为随机源来使用 )生成,然后将私钥作为输入,使用椭圆曲线算法这个单向加密函数生成对应的公钥,再将公钥作为输入,使用单向加密哈希函数生成地址。例如,通过公钥K得到地址A的计算方式为:
其中SHA256和PIPEMD160被称为双哈希或者HASH160,Base58Check是带有验证功能的Base58编码,验证方式为先计算原始数据(编码前)的验证码,再比较编码后数据的验证码,相同则地址有效,否则无效。而在使用Base58Check编码前,需要对数据做处理。
处理方式为: 版本前缀 + 双哈希后的数据 + 校验码
其中版本前缀是自定义的,如比特币私钥的前缀是0x80,校验码是把版本前缀和双哈希后的数据拼接起来,进行两次SHA256计算,取前4字节。得到处理的数据后,再进行Base58编码,得到最终的结果。
下图是Base58Check版本前缀和Base58编码后的结果
密钥可以采用不同的编码格式,得到的编码后结果虽然不同,但密钥本身没有任何变化,采用哪种编码格式,就看情况而论了,最终目的都是方便人们准确无误的使用和识别密钥。
下图是相同私钥采用不同编码方式的结果:
公钥也有很多种格式,不过最重要的是公钥被分为压缩格式和非压缩格式,带04前缀的公钥为非压缩格式的公钥,而03,02开头的标识压缩格式的公钥。
前面说过,公钥是椭圆曲线上的一个点,由一对坐标(x, y)表示,再加上前缀,公钥可以表示为:前缀 x y。
比如一个公钥的坐标为:
以非压缩格式为例,公钥为(略长):
压缩格式的公钥可以节省一定的存储,对于每天成千上万的比特币交易记录来说,这一点点的节省能起到很大效果。
因为椭圆曲线实际上是一个方程(y2 mod p = (x3 + 7)mod P, y2是y的平方,x3是x的立方),而公钥是椭圆曲线上的一个点,那么公钥即为方程的一个解,如果公钥中只保留x,那么可以通过解方程得到y,而压缩公钥格式有两个前缀是因为对y2开方,会得到正负两个解,在素数p阶的有限域上使用二进制算术计算椭圆曲线的时候,y坐标或奇或偶,所以用02表示y为奇数,03表示y为偶数。
所以压缩格式的公钥可以表示为:前缀x
以上述公钥的坐标为准,y为奇数为例,公钥K为:
不知道大家发现没有,这种压缩方式存在一个问题,即一个私钥可以得出两个公钥,压缩和非压缩公钥,而这两个公钥都对应同一个私钥,都合法,但生成的比特币地址却不相同,这就涉及到钱包软件的实现方式,是使用压缩公钥还是非压缩公钥,或者二者皆用,这个问题后面来介绍。
比特币钱包最主要的功能就是替用户保管比特币私钥,比特币钱包有很多种,比如非确定性(随机)钱包,确定性(种子)钱包。所谓的非确定性是指钱包运行时会生成足够的私钥(比如100个私钥),每个私钥仅会使用一次,这样私钥管理就很麻烦。确定性钱包拥有一个公共种子,单向离散方程使用种子生成私钥,种子足够回收所有私钥,所以在钱包创建时,简单备份下,就可以在钱包之间转移输入。
这里要特别介绍下助记码词汇。助记码词汇是英文单词序列,在BIP0039中提出。这些序列对应着钱包中的种子,种子可以生成随机数,随机数生成私钥,私钥生成公钥,便有了你需要的一切。所以单词的顺序就是钱包的备份,通过助记码词汇能重建钱包,这比记下一串随机数要强的多。
BIP0039定义助记码和种子的创建过程如下:
另外一种重要的钱包叫做HD钱包。HD钱包提供了随机(不确定性) 钥匙有两个主要的优势。
第一,树状结构可以被用来表达额外的组织含义。比如当一个特定分支的子密钥被用来接收交易收入并且有另一个分支的子密钥用来负责支付花费。不同分支的密钥都可以被用在企业环境中,这就可以支配不同的分支部门,子公司,具体功能以及会计类别。
第二,它可以允许让使用者去建立一个公共密钥的序列而不需要访问相对应的私钥。这可允许HD钱包在不安全的服务器中使用或者在每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,但是在服务器中不具有可用来支付的私钥。
BIP0038提出了一个通用标准,使用一个口令加密私钥并使用Base58Check对加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露情况下的安全性。这个加密标准使用了AES,这个标准由NIST建立,并广泛应用于商业和军事应用的数据加密。
BIP0038加密方案是: 输入一个比特币私钥,通常使用WIF编码过,base58chek字符串的前缀“5”。此外BIP0038加密方案需要一个长密码作为口令,通常由多个单词或一段复杂的数字字母字符串组成。BIP0038加密方案的结果是一个由base58check编码过的加密私钥,前缀为6P。如果你看到一个6P开头的的密钥,这就意味着该密钥是被加密过,并需个口令来转换(解码) 该密钥回到可被用在任何钱包WIF格式的私钥(前缀为5)。许多钱包APP现在能够识别BIP0038加密过的私钥,会要求用户提供口令解码并导入密钥。
最通常使用BIP0038加密的密钥用例是纸钱包一一张纸张上备份私钥。只要用户选择了强口令,使用BIP0038加密的私钥的纸钱包就无比的安全,这也是一种很棒的比特币离线存储方式(也被称作“冷存储”)。
P2SH函数最常见的实现时用于多重签名地址脚本。顾名思义,底层脚本需要多个签名来证明所有权,然后才能消费资金。这类似在银行开设一个联合账户。
你可以通过计算,生成特殊的比特币地址,例如我需要一个Hello开头的地址,你可以通过脚本来生成这样一个地址。但是每增加一个字符,计算量会增加58倍,超过7个字符,需要专门的硬件或者矿机来生成,如果是8~10个字符,那么计算量将无法想象。
㈤ 区块链的项目编码是什么(区块链代码查询)
区块链一般概念摘要虽然是个前端开发,但是阻挡不了我八卦各种热门的心。下面简单汇总下一些学习到的概念性东西。
1、区块链技术随比特币诞生,因此先了解比特币概念
2、比特币是什么
(1)、基于分布式网络的数字货币
3、比特系统运行原理
(1)、所有节点都会保存完整账本
(2)、账本保持一致性
4、区块链记账原理
hash函数在区块链技术中有广泛的运用
(1)、哈希函数hash:任何信息hash后会得到一个简短的摘要信息
(2)、hash特点:简化信息、标识信息、隐匿信息、验证信息
(3)、区块链记账会把时间节点的账单信息hash,构成一个区块
(4)、比特币系统约10分钟记账一次,即每个区块生成的时间间隔大约10分钟
(5)、记录下一个账单时,会把上一个区块的hash值和当前账单的信息一起作为原始信息进行hash
(6)、每个区块都包含了之前区块的信息,这些区块组合成了区块链
5、比特币的所有权-非对称加密应用
比特币系统使用了椭圆曲线签名算法,算法的私钥由32个字节随机数组成,通过私钥可以计算出公钥,公钥经过一序列哈希算法和编码算法得到比特币地址,地址也可以理解为公钥的摘要。
(1)、转账是把比特币从一个地址转移到另一个地址
(2)、地址私钥是非对称的关系,私钥经过一系列的运算(其中包含两次hash),就可以得到地址,但是从地址无法得到私钥
(3)、转账成功后广播其他节点,其他节点验证成功后再转发到相邻的节点,广播的信息包含了原始的信息和签名信息
(4)、验证,其他节点验证签名信息是不是付款方用私钥对交易原始信息签名产生的,如果是才记录(再验证有足够余额)
6、比特币如何挖矿
(1)、完成记账的节点可以获得系统给予的一定数量比特币奖励(这个奖励过程也就是比特币的发行过程,因此大家把记账称为挖矿)
(2)、一段时间内只有一人可以记账成功,因此需要收集没有被收集的原始交易信息,检查有没有余额、正确签名
(3)、为了提高记账难度,十分钟左右只有一人可以记账,hash结果需要若干0开头,并且进行hash时引入随机数变量
(4)、随着更多矿工的加入,游戏难度越来越大,计算难度加大,电力损耗等加大,国内电力成本低,中国算力占整个网络的一半以上
(5)、网络中只有最快解密的区块,才会添加到账本中,其他的节点复制,保证账本的唯一性。如果有节点作弊,导致整个网络不通过,则会被丢弃再也不会记录到总账本中。因此所有节点都会遵守比特币系统的共同协议。
【关于区块链会延伸到那些领域的思考】:
由以上的概念可以总结出,区块链技术存在这安全性、唯一性、去中心化。
原则上是可以避免部分信息泄露,让确认方既可以确认你的身份,又无需暴露自己的真是用户信息等。
目前区块链技术集中被运用再比特币,我觉得后续更大的意义应该在需要数据私密性、安全性的领域。
【关于区块链目前发展的瓶颈和局限性思考】:
由于每个节点都参与了整个账本记录活动,难免造成资源的浪费和损耗。以及加大了每个节点的计算难度,后续的发展和普及需要每个节点的硬件提升。
区块链编号是什么意思?——区块链编号,即区块链咨询服务名称及备案编号。区块链没有通用协议,多是独立运作,对区块链进行备案编号,是建立通用协议配套制度的工作之一。
区块编号作用是什么用作是一个分类账本,任何拥有权限的人都可以分享并对其进行确认。
国家互联网信息办公室官网发布公告,披露第一批共197个境内区块链信息服务名称及备案编号。值得注意的是,“备案编号”并不能看做是给区块链披上合法的“黄马甲”,应正确认识“备案编号”的作用。
证券日报在文中指出,不可过度解读“备案编号”的作用。网信办表示,备案仅是对主体区块链信息服务相关情况的登记,不代表对其机构、产品和服务的认可,并强调,任何机构和个人不得用于任何商业目的。
acm明星币现在价格,有名气吗一.项目简介:
Actinium(ACM)是一种基于区块链技术的去中心化货币,旨在将密码带入每个客户的口袋,每个商店,非常安全且易于使用。Actinium是一种闪电网络支持的加密货币,即时交易的手续费近乎为零。同时,具备原子交换功能以及许多其他的第二层解决方案。
二.项目信息(截止2019年9月6日)
·项目编码:ACM
·总量:84,000,000
·流通量:13,516,241
·算法:Lyra2z
·区块时间:2.5分钟
·区块奖励:50ACM
,交易所:CITEX.IO
三.点评
·Zerocash协议使得ACM能够建立专门的ACM匿名交易,用以混淆每一个交易数据,包括交易金额、接发方识别信息等;
·ACM为了实现支付的便捷性,使用先进的闪电技术。
区块链备案号码是什么
备案号是网站是否合法注册经营的标志,可随时到国家工业和信息化部网站备案系统上查询该ICP备案的相关详细信息。
根据《管理规定》要求,区块链信息服务提供者应当在其对外提供服务的互联网站、应用程序等显著位置标明其备案编号。
备案仅是对主体区块链信息服务相关情况的登记,不代表对其机构、产品和服务的认可,任何机构和个人不得用于任何商业目的。网信部门后续将会同各有关部门,依据《管理规定》对备案主体进行监督检查,并督促未备案主体尽快履行备案义务。请尚未履行备案手续的相关机构和个人尽快申请备案。
第四批备案企业地区分布情况:
据备案清单显示,第四批境内区块链信息服务备案项目所在企业,有76家属于北京企业,其余的大部分企业集中在广东、浙江、上海。
梳理发现,第四批名单中共有来自22个省直辖市自治区的企业。其中,北京、广东、上海三家备案企业最多,分别为76家、57家、32家;上海紧随其后为31家,江苏以9家位列第五。
【深度知识】以太坊数据序列化RLP编码/解码原理RLP(RecursiveLengthPrefix),中文翻译过来叫递归长度前缀编码,它是以太坊序列化所采用的编码方式。RLP主要用于以太坊中数据的网络传输和持久化存储。
对象序列化方法有很多种,常见的像JSON编码,但是JSON有个明显的缺点:编码结果比较大。例如有如下的结构:
变量s序列化的结果是{"name":"icattlecoder","sex":"male"},字符串长度35,实际有效数据是icattlecoder和male,共计16个字节,我们可以看到JSON的序列化时引入了太多的冗余信息。假设以太坊采用JSON来序列化,那么本来50GB的区块链可能现在就要100GB,当然实际没这么简单。
所以,以太坊需要设计一种结果更小的编码方法。
RLP编码的定义只处理两类数据:一类是字符串(例如字节数组),一类是列表。字符串指的是一串二进制数据,列表是一个嵌套递归的结构,里面可以包含字符串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一个复杂的列表。其他类型的数据需要转成以上的两类,转换的规则不是RLP编码定义的,可以根据自己的规则转换,例如struct可以转成列表,int可以转成二进制(属于字符串一类),以太坊中整数都以大端形式存储。
从RLP编码的名字可以看出它的特点:一个是递归,被编码的数据是递归的结构,编码算法也是递归进行处理的;二是长度前缀,也就是RLP编码都带有一个前缀,这个前缀是跟被编码数据的长度相关的,从下面的编码规则中可以看出这一点。
对于值在[0,127]之间的单个字节,其编码是其本身。
例1:a的编码是97。
如果byte数组长度l=55,编码的结果是数组本身,再加上128+l作为前缀。
例2:空字符串编码是128,即128=128+0。
例3:abc编码结果是131979899,其中131=128+len("abc"),979899依次是abc。
如果数组长度大于55,编码结果第一个是183加数组长度的编码的长度,然后是数组长度的本身的编码,最后是byte数组的编码。
请把上面的规则多读几篇,特别是数组长度的编码的长度。
例4:编码下面这段字符串:
,IknowitbecauseIpre-designedit
这段字符串共86个字节,而86的编码只需要一个字节,那就是它自己,因此,编码的结果如下:
510510311010110032105116
其中前三个字节的计算方式如下:
184=183+1,因为数组长度86编码后仅占用一个字节。
86即数组长度86
84是T的编码
例5:编码一个重复1024次"a"的字符串,其结果为:18540979797979797...。
1024按bigendian编码为0040,省略掉前面的零,长度为2,因此185=183+2。
规则1~3定义了byte数组的编码方案,下面介绍列表的编码规则。在此之前,我们先定义列表长度是指子列表编码后的长度之和。
如果列表长度小于55,编码结果第一位是192加列表长度的编码的长度,然后依次连接各子列表的编码。
注意规则4本身是递归定义的。
例6:["abc","def"]的编码结果是200131979899131100101102。
其中abc的编码为131979899,def的编码为131100101102。两个子字符串的编码后总长度是8,因此编码结果第一位计算得出:192+8=200。
如果列表长度超过55,编码结果第一位是247加列表长度的编码长度,然后是列表长度本身的编码,最后依次连接各子列表的编码。
规则5本身也是递归定义的,和规则3相似。
例7:
[",","IknowitbecauseIpre-designedit"]
的编码结果是:
其中前两个字节的计算方式如下:
248=247+1
88=86+2,在规则3的示例中,长度为86,而在此例中,由于有两个子字符串,每个子字符串本身的长度的编码各占1字节,因此总共占2字节。
第3个字节179依据规则2得出179=128+51
第55个字节163同样依据规则2得出163=128+35
例8:最后我们再来看个稍复杂点的例子以加深理解递归长度前缀,
["abc",[",","IknowitbecauseIpre-designedit"]]
编码结果是:
24894131979899
列表第一项字符串abc根据规则2,编码结果为131979899,长度为4。
列表第二项也是一个列表项:
[",","IknowitbecauseIpre-designedit"]
根据规则5,结果为
长度为90,因此,整个列表的编码结果第二位是90+4=94,占用1个字节,第一位247+1=248
以上5条就是RPL的全部编码规则。
各语言在具体实现RLP编码时,首先需要将对像映射成byte数组或列表两种形式。以go语言编码struct为例,会将其映射为列表,例如Student这个对象处理成列表["icattlecoder","male"]
如果编码map类型,可以采用以下列表形式:
[["",""],["",""],["",""]]
解码时,首先根据编码结果第一个字节f的大小,执行以下的规则判断:
1.如果f∈[0,128),那么它是一个字节本身。
2.如果f∈[128,184),那么它是一个长度不超过55的byte数组,数组的长度为l=f-128
3.如果f∈[184,192),那么它是一个长度超过55的数组,长度本身的编码长度ll=f-183,然后从第二个字节开始读取长度为ll的bytes,按照BigEndian编码成整数l,l即为数组的长度。
4.如果f∈(192,247],那么它是一个编码后总长度不超过55的列表,列表长度为l=f-192。递归使用规则1~4进行解码。
5.如果f∈(247,256],那么它是编码后长度大于55的列表,其长度本身的编码长度ll=f-247,然后从第二个字节读取长度为ll的bytes,按BigEndian编码成整数l,l即为子列表长度。然后递归根据解码规则进行解码。
以上解释了什么叫递归长度前缀编码,这个名字本身很好的解释了编码规则。
(1)以太坊源码学习—RLP编码()
(2)简单分析RLP编码原理
()