A. 什么是混合共识算法
转载泛融科技创始人谭宜勇博士的回答:
共识是区块链技术的核心算法,也基本上决定了该链的效率。区块是机器之间所需要共识的内容。账户层面,通过OLog(n)的Merkle验证树,可以快速定位出被篡改的数据,遍历StateTree安全获取用户余额,防止双花的出现。
区块链通过共识算法,让机器之间达成信任的基础,从实践上就是去解决拜占庭将军问题。BFT(拜占庭将军容错)里面,3F+1<N可以说是重要的共识理论,在实践中,BFT有多种变种算法:PBFT、RBFT、Q/U、HQ、Zyzzyva、ABsTRACTs、Aardvark、Adapt、A2M-PBFT-EAandMinBFT等等。这些算法,都根据不同设定的场景,从消息的广播方式、节点网络拓扑、硬件配置等方面进行了效率的优化。共识目标是达成共识,最终的解决方案就是投票(Vote),无论是BFT、PoW、PoS、DPoS……投票就有点模拟人类的生产模式,在区块链里面,是机器去投票。BFT类似于4PC(四段式)提交,从PrePrepare,PrePare,Commit,Reply四个阶段。每个阶段都要把消息广播给网络中的所有节点,参与下一个阶段的投票。
BFT最大的问题是节点之间的消息广播,会特别多。而且必须事先确定本次消息投票的节点基数。结合BFT投票性能差的问题,我们提出了一种方案,让BFT仅仅参与很少的投票过程,例如就是节点基数上。假定有100个备选节点,如何选出21个节点出来?每个节点记多少个块?这100个节点的能否达到了当前最高的高度,网络延迟等性能能否达标?这些信息,实际上跟我们交易没有任何关系。但是又会影响到整个链的性能。我们用PBFT去解决节点基数问题,为后续的交易广播和区块投票,提供了更高更高效的基础设施。在这一层,大家都是平等的,没有权益的参与。
下一步,Raft是一个Leader-Follow的算法,每一轮Term会随机选出一个Leader来,负责交易的收集和广播,其他节点Follow主节点的信息。在垂直的区块链3.0应用中,对链上的VM性能要求更高,而不是简单的栈式计算(EVM)了。例如游戏的主服务器逻辑放,如果每个节点都参与VM的计算,会造成大量的资源浪费。大数据处理系统里面,Raft可以去解决分工问题,做一个工作的调度者,可以让任务公平、安全的分发到不同的节点机器上。这样好处是可以通过几台机器,构建一个超级机器。Raft共识在我们链中,负责交易的验证广播分发,这是成块的基础,如果交易都是错误的,那就无需要进入区块了。
最后我们结合了DPoS共识算法,随机生成当前的轮值节点,对已验证过的交易进行打包和区块头的广播。区块仅仅是个头部验证信息而已,可以快速的到达每台机器。关于轮值的节点,我们认为一个节点每次就记一次块。出块速度由网络较好的节点决定,由他们构成了超级节点记账模式。
B. 都快2021年了,算法岗位应该怎样准备面试
说到算法岗位,现在网上的第一反应可能就是内卷,算法岗位也号称是内卷最严重的岗位。针对这个问题,其实之前我也有写过相关的文章。这个岗位竞争激烈不假,但我个人觉得称作内卷有些过了。就我个人的感觉,这几年的一个大趋势是从迷茫走向清晰。
早在2015年我在阿里妈妈实习的时候,那个时候我觉得其实对于算法工程师这个岗位的招聘要求甚至包括工作内容其实业内是没有一个统一的标准的。可以认为包括各大公司其实对这个岗位具体的工作内容以及需要的候选人的能力要求都不太一致,不同的面试官有不同的风格,也有不同的标准。
我举几个例子,第一个例子是我当初实习面试的时候,因为是本科生,的确对机器学习这个领域了解非常非常少,可以说是几乎没有。但是我依然通过了,通过的原因也很简单,因为有acm的获奖背景,面试的过程当中主要也都是一些算法题,都还算是答得不错。但是在交叉面试的时候,一位另一个部门的总监就问我有没有这块的经验?我很明确地说了,没有,但是我愿意学。
接着他告诉我,算法工程师的工作内容主要和机器学习相关,因此机器学习是基本的。当时我就觉得我凉了,然而很意外地是还是通过了面试。
核心能力
由于我已经很久没有接触校招了,所以也很难说校招面试应该怎么样准备,只能说说如果是我来招聘,我会喜欢什么样的学生。也可以理解成我理解的一个合格优秀的算法工程师应该有的能力。
模型理解
算法工程师和模型打交道,那么理解模型是必须的。其实不用说每一个模型都精通,这没有必要,面试的时候问的模型也不一定用得到。但更多地是看重这个人在学习的时候的习惯,他是浅尝辄止呢,还是会刨根究底,究竟能够学到怎样的地步。
在实际的工作当中我们可能会面临各种各样的情况,比如说新加了特征但是没有效果,比如升级了模型效果反而变差了等等,这些情况都是有可能发生的。当我们遇到这些情况之后,需要我们根据已知的信息来推理和猜测导致的原因从而针对性的采取相应的手段。因此这就需要我们对当前的模型有比较深入地了解,否则推导原因做出改进也就无从谈起。
所以面试的时候问起哪个模型都不重要,重要的是你能不能体现出你有过深入的研究和理解。
数据分析
算法工程师一直和数据打交道,那么分析数据、清洗数据、做数据的能力也必不可少。说起来简单的数据分析,这当中其实牵扯很多,简单来说至少有两个关键点。
第一个关键点是处理数据的能力,比如SQL、hive、spark、MapRece这些常用的数据处理的工具会不会,会多少?是一个都不会呢,还是至少会一点。由于各个公司的技术栈不同,一般不会抱着候选人必须刚好会和我们一样的期待去招人,但是候选人如果一无所知肯定也是不行的。由于学生时代其实很少接触这种实践的内容,很多人对这些都一无所知,如果你会一两个,其实就是加分项。
第二个关键点是对数据的理解力,举个简单的例子,比如说现在的样本训练了模型之后效果不好,我们要分析它的原因,你该怎么下手?这个问题日常当中经常遇到,也非常考验算法工程师对数据的分析能力以及他的经验。数据是水,模型是船,我们要把船驶向远方,只懂船只构造是不行的,还需要对水文、天象也有了解。这样才能从数据当中捕捉到trick,对一些现象有更深入的看法和理解。
工程能力
虽然是算法工程师,但是并不代表工程能力不重要,相反工程能力也很重要。当然这往往不会成为招聘的硬性指标, 比如考察你之前做过什么工程项目之类的。但是会在你的代码测试环节有所体现,你的代码风格,你的编码能力都是你面试的考察点之一。
并不只是在面试当中如此,在实际工作当中,工程能力也很关键。往小了说可以开发一些工具、脚本方便自己或者是团队当中其他人的日常工作,往大了说,你也可以成为团队当中的开发担当,负责其团队当中最工程的工作。比如说复现一篇paper,或者是从头撸一个模型。这其实也是一种差异化竞争的手段,你合理地负担起别人负担不了的工作,那么自然就会成为你的业绩。
时代在变化,行业在发展,如今的校招会问些什么早已经和当年不同了。但不管怎么说,这个岗位以及面试官对于人才的核心诉求几乎是没有变过的,我们从核心出发去构建简历、准备面试,相信一定可以有所收获。
C. 如何解决 raft 算法中 leader 节点的负载均衡问题
raft 算法中是有 leader 的,而且所有操作请求都要转发到 leader 节点,再由 leader 节点发日志到各 follower 节点同步。那么 leader 就会成为一个性能瓶颈,因为所有操作都要发到 leader 上处理。
D. zookeeper有什么功能,选举算法如何进行
选举机制(FastLeaderElection算法):sid最大且被超过集群中超过半数的机器拥护就会成为leader. 所以只有两种情况无法选出leader: 整个集群只有2台服务器(注意不是只剩2台,而是集群的总节点数为2) 整个集群超过半数机器挂掉。 所谓的偶数问题...
E. 如何在SMR系统中使用PAXOS算法
先来看一下用于在分布式节点间传递提案(accept_req)的数据结构:
struct accept_req {
node_id_t node_id;
view_stamp msg_vs;
view_stamp req_canbe_exed;
};
struct view_stamp {
view_id_t view_id;
req_id_t req_id;
};
typedef uint32_t view_id_t;
对应它,我们还需要在节点上维护几个变量:
highest_committed_vs
highest_seen_vs
highest_to_commit_vs
我们的分布式系统使用的是三个节点,其中一个是leader,其余两个是secondary node。
highest_seen_vs表示该节点目前接收到的请求中提案号最大的。
在leader上,highest_seen_vs用于产生一个请求的提案号(也就是上面提到的view_stamp这个数据结构):
view_stamp next = get_next_view_stamp(comp);
view_stamp_inc(comp->highest_seen_vs);
leader每从client接收一个请求(准确地说,应该是一个socket operation,包括connect, send, close三种),就将next与这个请求绑定,按照到来的顺序依次加1。leader节点上的highest_seen_vs可以代表目前已接收请求中编号最大的那个。
在secondary节点上,highest_seen_vs的更新要根据来自leader的提案(一开始提到的accept_req)。这个提案代表一个请求,所以它包含这个请求的提案编号 msg_vs。当secondary节点接收到这个提案后,会将提案的msg_vs和这个节点上维护的highest_seen_vs进行比较,如果前者比后者大,就将后者更新为前者:
// update highest seen request
if(view_stamp_comp(&msg->msg_vs,comp->highest_seen_vs)>0){
*(comp->highest_seen_vs) = msg->msg_vs;
}
再回到leader上,看看这个提案是如何构造的。一个提案代表一个请求。通过上面的介绍,我们已经知道提案中的msg_vs就是leader分配给这个提案的编号,那req_canbe_exed代表什么呢?先介绍一下highest_to_commit_vs:
highest_to_commit_vs表示该节点即将要提交的请求。
提交请求指的是这个请求已经获得三个节点大多数(两个或三个节点)认可,可以把它提交给真正的服务器进行处理。这是PAXOS用来将一个请求在三个节点间达成一致的方式。
highest_committed_vs 表示已经提交的请求中最大编号。
也就是说,请求可以分成三种类型:已被接收但未被认可,已认可但未被提交,已提交。
再回到leader上的req_canbe_exed,在leader构造一个请求的提案时,有:
msg->req_canbe_exed.view_id = comp->highest_to_commit_vs->view_id;
msg->req_canbe_exed.req_id = comp->highest_to_commit_vs->req_id;
可见req_canbe_exed传达的是leader节点上即将要提交的请求的提案号。当这个提案发给secondary节点时,secondary节点会把该提案中的req_canbe_exed与自身的highest_to_commit_vs进行比较,如果前者大,就将后者更新为前者:
if(view_stamp_comp(&msg->req_canbe_exed,
comp->highest_to_commit_vs)>0){
// 如果前者大于后者
*(comp->highest_to_commit_vs) = msg->req_canbe_exed;
SYS_LOG(comp,"Now Node %d Can Execute Request %u : %u .\n",
comp->node_id,
comp->highest_to_commit_vs->view_id,
comp->highest_to_commit_vs->req_id);
}
F. 一个关于投票的C语言问题
for(i=1;i<=10;i++)
scanf("%s %s",leader_name1,leader_name2);
这里有点问题,你就把他们分开写,这样输入你输入的啥名字啊?
你的判断这块也有问题。
就是几个if这里
我在看看
楼上的你也有问题啊。
如果有了废票那它还是要加 1 啊怎么会直接
if (strcmp(leader_name1,leader_name2)==0) //先判断是否选的同一人,如果是的话就把废票加1,然后就把被投人的票数加一;
{feipiao=feipiao+1;
for(j=0;j<3;j++)
if(strcmp(leader_name1,leader[j].name)==0) leader[j].count++;
}
else //说明不是废票直接就判断是投给那两个人了。。分别把票数加一。
{
for(j=0;j<3;j++)
if(strcmp(leader_name1,leader[j].name)==0) leader[j].count++;
if(strcmp(leader_name2,leader[j].name)==0) leader[j].count++;
}
这样你试试。
G. cutleader中异形排版算法是什么意思
cut leader
切的领导者
H. 大鱼吃小鱼游戏中用到过哪些算法
大鱼吃小鱼游戏中用到过ZooKeeper的算法。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户 。
Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。
ZooKeeper 的架构图中我们需要了解和掌握的主要有:
(1)ZooKeeper分为服务器端(Server) 和客户端(Client),客户端可以连接到整个 ZooKeeper服务的任意服务器上(除非 leaderServes 参数被显式设置, leader 不允许接受客户端连接)。
(2)客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送信息。如果这个 TCP 连接中断,客户端将自动尝试连接到另外的 ZooKeeper服务器。
客户端第一次连接到 ZooKeeper服务时,可以接受这个连接的 ZooKeeper服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。
(3)上图中每一个Server代表一个安装Zookeeper服务的机器,即是整个提供Zookeeper服务的集群(或者是由伪集群组成)。
I. 配置奇数个zookeeper 只起偶数个活的zookeeper 怎么选举leader
选举机制(FastLeaderElection算法):sid最大且被超过集群中超过半数的机器拥护就会成为leader.
所以只有两种情况无法选出leader:
整个集群只有2台服务器(注意不是只剩2台,而是集群的总节点数为2)
整个集群超过半数机器挂掉。
所谓的偶数问题其实是另一个集群优化配置问题,即:集群的容灾数量=集群总节点数/2-1
假如集群有5节点,那么最多允许2个节点挂掉,如果有3节点挂了,那么整个集群的选举结果不会满足条件:集群中超过半数的机器拥护。
假如集群有6个节点,那么最多也只能挂掉2台,因为挂了3台时,选举结果也不会满足条件:集群中超过半数的机器拥护。
结果可以看出,多那一台用处并不大。所以集群总数推荐为奇数。
J. 如何成为算法leader
专业知识扎实。
拥有特别强大的专业知识,就会成为算法leader。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。一个算法必须具有:有穷性、确切性、输入项、输出项、可行性五个性质。