揭秘比特币:非对称加密与共识算法如何保障交易安全

创始人
2024-12-21 06:10:16
0 次浏览
0 评论

比特币如何防止篡改

比特币网络主要使用这两种技术来保证用户发出的交易和历史中的交易不被攻击者破坏:

非对称加密可以确保攻击者无法伪造账户。
所有者这种方法可以确保网络中的历史记录无法被攻击者恢复;

非对称加密

非对称加密算法3是现在广泛使用的加密技术,以及TLS证书和电子邮件签名等场景采用非对称加密算法来保证安全。
非对称加密算法同时包含公钥(PublicKey)和私钥(SecretKey)。

请点击查看图片说明

图2-非对称加密特性

比特币采用非对称加密算法来保证每一笔交易的安全每个系统(地址)在网络中是一对私钥的公钥。
账户的所有者会有一个私钥Aj7o4zL7w4DNNuuwhgGgHqLnKPrivateKey:469d998dd4db3dfdd411fa56574e52b6be318f993ca696cc5c683c45e8e147eb需要注意的是,使用网站生成比特币地址和私钥是非常危险的。
我们不知道该网站是否收集私钥,因此建议使用比特币客户端来生成公钥和私钥。
匹配任何人都可以通过前述地址13RTT8MsbAj7o4zL7w4DNNuuwhgGgHqLnK向该账户转账;账户持有者还可以使用私钥编写交易将资金转移到其他地址,交易结构如下图:“5be7a9e47f56c98e5297a103cdf70653092f”,“版本”:1,“大小”:224,“vsize”:224,“设置”:0,“vin”:[...],“vout”:[...],“十六进制”。
:“010000001a90b4101e6cbb75e1ff885b6358264627581e9f96db9ae609acec98d72422067000000006b483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4ffffffff02a037a0000000000017a91477df4f8c95e3d35a414d7946362460d3844c2c3187e6f6030b000000001976a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac00000000","块":"000000000000000000c23ca00756364067ce5e815deb5982969df476bfc0b5c","confirmations":5,"time":1521981077,"block":1521981077}接下来,我们可以使用我们持有的私钥对整个交易中的所有字段进行签名,然后将签名与交易信封一起发送。
只需等待比特币网络的确认即可。
在所有比特币地址中,地址35hK24tcLEWcgNA4JxpvbkNkoAcDGqQPsP目前持有超过25万枚Bitcoin5,币值约20亿美元。
由于地址是已知的,因此它决定了需要多长时间才能获得相应的私钥。
比特币的私钥一共有256份,即22562256种可能性:1157920892373161954235709850086879078532269984665640564039457584007913129639936115792089237316195423570985008687907853269984665640564039457584007913129639936在目前的方法中我们没有更快的破解方法,只能使用暴力破解来计算私钥。
把top6,IBM2018年推出的超级计算机,做1.4*10171.4*1017,每秒一次私钥对的浮点计算,比曾经复杂的浮点计算要快得多),你想找到$2所在的地址储存了数十亿资产。
对应的私钥需要如下时间:1.15*1077365*86400*1.4*1017=2.9*1052年1.15*1077365*86400*1.4*1017=2.9*1052年我们整个世界都只能破解这个私钥。
十亿分之一的密钥时间为什么,在算力革命没有任何解决方案的情况下,只能从理论上获得私钥一个对应于强行破坏力量的公钥,但在实践中这是完全不可能的。

共识算法

MySQL等数据库以行为为单位存储数据,而比特币这种分布式数据库中的基本单位是日志,如图所示,图中最长的绿色链是主要的铜链。
图片说明请点击

图3-区块链与主链

如何了解下一个区块网络中的所有节点对条款内容的批评共识是比特币需要解决的主要问题。
只有让节点对数据达成一致才能确保过去的交易不会在网络中被破坏,在它所考虑的场景中,这是非常复杂的,需要解决拜占庭将军分布式的问题。
拜占庭将军问题是莱斯利·兰波特在其论文《拜占庭将军问题》中讨论的领域中的恶性容忍问题。
在该模型下,系统不对集群中的节点进行限制。
它们可以发送随机数据,向其他节点发送错误,或者不选择来自其他节点的请求。
它变得更加复杂。
普罗希米乌斯描述了拜占庭将军的以下使命。
有一群指挥官,指挥着一部分军队。
每个指挥官不知道是自己确定还是其他指挥官确定,但是其他指挥官已经传递了某些信息,但他们需要投票。
报告攻击或脚步:请点击输入图像描述

图4-一般拜占庭问题

区块链技术使用共识算法并激励创建多个节点,实现拜占庭任务的分布式一致性。
比特币使用以下规则允许多个节点实现分布式一致性:

引入代币工作负载——允许节点在提交新块之前计算满足特定条件的哈希值,取代传统的分布式一致性算法(一个节点一票)设置;

引入最长链路是主链设置——只有主链上的交易才被视为合法交易;

激励引入-通过提交区块可以获得比特币奖励的节点;

除了上述规则外,最长链上的每个节点都会计算哈希并尝试提交合法的区块。
然而,当一个节点中有人主导超过51%的算力时,他就可以通过强大的算力改变区块的历史。
由于区块具有连续性,前一个区块的变化将解决下一个区块的哈希计算,如图4所示。
如果攻击者需要更改主链中倒数第三个黄色区块,则需要连续四个区块。
阻止篡改历史只有这样,计算才会在这条更长的链条中继续进行:请点击输入图像描述

图4-51%攻击

1使用下面的代码计算在无限长的时间内,当攻击者拥有51%的算力时,重写历史上0到9个区块的概率为9:#include#includedoubleattackerSuccessProbability(double.eq,intz){doublep=1.0-q;{双泊松=exp(-lambda);上*(1-pow(q/p,z-k));n",i,AttackerProbability(0.51,i));}return0,}通过上面的计算,我们会发现,在无限时间内,占据整个网络的节点的算力可以启动51%的概率修改历史的攻击是100%;但是在有限的时间内,由于比特币中的算力是相对动态的,比特币网络的节点也避免了一个节点占据超过51%算力的情况,但是在某些网络中算力无法保证的封锁,51%攻击仍然很常见。
防止51%攻击的方法很简单已确认。
比特币的交易确认次数为6次,比特币日志平均每10分钟生成一次,因此交易的确认时间约为60分钟,这也是必须保证安全的牺牲。
但这种增加确认数量的方法并不能保证100%的安全。

总结

研究比特币这样的技术是非常有趣的。
就像在分布式数据库中,甚至经常会出现分散系统的丢失问题,比如不确定的节点等金融系统问题和运行者,甚至更复杂的交易确认和验证场景。
比特币网络的设计非常有趣。
比特币不能100%防止交易和数据篡改。
本文提到的两种技术只能保证一定概率的安全,而降低攻击者造成后果的可能性也是安全领域应该存在的永恒问题。
我们可以用更严格的方式来解释目前的情况——利用比特币技术增加了攻击者的成本和篡改交易的概率:

比特币使用非对称加密算法,使得攻击者对签名的访问受到限制。
账户所有者无法及时发现,

比特币采用工作量证明共识算法,并引入记账激励,使得网络中的历史交易不会被攻击者快速恢复;

这两种方法,比特币使这成为历史性的交易不会被破坏,所有账户的资金都是安全的。

操作mySql时出错,寻求帮助

本章列出了从任何主要语言调用MySQL时可能出现的错误。
首先列出服务器错误消息。
下面列出了客户端程序消息。
服务器错误消息来自以下源文件:错误消息列在文件Share/errmsg.txt中。
逗号%d和逗号%s分别表示数字和字符串。
显示时,它们会被消息值替换。
错误值列在文件Share/errmsg.txt中,该文件用于生成MySQL源文件中的include/mysqld_error.h和include/mysqld_ername.h定义。
·SQLSTATE值在文件Share/errmsg.txt中指定,并用于在MySQL源文件include/sql_state.h中创建定义。
由于更新频繁,这些文件可能包含此处未列出的其他错误消息。
·错误:1000SQLSTATE:HY000(ER_HASHCHK)消息:hashchk·错误:1001SQLSTATE:HY000(ER_NISAMCHK)消息:isamchk·错误:1002SQLSTATE:HY000(ER_NO)消息:否正在创建文件“%s”(错误:%d)错误:1005SQLSTATE:HY000(ER_CANT_CREATE_TABLE)消息:无法创建表'%s'(错误:%d)错误:1006SQLSTATE:HY000(ER_CANT_CREATE_DB)消息:无法创建数据库'%s'(错误:%d)错误:第1007章HY000(ER_DB_CREATE_EXISTS)消息:无法创建数据库“%s”;该数据库已存在。
·错误:1008SQLSTATE:HY000(ER_DB_DROP_EXISTS)消息:无法删除数据库“%s”,该数据库不存在。
·错误:1009SQLSTATE:HY000(ER_DB_DROP_DELETE)消息:删除数据库时发生错误(无法删除“%s”,错误:%d)·错误:1010SQLSTATE:HY000(ER_DB_DROP_RMDIR)消息:删除数据库数据库时发生错误(不能trmdir'%s',错误号:%d)·错误:1011SQLSTATE:HY000(ER_CANT_DELETE_FILE)消息:删除“%s”时出错(errno:%d)·错误:1012SQLSTATE:HY000(ER_CANT_FIND_SYSTEM_REC)消息:无法读取系统表中的记录。
错误:1013SQLSTATE:HY000(ER_CANT_GET_STAT)消息:无法获取状态“%s”(错误:%d)错误:1014SQLSTATE:HY000(ER_CANT_GET_WD)消息:无法获取工作目录(错误:%d)错误:1015SQLSTATE:HY000(ER_CANT_LOCK)消息:无法锁定文件(错误:%d)错误:1016SQLSTATE:HY000(ER_CANT_OPEN_FILE)消息:无法打开文件:“%s”(错误:%d)错误:1017SQLSTATE:HY000(ER_FILE_NOT_FOUND)消息:找不到文件:“%s”(错误:%d)错误:1018SQLSTATE:HY000(ER_CANT_READ_DIR)消息:无法读取“%s”的目录(错误:%d)错误:1019SQLSTATE:HY000(ER_CANT_SET_WD)消息:无法更改“%s”的目录(错误:%d)错误:1020SQLSTATE:HY000(ER_CHECKREAD)消息:自上次更新读取以来,表'%s'尚未更新。
'中的条目已更改。
错误:1021SQLSTATE:HY000(ER_DISK_FULL)消息:磁盘已满(%s);正在等待空间变得可用...错误1022SQLSTATE:23000(ER_DUP_KEY)消息:无法将键写入表“%s”。
错误:1023SQLSTATE:HY000(ER_ERROR_ON_CLOSE)消息:关闭“%s”时出错(错误:%d)错误:1024SQLSTATE:HY000(ER_ERROR_ON_READ)消息:读取文件“%s”时出错(错误:%d)错误:1025SQLSTATE:HY000(ER_ERROR_ON_RENAME)消息:将'%s'重命名为'%s'时出错(错误:%d)错误:1026SQLSTATE:HY000(ER_ERROR_ON_WRITE)消息:写入文件'%s'时出错(错误:%d))错误:1027SQLSTATE:HY000(ER_FILE_USED)消息:“%s”已锁定并且更改被拒绝。
·错误:1028SQLSTATE:HY000(ER_FILSORT_ABORT)消息:分类错误·错误:1029SQLSTATE:HY000(ER_FORM_NOT_FOUND)消息:对于“%s”,进程图“%s”不存在。
错误1030SQLSTATE:HY000(ER_GET_ERRNO)消息:从​​存储引擎收到错误%d。
错误:1031SQLSTATE:HY000(ER_ILLEGAL_HA)消息:“%s”的表存储引擎不包含此参数。
错误1032SQLSTATE:HY000(ER_KEY_NOT_FOUND)消息:找不到“%s”中的条目。
错误:1033SQLSTATE:HY000(ER_NOT_FORM_FILE)消息:文件“%s”中的信息无效错误:1034SQLSTATE:HY000(ER_NOT_KEYFILE)消息:密钥文件对于表“%s”无效,请尝试更正它。
错误:1035SQLSTATE:HY000(ER_OLD_KEYFILE)消息:表“%s”的旧密钥文件,请修复它!错误1036SQLSTATE:HY000(ER_OPEN_AS_READONLY)消息:表'%s'是只读的。
错误:1037SQLSTATE:HY001(ER_OUTOFMEMORY)消息:内存已满,重新启动服务器并重试(需要%d字节)。
·错误:1038SQLSTATE:HY001(ER_OUT_OF_SORTMEMORY)消息:分类内存溢出,请增加服务器分类缓冲区大小。
错误:1039SQLSTATE:HY000(ER_UNEXPECTED_EOF)消息:读取文件“%s”时出现意外的EOF(错误:%d)错误:1040SQLSTATE:08004(ER_CON_COUNT_ERROR)消息:连接过多。
错误1041SQLSTATE:HY000(ER_OUT_OF_RESOURCES)消息:内存已满。
检查mysqld或其他进程是否正在使用所有可用内存。
如果没有,可以使用ulimit让mysqld使用更多内存,或增加交换大小。
空间。
错误:1042SQLSTATE:08S01(ER_BAD_HOST_ERROR)消息:无法检索此地址指定的主机名。
错误:1043SQLSTATE:08S01(ER_HANDSHAKE_ERROR)消息:握手无效。
错误1044SQLSTATE:42000(ER_DBACCESS_DENIED_ERROR)消息:用户“%s”@“%s”对数据库“%s”的访问被拒绝。
错误:1045SQLSTATE:28000(ER_ACCESS_DENIED_ERROR)消息:用户'%s'@'%s'的访问被拒绝(使用密码:%s)错误:1046SQLSTATE:3D000(ER_NO_DB_ERROR)消息:未选择数据库。
错误:1047SQLSTATE:08S01(ER_UNKNOWN_COM_ERROR)消息:未知命令。
错误1048SQLSTATE:23000(ER_BAD_NULL_ERROR)消息:列“%s”不能为NULL。
错误1049SQLSTATE:42000(ER_BAD_DB_ERROR)消息:未知的数据库“%s”。
错误:1050SQLSTATE:42S01(ER_TABLE_EXISTS_ERROR)消息:表“%s”已存在。
错误1051SQLSTATE:42S02(ER_BAD_TABLE_ERROR)消息:未知表“%s”。
错误1052SQLSTATE:23000(ER_NON_UNIQ_ERROR)消息:%s中的列“%s”不明确。
错误:1053SQLSTATE:08S01(ER_SERVER_SHUTDOWN)消息:服务器在运行时关闭。
错误1054SQLSTATE:42S22(ER_BAD_FIELD_ERROR)消息:“%s”中存在未知列“%s”。
错误1055SQLSTATE:42000(ER_WRONG_FIELD_WITH_GROUP)消息:GROUPBY中缺少“%s”。
错误1056SQLSTATE:42000(ER_WRONG_GROUP_FIELD)消息:无法在“%s”处创建组。
错误:1057SQLSTATE:42000(ER_WRONG_SUM_SELECT)消息:语句中有一个求和函数,并且同一语句中有一个列。
·错误:1058SQLSTATE:21S01(ER_WRONG_VALUE_COUNT)消息:列数与值数不匹配。
·错误:1059SQLSTATE:42000(ER_TOO_LONG_IDENT)消息:ID名称“%s”太长。
·错误:1060SQLSTATE:42S21(ER_DUP_FIELDNAME)消息:重复的列名“%s”。
·错误:1061SQLSTATE:42000(ER_DUP_KEYNAME)消息:重复的键名“%s”。
错误1062SQLSTATE:23000(ER_DUP_ENTRY)消息:键%d的条目“%s”重复。
错误1063SQLSTATE:42000(ER_WRONG_FIELD_SPEC)消息:列'%s'的列限定符无效。
·错误:1064SQLSTATE:42000(ER_PARSE_ERROR)消息:在第%d行中,%s位于“%s”旁边。
·错误:1065SQLSTATE:42000(ER_EMPTY_QUERY)消息:查询为空。
错误1066SQLSTATE:42000(ER_NONUNIQ_TABLE)消息:非唯一表/别名:“%s”错误1067SQLSTATE:42000(ER_INVALID_DEFAULT)消息:“%s”的默认值无效。
错误1068SQLSTATE:42000(ER_MULTIPLE_PRI_KEY)消息:定义了多个主键。
错误:1069SQLSTATE:42000(ER_TOO_MANY_KEYS)消息:指定的键太多:允许的最大键数为%d。
错误:1070SQLSTATE:42000(ER_TOO_MANY_KEY_PARTS)消息:指定的关键部分太多:允许的最大关键部分为%d。
错误1071SQLSTATE:42000(ER_TOO_LONG_KEY)消息:指定的键太长。
最大密钥长度为%d字节。
错误1072SQLSTATE:42000(ER_KEY_COLUMN_DOES_NOT_EXITS)消息:表中不存在键列“%s”。
错误:1073SQLSTATE:42000(ER_BLOB_USED_AS_KEY)消息:BLOB列'%s'不能在所使用的表类型的键规范中使用。
错误:1074SQLSTATE:42000(ER_TOO_BIG_FIELDLENGTH)消息:对于列“%s”,列长度太大(最大值=%d),请改用BLOB或TEXT。
热门文章
1
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

2
MySQL分区删除技巧与8.0版本新特性... mysql删除分区在MySQL中,删除分区操作主要使用“可替代”的命令与“ dr...

3
Python代码实现:如何判断三角形的三... python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...

4
深度解析:MySQL查询语句执行顺序及优... mysql查询语句执行顺序当这是由于执行SQL的过程时,了解其过程很重要。 ...

5
SQL教程:使用SUBSTRING和IN... sql取特定字符的前面几位字符selectsubstr('L-0FCLDRBCT...

6
MySQL日期差异计算方法:轻松获取日期... MySQL计算时间差两日期相减得月份mysql两时间相减得月MySQL计算时间之...

7
MySQL及SQL查询获取前10条数据方... MySql查询前10条数据sql语句是从MySQL获取前1 0个数据的SQL查询...

8
MySQL启动问题排查与解决指南 Mysql为什么启动不了如果要配置MySQL,则遇到无法启动的问题,可能是由于配...

9
DbVisualizer添加MySQL数... 如何在DbVisualizer中添加本地mysql数据库由于DbVisualiz...

10
SQL字段默认值设置全攻略:轻松实现自动... sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...