Web3.0 - 比特币

比特币是区块链技术的一个典型应用。央行发行的数字货币,由银行提供验证、背书。

比特币是一个去中心化的数字货币。

去中心化的数字货币,需要解决的问题是:

  • 谁发行货币
  • 怎么验证

1. 谁发行BTC

比特币的发行是由挖矿决定的。

挖矿本质是争夺记账权,提交下一个区块。提交下一个区块的时候,会获得block reward(出块奖励),出块奖励的比特币是新产生的,等同于发行新的币。

比特币争夺记账权的过程叫作挖矿(mining),比特币被称为数字黄金(digital gold),争夺记账权的节点被称为矿工(miner),一旦找到就能赚钱。

最初的出块奖励是50个比特币,比特币协议规定,每21万个区块后,奖励减半。所以比特币一直运行下去,最终会产生2100万个比特币。

21万  * 50 * (1+ 0.5 + 0.25 + 0.125 + ... ) = 2100万

按照比特币系统平均每10分钟出一个区块的速度计算,差不多4年,出块奖励就减半。

21万 * 10分钟 /(60 * 24 * 365)≈ 4年

2. BTC的验证

比特币依赖区块链,由链上的所有节点共同维护。

比特币在交易的过程中,需要有相应的签名,转出方还需要提供自己币的来源。

上图就是一个简单的比特币区块链,记录了btc交易的流转。

每个小区块有2种hash指针:

  1. 连接在块之间,记录前一个区块头的hash值,因此形成区块链

  2. 指向前面的某个交易,指明比特币的来源。

    指明币的来源的目的:证明币不是凭空捏造的,同时也能防范双花交易(double spending attack)

区块链里的内容是如何写到区块链里面的呢?

每个节点,每个账户都可以发布交易,交易是广播给所有节点的。有些交易是合法的,有些是非法的。

谁来决定哪些交易应该被写入下一个区块中呢? 按照什么顺序写呢? 如果每个节点自己决定可以吗?
区块链是什么?是个去中心化的账本,账本里的内容得有个统一的说法。如果每个人在本地维护一个区块链,那区块链的统一性得不到保证,而账本的内容是要取得分布式的共识(distributed consensus)。

借这里的图,提个有意思的事情。

如图中所示,A有10个BTC,图中转给B和C各5个,那么能转给B和C各4个吗?

可以,但是剩下的10-4*2=2个BTC 就成了交易手续费 赏给矿工了。

如果不想给矿工,可以给BC各4个,再转给自己另外一个账户2个。

3. 比特币中的共识协议

比特币中共识 (consensus in BitCoin) 要解决的一个问题是,有些节点可能是有恶意的。我们假设系统中大多数节点是好的,那么该如何取得共识协议?

投票

既然大多数节点是好的,那就直接投票,首先应该确定哪些区块有投票权,有些membership是有严格要求的,不是谁都可以加入的,(比如说联盟链hyperledger,只有某些符合条件的大公司才能加入 hyperledger fabric)这种情况下基于投票的方案是可行的。

但是比特币系统不是这样的。
但是比特币系统创建账户是很容易的,就在本地产生一个公钥私钥对就是一个账户,不需要任何人批准,甚至一个人产生了公私钥对别人都无法得知,只有转账时别人才知道。

所以有些恶意节点可以不停的创建账户,当超过账户总数的一半时就有了控制权,这种称为女巫攻击(sybil attack)。因此投票方法不可取。

比特币不是按照账户数目投票,而是按照计算力来投票。

每个节点都可以在本地组装出一个候选区块,把它认为合法的交易放在里面,然后开始尝试各种nonce值(占4 byte),看哪一个能满足不等式H(block header)≤target的要求。

block head里面有一个域叫做nonce。如果某个节点找到了符合要求的nonce,它就获得了记账权。

所谓的记账权,就是往比特币账本里写入下一个区块的权利。只有找到这个nonce,获得记账权的节点才有权利发布下一个区块。其他节点收到这个区块之后,要验证这个区块的合法性。

最长合法链(longest valid chain)

有时候会出现2个矿工都计算出nonce,都对外广播自己挖到下一个区块。其他节点验证之后,选择正确合法的区块,在其后继续挖。最终这个分叉的区块链会分出长短,长的取胜,不在最长合法链上的区块(orphan block)就被丢弃了。

这两条都是最长合法链,那该接受那条呢?

这里的接受 意味着 认可这个区块,并基于这个区块往下继续扩展。

比特币协议当中,在缺省(默认的意思)情况下,每个节点是接受它最早收到的那个。所以不同节点根据在网络上的位置不同,有的节点先听到新生成的其中一个区块,那就接受这个区块;有些节点先听到另一个区块,那就接受另一个区块。

这两个新区块有可能会各自拉拢,两个区块链看谁的算力强,有时候也是看谁的运气好,就会胜出。

比特币系统中共识机制要取得什么共识?

类似于分布式哈希表,有很多系统服务器要维护分布式哈希表,假如有人在自己电脑上插入一个键值对,那么别人在另一台读的时候也要能把这个读出来,这就叫一个全局的哈希表。这里维护的共识是这个哈希表中的内容,包含那些key-value值。

4. 分叉

比特币的分叉,分两种:状态分叉、协议分叉

4.1. state fork

由于对区块链当前状态有意见分歧而导致的分叉。

比如说:2个矿工同时挖到下一个正确的区块,就形成了一个分叉,只不过这个分叉随着时间的推移,会 根据【最长合法链】原则得到解决。

4.2. protocol fork

对比特币协议产生分歧,用不同版本的协议造成的分叉。根据协议修改的内容不同,可以分成 硬分叉 和 软分叉

  • hard fork

    什么情况会出现硬分叉?
    对比特币协议增加新协议,扩展新功能,未升级软件的旧节点会不认可这些修改,会认为这些特性是非法的。

    这也就是对比特币协议内容产生分歧,从而导致分叉。

    硬分叉的一个典型例子,就是对比特币区块大小的修改。

    在BTC系统中,区块大小最大为1MB,可以包含的交易最大数量为4000笔左右。而一个区块产生大概需要10min左右,也就是说,整个比特币系统,平均每10分钟最多只能处理4000笔交易(平均每秒7笔交易)。这个速度严重影响了吞吐量和交易处理。

    所以,有人建议增大区块,使得一个区块可以包含更多笔交易。假设扩大到4M。

    未升级的节点只认可1M的小块,新的节点对1M和4M大小的都认可。

    就可能出现上图的效果:老节点认为包含1和3的块所在的链都是非法的,于是又在2后面分叉 并创建4。

    这种分叉是永久性的,只要旧节点不更新,下面的链就永远不会消失。

  • soft fork

    目前UTXO是全节点自己在本地为了方便查询自行维护的,但UTXO内容并未写入区块链。

    UTXO(Unspent Transaction Output)

    比特币采用了一种追踪比特币的流水账记录法。本质上,就是只记录交易本身,而不记录交易的结果。

    区块链系统只处理所有的交易,而需要清算、查看余额等信息,由区块链节点自行处理。

    在比特币中,采用transcation-base ledger,即基于交易的记账本。通常我们更容易理解account-base ledger基于账户的记账本。

    比特币系统中,全节点负责维护UTXO数据结构,保存没有花费的交易。

    如果账户要查询余额,可以查找账户在UTXO里输出一共收到多少个币,如果是全结点的话可以算出来,但是很多比特币钱包不可能在手机上维护一个完整的区块链,实际上是一个轻节点,如果查询某账户余额,轻节点便需要询问全节点,全节点根据UTXO中信息可以计算得到账户余额,但如何确保全节点给的数据可信?
    有人提议把UTXO集合中的内容也组织成一棵Merkle tree,将其根哈希值写在coinbase域中,(如果改block header的话动静太大,coinbase域正好没人用),改这个域的内容,最后会改到block header中的根哈希值,这样就可以通过Merkle proof证明出来了。
    可以看到,旧节点认可新节点的区块,因为旧节点不管你写的内容,但新节点对于旧节点CoinBase域检查时候,发行并没有这个UTXO的根哈希值,不会认可其发布的区块,所以这是软分叉。

小结一下:

soft fork:只要系统中拥有半数算力以上的结点更新了软件,系统就不会出现永久的分叉

hard fork:必须所有节点都更新了软件,系统才不会出现永久性的分叉,如果有小部分结点不愿意更新,系统就分成了两条链

5. 全节点和轻节点

比特币区块链中的节点,分为全节点和轻节点。

如果不需要进行挖矿,只需要进行转账 只需要运行一个轻节点就可以,没必要运行全节点。

两者区别如下:

5.1. 全节点

  • 一直在线
  • 在本地硬盘上维护完整的区块链信息
  • 在内存里维护UTXO集合,以便快速检验交易的正确性
  • 监听比特币网络上的交易信息,验证每个交易的合法性
  • 决定哪些交易会被打包在区块里
  • 监听别的矿工挖出来的区块,验证其合法性
  • 挖矿并且可以决定挖矿的方向:最长链方向,如果出现等长的分叉时,选择最先监听到的那一条分叉

5.2. 轻节点

  • 不是一直在线
  • 不用保存全部整个区块链,只要保存每个区块的块头
  • 不用保存全部交易,只保存与自己相关的交易
  • 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性
  • 无法检测网上发布的区块的正确性
  • 可以验证挖矿的难度(即检测你发布的区块是否符合难度要求)
  • 只能检测哪个是最长链,不知道哪个是最长合法链

6. 挖矿

前面说了,挖矿本质是争夺记账权,提交下一个区块。

挖矿的过程是无记忆性的memoryless,又称progress free。

就像 抛硬币,我想要抛一个正面向上的硬币,和已经抛过的过程无关系。

每尝试一个nonce,都是在一定概率下满足挖矿条件,和之前尝试了多少次nonce没关系。这种memoryless的特性,使得挖矿成功的概率等于节点占总算力的比例。

比特币中用的哈希函数叫作SHA-256,根据SHA256的特性:块头任意一位发生变化,得到的hash值会变得完全不一样,而且大小变化方向不确定。

挖矿的时候,miner用PoW算法(Proof-of-Work)计算整个块头的hash值,比较hash值是否小于某个值(实际上这个值是保存在块头中的nBit “解压后” 的current_target值)来判断是否满足要求;

如果小于,则广播这个区块;如果不小于,则按照当前挖矿节点的规则改变块头中可以改变的值,然后再次计算块头hash值,以此往复,直到结果小于目标值。

那么块头中,有哪些值可以改变,从而改变整个块头的hash的呢?

除了前面说到的nonce,其实还可以改变merkle root。

每次挖矿,矿工可以得到一定数额奖励。也就是常说的铸币交易,铸币交易(coinbase域)可以自由输入任意的一些内容,从而向上影响整个merkle tree root hash。

6.1 挖矿设备变迁

比特币的mining puzzle是哈希算法,流行的运算工具有CPU、GPU、ASIC等。

第一代,CPU挖矿,CPU擅长逻辑控制,串行的运算。普通电脑挖。

第二代,GPU挖矿,GPU擅长的是大规模并发计算。显卡挖。

第三代,ASIC专用设备挖矿,矿机。

ASIC,Application Specific Integrated Circuit,在集成电路界被认为是一种为专门目的而设计的集成电路。

矿机淘汰速度也很快,过段时间就有更好的矿机问世。

6.2 矿池

单兵作战的模式,已经比较难挖到矿了。

矿池可以将分散的算力集中起来,一个矿池可以管理很多个矿工,矿池负责打包区块,矿工负责接收矿池的任务进行hash运算。

矿池中的矿工按贡献率分配挖矿奖励,矿工的贡献也是采用工作量证明的方式。实际,矿池要求矿工提交一个较比特币puzzle难度的结果。

比如比特币puzzle要求包含70个0,而矿池要求puzzle是60个0。

矿工每提交一个这样的结果,被认为比较了一个share。这些share中可能包含了符合比特币要求的结果,矿池就可以获得收益。

而绝大部分的share是没有意义的,仅仅作为矿工的工作量证明。

从概率上分析,加入矿池的矿工的收入期望并没有增加,获得的收益任然是矿工占全部节点算力的比例。但是,通过加入矿池,矿工收入的稳定性提高了。一些矿池为了吸引矿工加入,会为矿工提供额外的奖励,这也导致了超大型矿池的出现。

如果有一个矿池 包含了百分之51的节点,也不一定是百分之51,相当大的算力就有可能,那么他可以发动分叉攻击以及Boycott

分叉攻击:比如A将一笔交易给了B,经过了6个区块确认生效后。A发动分岔攻击,再生成一个链比原来的更长(拥有足够高的算力是有可能达到的)然后A转给B这笔交易就无效了。这样B就造成了经济损失。

Boycott:即对任意用户进行“封杀”,比如对A进行封杀,A进行的所有的交易都不让上链,只要A进行一次交易 就进行一次分岔。和分岔攻击不同的是,boycott不需要等6个区块确认,只要A进行上链就发动分岔 越早越好。

6.3 挖矿难度

比特币需要维持约10分钟出一个块,那么就要根据实际情况 动态调整挖矿难度。

难度调整公式:
target = target * actual_time / expect_time

比特币规定每2016个区块调整一次难度,计算公式等价于
newdiff = diff * (2016*10*60) / R

newdiff:       新的难度调整值
diff:          上次难度调整结果
(2016*10*60):  每10分钟产生一个区块,两周时间产生区块数=2016
R:             本次难度调整的2016个出快实际用时

问题,如何让所有矿工同时调整目标阈值target的值呢?

计算target的方法是写在比特币系统的代码里的,每挖到2016个区块。难度就会自动调整。

7. BTC相关问题

  1. 假设某全节点收到某个转账交易,会不会有可能转账交易中收款人地址该全节点从未听过?
    可能,因为比特币账户只需要本地产生即可。只有该账户第一次收到钱时,其他节点才能知道该节点的存在。
  2. 私钥泄露怎么办?
    尽快将剩余BTC转到其他安全账户上,没有第三方中心机构重置密码或冻结账户,只能自己对自己负责。
    BTC系统中账户便是公私钥对,密码就是私钥,无法更改。
  3. 转账写错地址怎么办?
    没有办法,只能自认倒霉,无法取消已经发布的交易。如果转入不存在地址,则该部分比特币便成为了死钱。当然,比特币系统中UTXO会永久保存该交易,记录该并不存在的地址。因此,对全节点来说,这是不友好的。

参考资料:

http://blog.csdn.net/qq_41569591/article/details/107932841

本文转载于网络 如有侵权请联系删除

相关文章

  • 印度小哥的代码被质疑,才是我希望小码匠做到的

    众数老码农:小码匠,我向你保证,今天的算法一点也不难。小码匠:不难?我信你个鬼,你给我整的题有不难的?算了,说来听听吧。老码农:来来来,上菜,本期的菜——求众数输入:列表中有多个数据。输出:求这个数据列表中,出现次数最多的数据。百度百科https://baike.baidu.com/item/%E4%BC%97%E6%95%B0/44796?fr=aladdin 复制小码匠:唔,我明白了,这个看起来的确不难,用一句你们“码农”界的行话,“开撸代码”,走起。老码农:学的够快的哈,那就赶紧做吧。小码匠:唔,这里这样,不对应该这样…… 小码匠一阵噼里啪啦,呈现如下代码:defmode(input_list:list)->list: """ 众数 href:https://baike.baidu.com/item/%E4%BC%97%E6%95%B0/44796 input_list:list[int]数值型数据列表 returns:float:众数列表 """ ifnotinput_list: raiseValueError(

  • Swift 2.0 简要介绍

    看了很多篇介绍Swift2.0的,感觉Appcoda这篇介绍的比较清楚,顺手学习并翻译了一下,英文原文看这里.What’sNewinSwift2.0:ABriefIntroduction一年前,Apple为iOS和OSX开发者带来了全新的编程语言Swift,当苹果的副总裁在WWDC上宣布的那一刹那,我和很多开发者一样,异常兴奋。作为宣传中更快、更安全的语言,Swift已经成长为目前最流行的语言了。在今年的WWDC上Apple推出了Swift2,我很幸运能参加这次WWDC大会,下面我分享一些新版Swift的更新。We’resteppingonthegasthisyearwithSwift2.WethinkSwiftisthenextbigprogramminglanguage,theonewewillalldoapplicationandsystemsprogrammingonfor20yearstocome.Wethinkitshouldbeeverywhereandusedbyeveryone.CraigFederighi,Apple’sseniorvicepresidentofSo

  • Vue 3 Class 与 Style 绑定

    Class与Style绑定实验介绍操作元素的class列表和内联样式是数据绑定的一个常见需求。因为它们都是attribute,所以我们可以用v-bind处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将v-bind用于class和style时,Vue.js做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。Class绑定对象语法绑定方式简而言之,就是我们可以给HTMLDOM元素绑定类似:class="{}"这种格式的数据,然后经过Vue的渲染,就会渲染成多个类名了。同样,我们在src/views/TemplateM.vue:<template> <divclass="template-m-wrap"> <divclass="static":class="{'active':isActive,'danger':isDanger}"> 默认样式 </div> </di

  • Linux文件基本属性知识点总结

    Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。在Linux中我们可以使用ll或者ls–l命令来显示一个文件的属性以及文件所属的用户和组,如:[root@www/]#ls-l total64 dr-xr-xr-x2rootroot4096Dec142012bin dr-xr-xr-x4rootroot4096Apr192012boot ……复制实例中,bin文件的第一个属性用”d”表示。”d”在Linux中代表该文件是一个目录文件。在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。当为[d]则是目录当为[–]则是文件;若是[l]则表示为链接文档(linkfile);若是[b]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);若是[c]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。接下来的字符中,以三个为一组,且均为『rwx』的三个参数的组合。其中,[r]代表可读(read)、[w]代表可写(write)、[x]

  • Tensorflow小技巧整理:

    tf.trainable_variables(),tf.all_variables(),tf.global_variables()查看变量在使用tensorflow搭建模型时,需要定义许多变量,例如一个映射层就需要权重与偏置。当网络结果越来越复杂,变量越来越多的时候,就需要一个查看管理变量的函数,在tensorflow中,tf.trainable_variables(),tf.all_variables(),和tf.global_variables()可以来满足查看变量的要求,来简单说一下他们的不同。tf.trainable_variables()顾名思义,这个函数可以也仅可以查看可训练的变量,在我们生成变量时,无论是使用tf.Variable()还是tf.get_variable()生成变量,都会涉及一个参数trainable,其默认为True。以tf.Variable()为例:__init__( initial_value=None, trainable=True, collections=None, validate_shape=True, ... )复制对于一些我们不需要训练的

  • XSS平台模块拓展 | 内附42个js脚本源码

    整理自网络,有问题的地方可以及时提醒我修改 所有代码下载见文末网盘地址01.简单的键盘记录键盘一个非常简单的键盘记录程序,可捕获击键并将其每秒发送到外部页面.JS和PHP代码在归档中提供的PHP。02.JavaScript的键盘记录一个先进的,提供妥协的主机的IP地址,并确定在哪个文本字段的内容类型,即使你从一个字段切换到另一个字段!发布压缩版本和服务器收集被盗击键:一个Windows二进制和一个Python脚本。这个键盘记录器绝对是JS键盘记录的参考。03.会话感知键盘记录感谢设置为cookie的ID的用户会话之后的键盘记录程序。捕获的数据存储在数据库中,其中包含与用户会话相关的信息,源URL等。04.JQuery键盘记录键盘一旦加载jQuery,一行(长)会写一个键盘记录器。像往常一样,捕获的密钥在制作的URL的查询字符串中发送。在许多情况下可能有用。05.HTML5截图HTML5Canvas允许您快速渲染(客户端)客户端浏览器的精确截图,并使用Ajax将其返回给攻击者控制的服务器。这个有效载荷的目的是做一个截图,并悄悄地发送到一个PHP文件(在档案中可用),将其存储到一个不错的P

  • Java 同步方式 (2) —— wait和notify/notifyall

    Java中除了关键字synchronized能够实现线程同步外,还可以使用wait和notify/notify实现同步。wait方法是使拥有当前对象(object)的线程(thread)放弃锁(releaselock),进入睡眠状态 notify通知该对象(object)因上面调用wait而等待的某一进程重新唤醒启动 notifyAll通知在对象(object)上因调用wait而等待的所有进程启动,这些进程根据优先级顺序执行一个线程在其生命周期内总是处于某种状态: 创建:当一个线程对象被声明并创建后,它处于“创建”状态;就绪:线程对象调用start()方法后,将进入“就绪”状态,处于“就绪”状态的线程不是立即执行,而是进入就绪队列,等待CPU;运行:当就绪队列中具有最高优先级的就绪线程被调度并获得CPU时,便进入“运行”状态,执行run()方法,run方法中定义了线程的操作和功能;非运行:处于“运行”状态的线程可能因为某些原因(例如人为挂起)进入“非运行”状态,让出CPU并临时中止自己的执行;停止:线程完成了它的全部工作或调用stop()方法强制中止线程,线程就进入“停止”状态。wai

  • JMeter专题系列(一)工具简单介绍

    一、JMeter 介绍    ApacheJMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,JavaServlet,CGIScripts,JavaObject,数据库和FTP服务器等等。JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能。    同时,JMeter可以帮助你对你的应用程序进行回归测试。通过你创建的测试脚本和assertions来验证你的程序返回了所期待的值。为了更高的适应性,JMeter允许你使用正则表达式来创建这些assertions.JMeter与LoadRunner比较JMeter 是一款开源(有着典型开源工具特点:界面不美观)测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细;很它的优点也有很多: 开源,他是一款开源的免费软件,使用它你不需要支付任何费用, 小巧,相比LR的庞大(最新LR11将近4GB),它非常小巧,不需要安装,但需要JDK环境,因为它是使用

  • 加锁还是不加锁,这是一个问题

    来源:码农翻身 作者:刘欣感觉这篇文章很不错,特地转载推荐给大家阅读。以下是正文:1.前言上次我说过,我们这个线程的世界是个弱肉强食的地方,大家为了争抢资源大打出手,时不时闹出些内存数据互相被覆盖的事故,给人类带了无穷的烦恼。后来线程元老院强势出手,发明了一种锁的机制,这才制止了内乱。从此以后我们要访问共享的资源(共享变量,文件...)都得想办法先申请到一把锁才可以。(码农君注:关于锁的故事在《编程世界中的那把锁》有讲述)2.互斥锁 虽说锁是个好东西,但是我们线程日常使用的都是互斥锁,所谓互斥,就是同一时刻只有获得锁的那个线程才有资格去操作共享资源,别的线程都阻塞住了,被放到了一个叫锁池(Lockpool)的地方,什么事情都干不了。比如说这个简单的Sequence类吧,有100个线程拼命地挤破头去进入next()方法,但由于synchronized的存在,大家必须得获得一把锁才可以,隔壁的小明运气不错,获得了操作系统的垂青,喜滋滋的得到了宝贵的锁,进入了next()方法去做事了。而我们剩下的99个线程大眼瞪小眼,除了叹口气,感慨下人生之不如意十之八九,还能干嘛?老老实实地进入锁池里待

  • 使用Python中对情态动词进行NLP分析

    情态动词是一种表示关于动作语义信息的助动词,即可能性(will,should),许可(could,may),义务(shall/must)。一个值得探究的有趣想法是:这些动词的存在是否因不同类型的文本而不同,并且这是否意味着什么。“使用Python进行自然语言处理”(阅读我的评论)中有一个说明如何开始这个研究过程的例子,我们使用布朗语料库比较不同类型文本中的动词频率,这是60年代用于语言研究的著名文本集合。我扩展了这个示例,使用了包括额外的法庭案件和额外的辅助动词,约15,000法律文件内容。首先,我们定义一个检索文献体裁的函数,然后从体裁中检索词语。对于法律文件,我从我以前建立的n-gram[链接](即单词/短语计数)中读取。importnltk importos defget_genres(): yield'legal' forgenreinbrown.categories(): yieldgenre modals=['can','could','may','might',

  • 三种不同的负载均衡类型

    未使用负载均衡 这种情况下用户直接与web服务器进行连接,且该服务处于单点得状态,如果weserver挂掉了,那么后续的所有连接都不回成功,同样的如果访问用户量比较大,因为服务器繁忙的原因可能有部分用户连接不到服务,会流失大量用户。所以这种简单结构的服务,只适合一些规模比较小的web站点,或者作为原型开发使用。 四层负载均衡 由图可以看到提供webserver服务的后端机不知一台,并且对外提供的接口也不在直接是服务器本身了,而是又封装了一层前端机做负载均衡,该机器会把用户连接服务器的请求,通过报文中的ip和port两部分,以及服务器本身一些负载均衡算法进行指定分发到后端webserver机组中的某一台,因为这里的转发依据是根据网络协议栈中的四层(传输层)进行判断,所以称为四层负载均衡,相应地后面还有基于七层(应用层)的负载均衡。具体的转发过程类似于路由转发请求,负载均衡设备会对用户请求的ip和port地址进行修改,修改为相应后端webserver中的某一台地址,相应地也会对webserver返回的报文做一定的修改,以掩盖真实地websever地址 七层负载均衡 七层负载均衡的图

  • 如何通过组件化提高开发效率?

    在软件开发过程中,大到业务模块的划分,小到技术组件的开发,都属于组件化的思考范畴内。很多时候我们到网上搜索「组件化」关键词,都只会看到关于前端组件化的资料,而对于后台开发组件化的资料却很少,那这是不是代表后台组件化没有意义呢?后台组件化肯定是有非常大的价值的,对于业务开发人员也有非常大的效率提升。所以本文我将通过自己做组件化的一些经验,谈谈我对后端组件化的一些看法,以及如何进行组件化开发,希望对在一线开发的工程师们有所帮助。希望通过组件化的方式,能帮助一线工程师们减少对于重复业务代码的编写,提高开发效率,将更多时间和精力放在创新开发上。如何发现组件化需求?组件化,顾名思义,其实是通过将重复的业务操作统一起来,对外提供统一的接口,调用方不需要操心内部实现。通过组件化的方式,能统一业务代码规范,减少冗余代码,提高开发效率。在软件开发的组件化里,要发现需求,你必须深入到具体的业务过程中去,了解整个业务流程。只有这样,你才能知道哪些东西需要优化,哪些东西是重复的。当我刚刚进入珍爱网的时候,公司开启了精细化运营的需求,很多时候同一个需求对广东地区开放,而对湖南地区不开放。而当需求呈现正向积极效果

  • spring集成kafka

    一、添加依赖项compile'org.springframework.kafka:spring-kafka:1.2.2.RELEASE'复制二、发消息(生产者)2.1xml配置1<?xmlversion="1.0"encoding="UTF-8"?> 2<beansxmlns="http://www.springframework.org/schema/beans" 3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4xsi:schemaLocation="http://www.springframework.org/schema/beans 5http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7<beanid="producerProperties"class="jav

  • 解决Pandoc wasn't found.pdflatex not found on PATH

    解决nbconvertfailed:Pandocwasn’tfound.解决nbconvertfailed:pdflatexnotfoundonPATH问题1描述500:InternalServerError nbconvertfailed:Pandocwasn’tfound. Pleasecheckthatpandocisinstalled:问题2描述500:InternalServerError nbconvertfailed:pdflatexnotfoundonPATH http://pandoc.org/installing.html解决办法:1.安装pandoc下载pandoc官方下载http://pandoc.org/installing.html其他可用CSDN资源下载地址 直接点击安装,默认安装即可,可选择安装位置。 然后配置环境变量,把安装路径配置到系统path中。如我的是将E:\IDE\Pandoc放置path中。2.安装miktex直接点击安装,默认安装即可,可选择安装位置。 (如果程序没有自动配置环境变量)需要手动配置环境变量,把安装路径配置到系统path中。如

  • 使用Vertx重构系统小结

    背景 前几个月,使用Vertx重构了公司的一个子系统,该系统负责公司核心数据subscriber的采集、处理、存储和搜索。这里介绍下重构该系统时的一些关键点。 架构 重构前系统部署图: 重构前系统主要有2部分组成,这2部分都会对Subscriber数据操作: JavaAPP:是个定时任务触发的APP,每2小时跑一次,每次启动后做以下的事情: 从MongoDB里加载已有的数据到内存。 读取准备好的Data文件,处理文件中的数据,和已加载的数据做合并,这个处理的过程会导致Subscriber数据有添加、删除和更新操作。 处理完Data文件后,将数据持久化到MongoDB和Elasticsearch。 JBoss服务: 从Kafka中来的消息数据,批量处理Kafka消息,会添加和更新Subscriber数据到MongoDB和Elasticsearch中。 从其他系统触发的API调用,接收一些API请求,这些请求也会增加、删除和更新Subscriber数据。在更新的时候,因为查询条件的多样性,为了提高查询Subscriber的速度,对MongoDB的SubscriberCollecti

  • codeforces #div2.462 C.Cave Painting

    C.CavePainting timelimitpertest 1second memorylimitpertest 256megabytes input standardinput output standardoutput Impiswatchingadocumentaryaboutcavepainting. Somenumbers,carvedinchaoticorder,immediatelyattractedhisattention.Imprapidlyproposedaguessthattheyaretheremaindersofdivisionofanumber n byallintegers i from 1 to k.Unfortunately,therearetoomanyintegerstoanalyzeforImp. Impwantsyoutocheckwhetheralltheseremaindersaredistinct.Formally,hewantstocheck,ifa

  • 可控硅使用

    通过可控硅控制220V交流电,如果是带零点检测的可控硅,交流电为50Hz,半波周期为10ms,调节的话是以半波为单位进行调节。对于220V的LED灯来说就是有闪烁。 两个方法:①统计经过的半波个数。②在10ms内拉低和拉高。注意第一种好,在零点进行处理比较好。但是也要具体问题具体分析。 导通角~~如果你理解导通角有难度的话,可以这样理解:你要控制的电源电压是正弦波,每个半周期,都会有一次过零,就是电压为0,那么从这个零点开始,一直到下一个零点,就是你要控制的时间,1/50Hz。这半个周期如果全部都加在负载上的话,那就是满功率,调整功率就可以通过控制其中的导通时间来完成。这样一来,从零点开始,延迟一段时间(等同于导通角)后再控制可控硅导通,剩下的时间就是导通的时间了。。             新消息(szyxwkj.com) 可控硅的导通角概念与输出功率控制原理(szyxwkj.com) 双向可控硅过零检测与导通角的问题(amobbs.com阿莫电子论坛)

  • 剑指offer58-II 左翻转字符串

    一、题目 二、代码 classSolution{ public: stringreverseLeftWords(strings,intn){ stringstart=s.substr(0,n); stringend=s.substr(n,s.length()-n); end=end+start; returnend; } };复制   纵一苇之所如,临万顷之茫然。

  • MVC

    ㈠ MVC    MVC全名是ModelViewController,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。是一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC模式最早由TrygveReenskaug在1978年提出,是施乐帕罗奥多研究中心(XeroxPARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。      MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应

  • 开启关闭Centos的自动更新(转)

    开启关闭Centos的自动更新 关闭Centos的自动更新,操作记录如下:[root@jwbdbalpha]#chkconfig–listyum-updatesdyum-updatesd   0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭[root@jwbdbalpha]#serviceyum-updatesdstop停止yum-updatesd:                                       [确定][root@jwbdbalpha]#serviceyum-up

  • cJSON api的使用教程

    背景说明:由于和后台通信,为了统一数据格式,选择使用json格式,客户端开发语言使用的是c,故需要借助第三方库来实现json格式的转化,cJSON是一个很好的第三方库, 下载链接1:https://github.com/DaveGamble/cJSON     下载链接2:https://sourceforge.net/projects/cjson/  下载完成后只需要将源码中的cJSON.c和cJSON.h拷贝到自己的代码中就可以使用了   使用教程参考:https://blog.csdn.net/fengxinlinux/article/details/53121287

相关推荐

推荐阅读