白话比特币原理及运作机制

最近在整理 Crypto 的资料,搜索到张洋的这篇文章,可能是写的最好的比特币原理及运作机制讲解故事,故转载至此进行分享。

这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来,不会涉及算法和协议中细节的部分。

文中会给出一个虚拟的村庄叫「比特村」,整体以讲故事的方式,逐步告诉大家比特币提出的动机、解决了什么问题以及一些关键组件的目标和设计方案。

以物易物的比特村

话说在这个世界上,有一个叫比特村的小村庄,村庄共有几百户人家。这个村庄几乎与世隔绝,过着自给自足的生活。由于没有大规模贸易,比特村村民一直过着以物易物的生活,也就是说村民之间并没有使用统一的货币,互相间的贸易基本上就是老张家拿一袋面粉换老李家一只羊,王大嫂拿一筐野果换刘大婶两尺布。村民们一直就这么纯朴的生活着。

实物货币

终于有一天,村民觉得一直这样以物易物实在太不方便了,于是村子全员开会,讨论如何解决这个问题。有人提议,以便于分割且稀有的东西,例如黄金,作为一般等价物,把其它物品和黄金的对应关系编成一张表格,例如一克黄金对应一只羊,一克黄金对应一袋面粉等等,此时老张再也不用扛着一袋面粉气喘吁吁的去老李家换羊了,他只要从家里摸出一克金子,就可以去老李家牵回一只羊,而老李拿着这一克黄金可以从任何愿意出让面粉的人那里换回一袋面粉,当然也可以换取任何和一克黄金等值的物品。

此时比特村进入了实物货币时代。

符号货币

好景不长,过了一段时间,实物货币的弊端也出现了。因为比特村附近金矿并不多,开采和冶炼金子太费时费力了。而随着使用,金子总是不断会因为磨损、丢失或有人故意囤积而发生损耗。全村人又一次坐在了一起,开始商讨对策。此时有人说,其实大家也不必一定要真的用黄金啊,随便找张纸,写上“一克黄金”,只要全村人都认同这张纸就等于一克黄金,问题不就解决了。其他人纷纷表示认同,但同时也有了新的问题:真实的黄金是需要开采和冶炼的,金矿有限,开采和冶炼也需要成本,所以没有人可以短期凭空制造大量的黄金,可写字就不同了,只要我纸够笔够,随便像写多少写多少,那这就变成拼谁家里纸多了,搞不好到时一万张纸才能换一只羊(实际上这就发生了经济学上的通货膨胀)。

大家一想也是啊。不过此时又有人提出了解决方案:这个纸不是谁写都有效,我们只认村里德高望重的老村长写得,大家都认识老村长的字。老村长写一些纸,同时按照各家黄金存量发给大家等量的纸,例如老张家有二百克黄金,老村长就发给老张二百张写着“一克黄金”的纸,同时将老张家的黄金拿走作为抵押。就这样,老村长将村里所有黄金收归到自己的家里,并按各家上交的黄金数量发给等值的写有字的纸。此时村民就可以拿着这些纸当黄金进行贸易了,而且大家都认得老村长的字,其他人伪造不出来。另外,如果谁的纸磨损太严重,也可拿到老村长那里兑换新的等值的纸,另外老村长承诺任何人如果想要换成真黄金,只要拿纸回来,老村长就会把等值的黄金还给那人。因为老村长写得纸的黄金量和真实放在家里的黄金量是一样的,所以只要严格按照销毁多少纸新写多少纸的原则,每一张有效的纸总能换回相应的真黄金。

此时,比特村进入了符号货币(纸币)时代。而老村长就承担了政府和银行的角色。

中央系统虚拟货币

又过了几年,老村长由于每天都要核对大量的旧纸币,写新的纸币,还要把各种账目仔细做好记录。一来二去,老村长操劳过度不幸驾鹤西去了。

比特村再次召开全体大会,讨论应该怎么办。此时老村长的儿子二狗子自告奋勇接过了父亲的笔,承担起货币发行的责任。这个年轻的村长二狗子很聪明,他做了几天,发现好像也不用真的写那么多纸。完全可以这样:村民把纸币都交上来,销毁,但是二狗子会记录下每户上交的纸币数量。以后如果要进行付钱,例如老张要拿一克金子向老李换一只羊,就一起给二狗子打个电话,说明要将老张名下的一克金子划归老李名下,二狗子拿出账本,看看老张名下是否有一克金子,如果有就在老张的名下减掉一克,在老李的名下加上一克,这样就完成了支付,此时老李在电话中听到二狗子确认转账完成,就可以放心让老张把羊牵走了。

此时比特村进入了中央系统虚拟货币时代。每个村民都不需要用实物支付,支付过程变成了二狗子那边维护的账本上数字的变更。

分布式虚拟货币

这新上任的二狗子是聪明,不过这人有时候是聪明反被聪明误。有一天二狗子盯着这账本,心想这全村各户谁有多少钱就是我说的算,那我岂不是……。于是他头脑一热,私自从老张帐下划了十克金子到自己名下。

本以为天衣无缝,但没想到老张也有记账的习惯,有一天他正要付钱却被二狗子告知账户没钱了。老张核对了一下自己的账本,明明还有十克啊,于是拿着账本去找二狗子理论,这一核对发现了那笔未经老张同意的转账。

东窗事发!比特村炸开锅了。二狗子被弹劾是不可避免了,不过通过这件事,大家发现了账本集中在一个人手里的弊端:

  • 这个体系完全依赖于账本持有人的个人信用,如果这个人不守规矩,随意篡改账本,那么整个货币系统就会崩溃
  • 如果这个人家里失火或者账本失窃,同样也会为整个体系带来毁灭性的打击

正当人们不知所措时,村里一个叫中本聪的宅男科学家走上了台,告诉大家他已经设计了一套不依赖任何中央处理人的叫比特币的虚拟货币系统,可以解决上述问题。然后他缓缓讲述了自己的方案。

下面我们就来看看中本聪同学是如何设计这套系统的。

基础设施搭建

中本聪首先说明,要对现有账簿进行如下改造:

  1. 账簿上不再记载每户村民的余额,而只记载每一笔交易。即记载每一笔交易的付款人、收款人和付款金额。只要账簿的初始状态确定,每一笔交易记录可靠并有时序,当前每个人持有多少钱是可以推算出来的。
  2. 账簿由私有改为公开,只要任何村民需要,都可以获得当前完整的账簿,账簿上记录了从账簿创建开始到当前所有的交易记录。
    此言一出,下面立刻炸锅了。第一条还无所谓,但是第二条简直无法接受,因为账簿可是记录了所有村民的交易,这样大家的隐私不全暴露了吗。

中本聪倒是不慌不忙,拿出了一对奇怪的东西。

身份与签名机制(公钥加密系统)

中本聪说,大家不要慌。在他的这套机制下,任何人都不使用真实身份交易,而是使用一个唯一的代号交易。

他展示了手里神奇的东西,说这两件东西分别叫保密印章和印章扫描器。后面他会给村里每一户发一个保密印章和一个印章扫描器。两者的作用如下:

  • 保密印章可以在纸上盖一个章,每个印章盖出的章都隐含了一个全村唯一的一串字符,但是凭肉眼是看不出来的。也无法通过观察来制造出相应的印章。
  • 印章扫描器可以扫描某个已经盖好的章,读出隐含的信息,并在液晶屏上显示出一串字符。
    有了这两个神奇的东西,大家就可以在不暴露真实身份的情况下进行交易了,而印章隐含的那一串字符就是这户人家的代号。具体如何巧妙利用保密印章和印章扫描器进行交易,会在下文详述。

成立虚拟矿工组织(挖矿群体)
下一步,中本聪面向全村招募虚拟矿工,招募要求如下:

  • 矿工以组为单位,一组可以是单独的一户,也可以是几户联合为一组
  • 成为矿工不影响正常使用货币
  • 矿工每天要花费一定时间从事比特币“挖矿”活动,但是不同于挖金矿,虚拟矿工不需要拿着工具去野外作业,在家里就可以完成工作
  • 矿工有一定可能性获得报酬,在挖矿活动中付出的努力越多,获得报酬的可能性越大
  • 矿工可以随时退出,也可以随时有新的矿工加进来
    很快,大约有五分之一的村民加入比特币矿工组织,共分成了7个组。

建立初始账簿(创世块)

下面,中本聪宣布,先根据二狗子手里的账簿,把抵押的所有黄金按账簿记录的余额退还给每位村民,然后彻底销毁这本账簿。

然后,中本聪拿出一本新账簿,在账簿的第一页上记录了一些交易记录,特别的是,这些记录的付款人一栏全都是「系统」,而收款人分别是每个印章对应的隐含字符,代表初始时刻,系统为每一户默认分配了一定数量比特币,但是数量非常少,都只有几枚,甚至有些不幸的村户没有获得比特币。

接着中本聪说,由于目前市面上比特币非常少,大家可以先回到用黄金做货币的时代,由于我不是村长,我也没有权利强迫大家一定要承认比特币,大家可以自行决定要不要接受比特币。不过随着比特币的流动和矿工的活动,比特币会慢慢多起来。

支付与交易

做了这么多铺垫,终于说到重点了,下面说一下在这样一个体系下如何完成支付。以老张付给老李10个比特币为例。

付款人签署交易单

为了支付 10 个比特币,老张首先要询问老李的标识字符串,例如是「ABCDEFG」,同时老张也有一个标识字符串例如是「HIJKLMN」,然后老张写一张单子,内容为「HILKLMN 支付 10 比特币给 ABCDEFG」,然后用自己的保密印章改一个章,将这张单子交给老李。另外为了便于追溯这笔钱的来源,还要在单子里注明这笔钱的来源记在哪一页,例如这个单子里,老张的10比特币来自建立账簿时系统的赠送,记录在账簿第一页。

收款人确认单据签署人

老李拿到这个单子后,需要确认这个单子确实是来自「HIJKLMN」这个人(也就是老张)签署的,这个并不困难。因为单子上必须有保密章,老李拿出印章扫描器,扫一下章,如果液晶屏显示出的字符和付款人字符是一致的(这里是「HIJKLMN」),就可以确认单子确实是付款人签署的。这是因为根据保密印章的机制,没有其他人可以伪造印章,任何一个人只要扫描一下印章,都可以确认单子的付款人和盖章人是否一致。

收款人确认付款人余额

这个系统到目前还是很有问题。通过保密印章,收款人虽然可以确认付款人确实签署了这份单子,但是无法自行确认付款人是否有足够的余额支付。之前的中央虚拟货币系统中,二狗子负责检查付款人的余额,并通知收款人交易是否有效,现在把二狗子开了,谁来负责记账和确认每笔交易的有效性呢?

之前说过,中本聪设计的这个系统是分布式货币系统,不依赖任何中央人物,所以不会有一个或少数几个人负责这件事,最终承担这份工作的是之前所提到的矿工组织。老张、老李和全村其他任何使用比特币进行交易的村民都依赖矿工组织的工作才能完成交易。

矿工的工作

矿工的工作是整个系统的核心,也是最复杂性最高的地方。下面逐步介绍矿工的工作内容和目的。

矿工的工具

俗话说,工欲善其事,必先利其器。比特币矿工虽然不用铁撅、铁锨和探照灯等工具,不过也要有一些必备的东西。

初始账簿。每个组首先自己复制一份初始账簿,初始账簿只有一页,记录了系统的第一次赠送

空账簿纸。每个小组有若干账簿纸,每一页纸上仅有账簿结构,没有填内容,具体内容的书写规则后面讲述。下面是一张空账簿纸的样子,各个字段的意义后面会说到

编码生成器(哈希函数)。中本聪又向矿工组织的每个组分发了若干编码生成器,这个东西很神奇,将一页账簿填好内容的账簿纸放入这个机器,机器会在账簿纸的“本账单编号”一栏自动打印一串由“0”和“1”组成的编号,共256个。最神奇的是,编号生成器有如下功能:

  • 生成的编号仅与账簿纸上填入的内容有关,与填写人、字体、填写时间等因素均无关
  • 内容相同的账簿纸生成的编号总是相同,但是如果内容哪怕只改一个字符,编号就会面目全非
  • 编码生成器在打印编码时还需要将所有填入账簿纸的交易单放入,机器会扫描交易单和填入交易单的一致性,尤其是保密印章,如果发现保密印章和付款人不一致,会拒绝打印编码
  • 将一张已打印的账簿纸放入,机器会判定编号是否是有效的机器打印,并且判定编号和内容是否一致,这个编号无法伪造
  • 交易单收件箱。每个矿工小组需要在门口挂一个箱子用于收集交易单。
  • 公告板。每个矿工小组同样需要一个公告板公示一些信息。

有了上面的工具,矿工组织就可以开工了。

收集交易单

中本聪规定,每笔交易的发起人,不但要将交易单给到收款人,还要同时复制若干份一模一样的交易单投递到每个矿工小组的收件箱里。

矿工小组的人定期到自己的收件箱里把收集到的交易单一并取出来。

填写账簿

此时小组的人拿出一张空的账簿纸,把这些交易填写到“交易清单”一栏,同时找到当前账簿最后一页,将最后一页的编号抄写到“上一张账单编号一栏”。 注意还有个“幸运数字”,可以随便填上一个数字,如12345。然后,将这样账簿纸放入编号生成器,打印好编号,一张账簿就算完成了。

如果你以为矿工的工作就这么简单,那就大错特错了,中本聪有个变态的规定:只有编号的前10个数均为0,这页账簿纸才算有效。

根据之前对编号生成器的描述,要修改编号,只能修改账簿纸的内容,而“交易清单”和“上一张账簿纸编号”是不能随便改的,那么只能改幸运数字了。于是为了生成有效的账簿纸,小组里的矿工就不断抄写账簿纸,但每张纸的幸运数字都不同,然后不断的重复将纸放入编码器,如果生成的编号不符合规定,这张纸就算废了,重复这个过程直到生成一串有效的编号。

我们知道,如果编号的每一个数字都是随机的,那么平均写1000多张幸运数字不同的纸才能获得一个有效的编号。

这就奇怪了,这些矿工为什么要拼命干这看似无意义的事情呢?还记得之前说过矿工有报酬吧,这就是矿工的动力了。中本聪规定:每一张账簿纸的交易清单第一条交易为“系统给这个小组支付50个比特币”。也就是说,如果你生成了一张有意义的账簿纸,并且被所有挖矿小组接受了,那么就意味着这条交易也被接受了,你的挖矿小组获得了50个比特币。

这就是矿工被叫做矿工的原因,也是为什么之前说随着交易和矿工的活动,比特币的数量会不断增多。例如下面是一个挖矿过程,这个小组的公共比特币帐号为「UVWXYZ」。

在幸运数字尝试到「533」时,系统生成了一页有效账簿

确认账簿

当某挖矿小组幸运的生成了一张有意义的账簿,为了得到奖励,必须立刻请其它小组确认自己的工作。前面说过,当前村里有7个挖矿组,所以这个小组必须将有效账簿纸誊抄6份快马加鞭送到其他6个小组请求确认。

中本聪规定,当某个小组接到其他小组送来的账簿纸时,必须立即停下手里的挖矿工作进行账簿确认。

需要确认的信息有三个:

  1. 账簿的编号有效
  2. 账簿的前一页账簿有效
  3. 交易清单有效

首先看第一个,这个确认比较简单。只要将送来的账簿纸放入编码生成器进行验证,如果验证通过,则编号有效。

第二部分需要将账簿页上的「上一页账簿纸编号」和这个小组目前保存的有效账簿最后一页编号比对,如果相同则确认,如果不同,需要顺着已有账簿向前比对,直到找到这个编号的页。如果没有找到指定的“上一页账簿纸编号”对应的页,这个小组会将此页丢掉。不予确认。

注意,由上面的机制可以保证,如果各个小组手里的账簿纸是相同的,那么他们都能按同样的顺序装订成相同的账簿。因为后面一张纸的编号总是依赖前面的纸的编号,编码生成器的机制保证了所有合法账簿纸的相对先后顺序在每个小组那里都是相同的(可能会有分支,但不会出现环,后面细讲)。

最后是如何确认交易清单有效,其实也就是要确认当前每笔交易的付款人有足够的余额支付这笔钱。由于交易信息里包含这笔钱是如何来的,还包含了记录来源交易的账单编号。例如,HIJKLMN要给ABCDEFG10个比特币,并注明了这10个比特币来自之前OPQRST支付给HIJKLMN的一笔交易,确认时首先要确认之前这笔交易是否存在,同时还要检查HIJKLMN在这之前没有将这10个比特币支付给别人。这一切确认后,这笔交易有效性就被确认了。

其中第一笔是系统奖励给生成这页账簿的小组的50个,这笔交易大家都默认承认,后面的只要按照上述方法追溯,就可以确认HIJKLMN是否当前真有10个比特币支付给ABCDEFG。

如果完成了所有了上述验证并全部通过,这个小组就认可了上述账簿纸有效,然后将这张账簿纸并入小组的主账簿,舍弃目前正在进行的工作,后面的挖矿工作会基于这本更新后的主账本进行。

账簿确认反馈

对于挖矿小组来说,当账簿纸送出去后,如果后面有收到其他小组送来的账簿纸,其「上一页账簿纸编号」为自己之前送出去的账簿纸,那么就表示他们的工作成功被其他小组认可了,因为已经有小组基于他们的账簿纸继续工作了。此时,可以粗略的说可以认为已经得到了50个比特币。

另外,任何一个小组当新生成有效账簿纸或确认了别的小组的账簿纸时,就将最新被这个小组承认的交易写到公告牌上,那么收款人只要发现相关交易被各个小组认可了,基本就可以认为这笔钱已经到了自己的账上,后面他就可以在付款时将钱的来源指向这笔交易了。

以上就是整个比特币的支付体系。下面我们来分析一下,这个体系为什么可以工作下去,以及这个体系可能面临的风险。

工作机制分析

虽然上面阐述了比特币的基本运作规则,但是村民们还是有不少疑问。所以中本聪同学专门开了个答疑会,解答常见问题。下面总结一下村民最集中关心的问题。

核心问题答疑

如果同时收到两份合法的账簿页怎么办?

注意在上面的运行机制中,各个挖矿小组是并行工作的,因此完全可能出现这样的情况:某小组收到两份不一样的账簿页,它们都基于当前这个小组的主账簿的最后一页,并且内容也都完全合法,怎么办?

关于这个问题,中本聪同学说,小组不应该以线性方式组织账簿,而应该以树状组织账簿,任何时刻,都以当前最长分支作为主账簿,但是保留其它分支。举个例子,某小组同时收到A、B两份账簿页,经核算都是合法的,此时小组应该将两页以分叉的形式组织起来,如下图所示:

黑色表示当前账簿主干。此时,可以随便选择一个页作为当前主分支,例如选择A:

此时如果有一个新的账簿页是基于A的,那么这个主干就延续下去:

如果这个主干一直这么延续下去,表示大家基本都以 A 为主干,B 就会被遗忘。但是也有可能忽然 B 变成更长了:

那么我们就需要将 B 分支作为当前主干,基于这个分支进行后续工作。

从局部来看,虽然在某一时刻各个小组的账簿主干可能存在不一致,但大方向是一致的,那些偶尔由于不同步产生的小分支,会很快被淹没在历史中。

如果挖矿小组有人伪造账簿怎么办

关于这个问题,中本聪同学说,只要挖矿组织中大多数人是诚实的,这个系统就可靠,具体分几个方面给予答复。

首先,基于保密印章机制,没有人能伪造他人身份进行付款,因为编码生成器在打印编码时会核对所有交易单的保密印章,印章和付款人不一致会拒绝打印。

而且诚实的矿工也不会承认不合法的交易(如某笔交易付款方余额不够)。

所以只有一种可能的攻击行为,即在收款人确认收款后,从另一条分支上建立另外的交易单,取消之前的付款,而将同一笔钱再次付款给另一个人(即所谓的 double-spending 问题)。下面同样用一个例子说明这个问题。

先假设有一个攻击者拥有 10 个比特币,他准备将这笔钱同时支付给两名受害者 A 和 B,并都得到承认。

第一步,攻击者准备从受害者 A 手里买 10 比特币的黄金,他签署交易单给受害者 A,转 10 个比特币给受害者 A。

第二步,这笔交易在最新的账簿页中被确认,并被各个挖矿小组公告出来。受害人 A看到公告,确认比特币到账,给了攻击者10个比特币等值的黄金。

第三步,攻击者找到账簿,从包含刚才交易的账簿页的前一页做出一个分支,生成更多的账单页,超过刚才的分支。由于此时刚才攻击者制造的分支变成了主干分支,而包含受害者A得到钱的分支变成了旁支,因此挖矿组织不再承认刚才的转账,受害者A得到的10比特币被取消了。

第四步,攻击者可以再次签署交易单,将同一笔钱支付给受害者B。受害者B确认钱到账后,支付给攻击者等值黄金。

至此,攻击者将10个比特币花了两次,从两名受害者那里各购得等值黄金。攻击者还可以如法炮制,取消与受害者B的转账,将同一笔钱再支付给其他人……

关于这种攻击,中本聪给出的解决方案是,建议收款人不要在公告挂出时立即确认交易完成,而是应该再看一段时间,等待各个挖矿小组再挂出6张确认账簿,并且之前的账簿没有被取消,才确认钱已到账。

中本聪解释道,之前设定变态的编号规则,正是为了防御这一点。根据前面所述,生成有效账簿页不是那么简单的,要花费大量的人力反复试不同的幸运数字,而且过程完全是碰运气。如果某账簿页包含你收到钱的确认,并且在后面又延续了6个,那么攻击者想要在落后6页的情况下从另一个分支赶超当前主分支是非常困难的,除非攻击者拥有非常多的人力,超过其他所有诚实矿工的人力之和。

而且,如果攻击者有如此多人力,与其花这么大力气搞这种攻击,还不如做良民挖矿来的收益大。这就从动机上杜绝了攻击的形成。

比特币会一直增加下去,岂不是会严重通货膨胀

中本聪说,这一点我也想到了。前面忘了说了,我给矿工组织的操作细则手册会说明,刚开始我们协议每生成一页账簿,奖励小组50个比特币,后面,每当账簿增加21,000页,奖励就减半,例如当达到210,000页后,每生成一页账簿奖励25个比特币,420,000页后,每生成一页奖励12.5个,依次类推,等账簿达到6,930,000页后,新生成账簿页就没有奖励了。此时比特币全量约为21,000,000个,这就是比特币的总量,所以不会无限增加下去。

没有奖励后,就没人做矿工了,岂不是没人帮忙确认交易了

到时,矿工的收益会由挖矿所得变为收取手续费。例如,你在转账时可以指定其中 1% 作为手续费支付给生成账簿页的小组,各个小组会挑选手续费高的交易单优先确认。

矿工如果越来越多,比特币生成速度会变快吗

不会。中本聪解释,虽然可以任意加入和退出矿工组织,导致矿工人数变化,每个矿工也会拿到一个编码生成器,不过我已经在编码生成器中加入了调控机制,当前工作的编码生成器越多,每个机器的效率就越低,保证新账簿页生成速率不变。

虽然每个人的代号是匿名的,但如果泄露了某个人的代号,账簿又是公开的,岂不是他的所有账目都查出来了

确实是这样的。例如你要和某人交易,必然要要到他的代号才能填写交易单。因为收款人一栏要填入那人的代号。不过中本聪说可以提供无限制的保密印章,建议每一次交易用不同的保密印章,这样查账簿就追查不到同一个人的所有账目了。

答疑完毕。

说明

本文用通俗比喻的方式讲解了比特币的运行机制。有几点需要说明:

为了便于理解,我做了很多简化,因此有些机制细节和实际的比特币可能不完全相同。但总体思想和关键原理是一致的。
由于很多计算机世界的东西(如公钥体系、网络传输)在现实世界中并没有特别好的对等物,所以故事里难免有一些生硬和不合常理的细节。
本文描述的是比特币网络本身的技术原理和运作机制,当在如 Mtgox 这种买卖市场中进行比特币交易时,市场做了中间代理,并不遵从上述机制

本文来自博客园,作者:linux_pro,转载请注明原文链接:http://www.cnblogs.com/linuxpro/p/17433489.html

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

相关文章

  • vdbench和fio测试磁盘性能的对比总结

    大家好,又见面了,我是你们的朋友全栈君。vdbench和fio测试磁盘性能的对比总结一、安装1、安装vdbench,首先安装java:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html其次下载vdbench安装包并进行安装:http://pan.baidu.com/s/1b7XooY;#mvvdbench50406/var/www/html/ #unzipvdbench50406.zip-dvdbench504复制启动基准测试之前,使用默认的参数检查安装是否成功完成:#./vdbench-t[root@lrrvdvdbench504]#./vdbench-t Copyright(c)2000,2016,Oracleand/oritsaffiliates.Allrightsreserved. Vdbenchdistribution:vdbench50406WedJuly2015:49:52MDT2016 Fordocumentation,see'vdbench

  • @Value竟然能玩出这么多花样

    大家好,我是苏三,又跟大家见面了。前言对于从事java开发工作的小伙伴来说,spring框架肯定再熟悉不过了。spring给开发者提供了非常丰富的api,满足我们日常的工作需求。如果想要创建bean实例,可以使用@Controller、@Service、@Repository、@Component等注解。如果想要依赖注入某个对象,可以使用@Autowired和@Resource注解。如果想要开启事务,可以使用@Transactional注解。如果想要动态读取配置文件中的某个系统属性,可以使用@Value注解。等等,还有很多。。。前面几种常用的注解,在我以往的文章《@Autowired的这些骚操作,你都知道吗?》《聊聊spring事务失效的12种场景,太坑了》《惊呆了,spring中竟然有12种定义bean的方法》中已经介绍过了,在这里就不过多讲解了。今天咱们重点聊聊@Value注解,因为它是一个非常有用,但极其容易被忽视的注解,绝大多数人可能只用过它的一部分功能,这是一件非常遗憾的事情。所以今天有必要和大家一起,重新认识一下@Value。1.由一个例子开始 假如在UserService

  • 7个模版任你选择!首页自定义全新升级,轻松一键换肤

    现在,乐享“首页自定义”功能全新升级!首页焕新即刻搞定。✔️全新的模版库:多种风格模版,轻松一键换肤,分分钟搞定页面搭建✔️ 丰富的页面设计:自由变换布局,灵活调整样式,满足定制化需求✔️ 强大的内容互联:自动关联平台应用,支持聚合外部内容,打造统一门户快来看看,用这个新功能,如何打造全新的乐享社区!为你准备7大模版支持一键换肤你现在的乐享社区还是长这个样子吗?⬇️你知道可以一键换肤成这个样子吗?⬇️ 你知道甚至可以换成这样、这样、还有这样吗?⬇️ 左右滑动查看更多模版这些酷炫的页面你现在就可以拥有! 全新更新的“首页自定义”上线了最受期待的模版库,目前,我们已为你准备了7大模版,手机端电脑端均可一键套用——三种主题色、三类使用场景,还有一个特色专题页,多个模版供你选择!乐乐还正在打造行业模版、节日模版,敬请期待!只需3步,就能上线新首页:选中你心仪的模版,点击“立即新建”,根据你的需求调整内容后选择“设为首页”。再也不用拜托(跪求)设计师了?强大的组件库让你自由变换布局模版库丰富了,但你可能还有这些疑问:?我们有专属的品牌特色,通用的模版并不适合。?模版好看,但我想要放更多乐问内容。

  • 极简开发,一键导入swagger,即刻开放你的API接口

    极简开发swagger是一个广泛使用的接口文档和开发工具,很多接口项目都正在用swagger维护和自动生成接口文档。当需要对外开放你的API接口时,可以结合接口大师这个工具,实现界面化操作、低代码开发,从而即刻开放你的API接口。swagger介绍swagger是一款开源工具,可以提供给个人、企业和团队进行接口管理和开发。swagger提供了:接口设计、接口开发、接口文档、接口测试、接口模拟、接口生成和接口监控等功能。结合swaggerUI,可以在线生成你的接口文档。一键批量导入swagger当需要基于现有的swagger接口,开放API接口时,可以结合接口大师这款工具,一键导入。首先,登录接口大师的管理后台,进入接口管理,选择【导入swagger】。选择并导入你的swagger.json文件,然后,选择你需要导入的API接口,可以批量选中、或部分选中。接着,开始导入。最后,完成导入。简单三步,即可导入你的swagger接口到接口大师。即刻开放你的API接口导入swagger接口后,在接口大师,可以通过后台界面进行更多的接口的管理和开发。导入后的接口调整和管理作为接口开发和平台管理,在

  • 腾讯云开发者社区杂货摊年终上新,定制礼盒发发发!

    五谷丰登好时节,瑞雪兆迎丰收年。2020年即将度过,不管今年经历了什么样的风雨,腾讯云开发者社区始终作为一个温暖的港湾,和技术开发者们度过风雨,一同见证彩虹。站在年岁交替的时刻点,就让腾讯云开发者社区送给大家今年的最后一波温暖,社区杂货摊第二季悄然上线。来社区积攒“云+值”,就能免费获取腾讯云开发者社区定制新年礼盒,包含:腾讯云开发者社区定制杯子*1;腾讯云开发者社区定制贴纸*1;腾讯云开发者社区定制贺卡*1;腾讯视频VIP月卡*1; 腾讯云开发者社区定制渔夫帽*1;腾讯云开发者社区定制利是封*1;腾讯云开发者社区定制程序员日历*1;腾讯云开发者社区周年庆定制冰箱贴*1。每拥有5个“云+值”,还可以获得一次抽奖机会,抽取鹅厂牛年生肖公仔、Mouse-Q系列盲盒等好礼。抽奖池奖品如下,快来试试你的手气吧。那么,如此诚意满满、福利多多的社区杂货摊要怎么参与呢?点击社区活动主页:https://cloud.tencent.com/developer/grocery-stall2或文末「阅读原文」处,即可直达杂货摊现场,获取饱含社区心意的特色礼品。2021正在昂扬走来,新的一年腾讯云开发者社区

  • Transformer又来搞事情!百万像素高清图轻松合成,效果迷人

    你上一次听到用Transformer生成图像,应该还是iGPT刚问世的时候吧?当时OpenAI用GPT-2来分类和补全图像,取得了令人惊艳的成果。遗憾在于,iGPT生成的图像最大只有64x64像素。现在,我要告诉你,最上面这张图像也是Transformer生成的,分辨率有1280x460之高。合成这张图像的模型名叫VQGAN,而且,它能做的事情远不止于此。先看看VQGAN和iGPT的对比,前者生成的图像明显高清得多。VQGAN还能用语义图引导生成样本:用深度图引导生成样本:用姿态图引导合成样本:用类别引导合成样本:随机合成样本:执行超分辨率任务:说了那么多,它们的共同点是啥?当然是高清啦!最后再展示一些用语义图引导合成的样本,从上往下的分辨率分别是:1280×832、1024×416、1280×240。没错,都是百万像素级别的。VQGAN功能多,生成的图像又高清,就用下图来总结一下。本文提出的Transformers统一了广泛的图像合成任务。图中展示了在不同条件输入和数据集上的256×256合成结果,所有这些结果都是用同样的方法获得的,即VQGAN——利用基于CNN的有效归纳偏置,并结

  • Druid学习笔记(一) - 监控功能的开启

    现在基于springBoot的项目的数据库连接池一般都是采用阿里提供开源的druid,作为开发人员来说,学习druid就是基础,毕竟天天都在用。如果还不懂druid,那么要是被别人问到了。那就尬尴了,那么就目前来说作者的短期目标就是学习durid,希望能通过druid的学习达到熟练掌握druid的目标,除此之外。作者也希望通过druid的学习能够手撸一个连接池demo。看到本篇文章的同学基本都在工作中多多少少的使用过druid,那么你们有没有使用过druid的sql监控功能。显然将sql的监控功能放到数据库连接池这里是合理的,mybatis解决的是数据与业务的问题。而durid解决数据库连接池的问题。因为sql都要通过数据库连接进行数据传输,所以在此监控是再合适不过了。druid如何开启监控功能?1,配置监控功能@Configuration publicclassDruidConfigDemo{ /** *配置监控服务器 * *@return返回监控注册的servlet对象 */ @Bean publicServletRegistrationBeanstatViewServletDe

  • 学以致用C++设计模式 “建造者模式”

    这是一段防爬虫文字,读者可跳过 本文为CSDN作者“看,未来”原创,我的CSDN地址为https://lion-wu.blog.csdn.net/ 本篇隶属于我的专栏-《设计模式之设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html 作者版权,未经允许,禁止转载。 多道工艺打造极佳产品今天,他突发奇想,为什么做汉堡就得是那个顺序呢?为什么不能先把肉烤好,然后凉一会?为什么不能先挤奶油然后把带着奶油的面包拿去烤?为什么要用生菜不用熟菜?他想着,就决心变革。但是他跟他的员工讲不通啊,员工不理解他,他怒了,他把自己能想到的搭配顺序列成abcdefg等计划,然后告诉员工:“你,给我去做A计划”、“你,给我去做B计划”、“你,给我去做C计划”···于是一切就这样井然有序的执行了。那么这件事中涉及到些什么呢? 首先涉及到上一篇模板方法模式,我说了这俩模式契合度挺高。 然后还涉及到老板那天马行空的abcdefg,是吧,乍一看,好多个模板套一起,咋整?那就是“建造者模式”!那我们来化成图: 代码实现#include<ios

  • GitHub重大更新:在线开发上线,是时候卸载IDE了

    机器之心报道参与:Racoon、JaminGithub最新推出的Codespaces可以实现基于VSCode的云端代码编译。现在,你在手机、平板上都可以直接进行开发。云端开发不能更美好了,用上Codespaces后,不仅可以把IDE卸载掉,什么Conda、Docker都可以删了「大误」。在今年GitHub的第一个虚拟会议——Satellite上,GitHub发布了由VisualStudio提供技术支持的在线IDE工具——Codespaces。这是一款集成在GitHub网页中的开发工具,为开发者提供了不离开页面的「沉浸式」开发体验,目前已向公众开放小规模测试。Codespaces传送门:https://github.com/features/codespaces值得一提的是,在Satellite上与Codespaces一同发布的还有:GitHubDiscussions:一种在codebase之外开展合作的新方式;Codescanningandsecretscanning:帮助GitHub中的社区制作或使用更安全的代码;GitHubPrivateInstances:专为有严苛安全需求的用户

  • Prometheus TSDB

    GorillaTSDB架构类似方案对比OpenTSDB:基于Hbase不做  timerollupaggregationforolderdata(对比较老对数据进行精度压缩,比如按小时为粒度存储)aricherdatamodelforidentifyingtimeseriesWhisper(Graphite):storestimeseriesdataonlocaldiskintheWhisperformat,aRoundRobinDatabase(RRD)styledatabase需要时序数据固定intervalInfluxDB:AevenricherdatamodelthanOpenTSDB.由于其灵活性,存储磁盘消耗更大。作者认为以上方案的通用问题:从磁盘查不够快。数据压缩时间戳压缩:计算 deltaofdelta: D=(t3 - t2)-(t2 - t1)根据D的分布范围进行类似霍夫曼编码,比如D的访问可以分成5类0,-63~64,-255~256,-2047~2048,其他5个类别的出现概览由高到底,这样就可以进行编码压缩,压缩实验显示96%的时间戳都可以压缩到1bit即0数

  • 【DB笔试面试725】在Oracle中,什么是GPnP?

    ♣题目部分在Oracle中,什么是GPnP?♣答案部分 网格即插即用(GridPlugandPlay,GPnP)是Oracle11gR2RAC提供的新组件,该组件的功能由gpnpd.bin守护进程实现。GPnP可以提供一个动态的GI环境,能随着负载的增加而动态改变GI环境。GPnP能非常容易地添加、替换或者移除集群中的节点,就像电源插头一样即插即用。GPnP主要由GPNPD、mDNS、SCAN和GNS组成。mDNS(MulticastDomainNameService)负责在节点内部进行IP的解析,在添加节点的时候不需要手动修改每个节点的/etc/hosts文件。GPNPD服务提供的是集群配置信息管理,新的节点添加进来会根据现有的GPnPprofile配置信息来配置新的节点,同时更新所有节点的GPnPprofile文件。一旦新添加的节点加入到集群,SCAN机制动态地将连接分配给该节点,所有的客户端都不需要进行任何配置的变更,就能实现节点的负载均衡。GNS(GridNamingService)能动态地为新添加的节点分配VIP地址,利用DHCP管理公共网络中的IP地址。这些服务共同构成了“

  • mysql中的慢查询日志

    本篇博文的mysql版本:5.7.26操作系统版本:CentOSLinuxrelease7.7.1908(Core)一、什么是慢查询日志?MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀(fá)值的语句。具体指的是运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10s(秒)以上的语句,就会被认作为是慢查询SQL语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数。如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。二、慢查询日志相关参数2.1、查看是否开启慢查询日志mysql> show variables like '%slow_query_log%';+---------------------+----------------------------------------+| Variable

  • JDK1.9-TCP通信程序

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_42528266/article/details/103366376第二章TCP通信程序2.1概述TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。两端通信时步骤:服务端程序,需要事先启动,等待客户端的连接。客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。在Java中,提供了两个类用于实现TCP通信程序:客户端:java.net.Socket类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。服务端:java.net.ServerSocket类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。2.2Socket类Socket类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。构造方法publicSocket(Stringhost,intport):创建套接字对象并

  • 基础知识 | 每日一练(168)

    基础知识练习士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。——菜根谭读者:怎样调用一个由char*指针指向函数名的函数?小林:最直接的方法就是维护一个名字和函数指针的列表:intone_func(),two_func();intred_func(),blue_func();struct{char*name;int(*funcptr)();}symtab[]={"one_func",one_func,"two_func",two_func,"red_func",red_func,"blue_func",blue_func,};然后搜索函数名,就可以调用关联的函数指针。读者:怎样实现比特数组或集合?小林:使用int或char数组,再加上访问所需比特的几个宏。这里有一些简单的宏定义,用于char数组:#include<limits.h>/*forCHAR_BIT*/#defineBITMASK(b)(1&l

  • 图解经典电路之万能充电器

    老规矩,从简到难,逐步完善。先从最简单的开始讲。(图一最简单锂电池充电电路)最简单的锂电池充电电路。输入5V电源,通过一个二极管降低0.7V电压,然后直接给电池充电。好,那么关于电池极性接反的问题,我们应该怎么解决?来看下面一个神奇的芯片CD3582。(图二通过专用芯片识别电池极性)上面这个图中使用专用芯片cd3582来做电池极性检测,如图,芯片VS+,VS-是电源输入,x1,w两个引脚检测电池极性,并根据需要调整电压极性,然后给电池充电。有了这个芯片,妈妈再也不用担心我电池接反啦。:),另外x2,y1,y2都是状态指示灯了,没什么好说的。ok,这样看上去是不错,但是5V的输入电源是从哪里来的那?额,慢慢来,这个电源当然是从220V市电降压整流后送过来的。看下图,有请我们高压隔离反激式降压电路上场。(图三反激式降压电路形象比喻是不是够形象,说白了降压就是根据自己的需要,从大的能量池里取出自己需要的能量,放在自己的小池子里以供使用。上图从左往右看,220V高压交流电相当于波涛汹涌的海水,被灌进一个大的蓄水池(滤波大电容),进到蓄水池里的水逐渐平静下来。然后被运水工(主变换电路,包括功率三

  • 详解Struts2拦截器机制

         Struts2的核心在于它复杂的拦截器,几乎70%的工作都是由拦截器完成的。比如我们之前用于将上传的文件对应于action实例中的三个属性的fileUpload拦截器,还有用于将表单页面的http请求参数设置成action中对应的属性的param拦截器等。总之,在整个Struts框架中拦截器的作用是相当大的,本篇将从以下几点详细介绍下有关Struts拦截器的内容:拦截器在Struts中的作用自定义拦截器实现类配置拦截器(包含配置默认拦截器)引用拦截器配置拦截指定方法的拦截器拦截器的拦截顺序一、拦截器在Struts中的作用      在我们的web.xml中,我们配置了一个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类。一旦接受到任意action的请求,该类会创建和初始化一个ActionProxy实例,它代理了具体的action,在其中我们可以添加任意拦截器在execute方法执行之前和之后做一些额外的操作,最终会调用该action实例的execute方法,为用户返回视图结果字符串,然后系统会根据该视图结果字符串调取相应的视图页面。下图是

  • 视图传递变量

    向视图中传递变量 我们在开发web应用当中,通常都不是为了写静态页面而生的,我们需要跟数据打交道,那么这个时候,问题就来了,在一个MVC的框架中,怎么将数据传给视图呢?比如我们要在 ArticleController 的 index 方法的视图输出一个 $title 的变量,在Laravel中,有下面几种常见的方法: 使用with()方法 publicfunctionindex() {   $title='文章标题1';   returnview('articles.lists')->with('title',$title); } 复制 这样的 with('title',$title) 中,第一个 'title' 就是key,第二个 $title 就是值,这样我们就可以在我们的 articles/lists.blade.php 中输出这个变量了: 刷新我们的 blog.dev ,就可以看到类似这样的页面了:

  • 码到成功——测试随笔

    码到成功——测试随笔 这个作业属于哪个课程 班级的链接 这个作业要求在哪里 作业要求的链接 这个作业的目标 计划阶段4天,Alpha冲刺阶段共计10天,冲刺阶段要求每天进行小组会议,讨论当前项目昨日进展、存在问题、今日安排(安排需要组长根据情况灵活修改)冲刺阶段每天发布一篇随笔要求包括当天会议照片、会议内容以及项目燃尽图。 作业正文 .... 其他参考文献 ... 一.概述 本次测试内容分为功能测试和接口测试,对于小程序的一些基本功能进行测试。 二.工具选择 微信开发者工具,postman 三.工具使用 在微信开发者上测试功能的用例测试,在postman上测试接口 四.测试工作安排 项目 测试类型 测试结果 功能项 账号注册 通过 功能项 账号登录测试 通过 功能项 查看商品信息 通过 功能项 卖家发布商品 通过 功能项 买家查看商品 通过 功能项 买家通过关键字搜索商品 通过 功能项 买家查看单个商品信息 通过 功能项 买家私聊买家 通过 功能项 买家通过商品查看卖家信息 通过 功能项 查看个人浏览历史

  • Security基础(四):OpenSSL及证书服务常用系统监控命令、搭建nagios监控服务器、配置文件及插件使用、监控远程主机的公有数据、监控远程主机的私有数据

    一、OpenSSL及证书服务常用系统监控命令 目标: 本案例要求练习常用的系统监控命令完成以下任务:    使用vmstat命令监控内存及磁盘I/O信息    使用iostat命令监控CPU处理器及磁盘的I/O信息    使用sar命令监控系统最近的CPU/内存等活动 步骤: 步骤一:使用vmstat命令监控内存及磁盘I/O信息 1)报告内存、交换分区、CPU等活动信息,每2秒更新一次数据    [root@svr7~]#vmstat2   procs-----------memory-------------swap-------io-----system--------cpu-----    r b  swpd  free  buff cache  si  so 

  • 读Ghost博客源码与自定义Ghost博客主题

    我使用的Ghost博客一直使用者默认的Casper主题。我向来没怎么打理过自己博客,一方面认为自己不够专业,很难写出质量比较高的文字;另一方面认为博客太耗时间,很容易影响正常的工作内容。最近公司即将搬迁,我的开发工作也告一段落,因此抽点时间自定义一个自己的博客主页。 备注:上图来自GhostChina官网,与本文内容无关。 Ghost与Ghost主题 Ghost自称是专业的内容发布平台,实际上跟WordPress相比它只能算一个相对比较年轻的博客系统,在功能上完全无法与成熟的WordPress相比。 我之所以选择Ghost作为博客系统除了它简单方便,更因为它是基于Node.js且开源。毕竟基本的功能有了,如果有其他需求的话自己改代码就可以实现。Ghost提供HTTP服务用的是Express框架。这是一种对我这类半路接触js的人都可以轻易掌握的框架。 Ghost主题存放在安装路径的content/themes目录中。安装包自带了Casper和Roon两个主题,其中前者为默认主题。 Ghost支持HandleBars模板语言,自带的两个主题也是基于此语言编写的,因此,定制Ghost主题最

  • 前后端分离实际容易产生的问题

    前后端分离现在火了很多年,在实际中新技术的使用一般是先在一些大厂中采用,比如在招聘网上大厂的前端招聘node要求比较高,而在中小型厂中对node的要求只是会用webpack打包工具以及npm包管理就可以了。最近几年传统公司、中小型公司开始构建前后端分离模式,前后端分离的好处网上文章很多,简单说前端可以专注前端的开发,后端专注后端开发,开发效率和质量都会得到提升,但在实际项目组中因为很多leader资历比较老,思维方式还是传统的软件开发的思维,所以构建出来的团队只是前后端分离的形。我分享下我转前端以来待的3家公司前后端分离模式踩的坑,也自己整理总结下前后端分离模式中要提前做好的协调和准备。 正式转前端,第一次接触前后端分离 我之前是做.net,做的项目大部分是后台管理系统,那时候没有分前端后端,一般是一个功能从数据库到前端一起做,所以工作按时间分布一半时间敲C#代码一半时间写js,那时候后台管理对页面美观的要求不高考虑开发效率所以一般都是用extjs、jQueryeasyUI以及后面出来的bootstrap把样式封装好了,只要用里面的组件拼接页面实现业务逻辑就可以了。但随着C#在市场的需

相关推荐

推荐阅读