区块链以太坊以及hyperledger总结

https://learnblockchain.cn/

1.什么是智能合约?它有什么特点?

就是具有交互能力而且能够在区块链中传递的合约

一个由计算机代码控制的以太币账户

特点: 公开透明、能即时与区块链代币结合、去中心化而且生命力顽强(即时公司倒闭, 产品依然可以在链上运行)

编译部署智能合约到真实的区块链网络:

1) 编译(compile)用到了solc, 通过solidity编译器与javascript的绑定,转换为utf-8可读格式, 导出去即可随时调用

2) 生成web3, 拿到metamask里面的provider, 也就是用户的provider, 让用户使用用户掏钱, 导出web3

3) 部署(deploy)首先导入web3, 取到compile里的interface以及bytecode, 在npm库里下载一个HDwalletProvider钱包, 默认有5个账户, 把自己的metamask账户(也就是助记词)也部署进来, 然后部署一个infura(以太坊和区块链开发的总线系统), 使用infura就可以不用自己建节点, 接下来就是钱包账户的相互转账操作, 打印出来的地址可以到etherscan上查得到

2.以太币和比特币的区别?

以太坊相对于比特币出块时间是不一样的, 以太坊是15-30s, 比特币是10min左右,

以太坊没有采用比特币的utxo的模型,而是采用账户模型,效率本事就高一些. 另外以太坊采用了叔区块和默克树等方式优化了 出块的效率

3.说说Solidity编程语言的特点?和Javascript、Python有什么区别?

solidity是强类型编程语言, javascript和python是弱类型编程语言, 它运行在Ethereum虚拟机(EVM)之上

Solidity是以太坊的首选语言,语法接近于Javascript,是一种面向对象的语言,这降低了学习门槛,易于被掌握和使用,因为JavaScript是Web开发者的常用语言。因此,Solidity充分利用了现有数以百万程序员已掌握JavaScript这一现状。

solidity基本数据类型: 

类型 说明 示例
string 字符串 "hello solidity"
bool 布尔 true / false
int 整型 300 , 0 , -200
uint 非负整数 30
fixed/unfixed 小数 3.14 / -3.14
address 地址 0xD53a291C6807eebCA371a3aF9Cb40Bb7556B7DC4

4.以太坊虚拟机EVM以及JVM有什么差别?

虚拟机都是跨平台的

以太坊实现了一个叫Ethereum Virtual Machine(EVM)的运行时环境,类似JVM,它的主要工作是执行智能合约的字节码,EVM“位于区块链之上”,而JVM主要是执行目标代码(字节码),内存回收机制也不一样

5.docker的原理? 

https://blog.csdn.net/yc199505/article/details/72366982

docker相当于一个集装箱, 用container容器装好各种需求的东西, 当要使用这些东西的时候, 只需要通过container拿到里面的镜像即可, 所以也可以称他为虚拟机, 只要拉下来一个集装箱, 就可以运行集装箱里面的东西了

区块链以太坊以及hyperledger总结_第1张图片

6.讲一下默克树以及二叉树?

默克尔树就是一个hash树, 可能是二叉的 也可以是多叉的, 默克树的基本原理就是将叶子节点两两配对做哈希运算  所以都是偶数

个. 如果碰到奇数个就 复制一个成偶数个, 默克树的作用 就是不需要拿到全部区块 找到部分区块 就可以验证数据是否正确.

区块链以太坊以及hyperledger总结_第2张图片

http://www.blockchainbrother.com/article/466  go语言版的默克树

7.区块链是怎么加密的, 说一下它的加密步骤?

https://www.cnblogs.com/bruceshao/p/8535324.html   

8.gas每次交易会不会发生变化?

gas(油)如果在做智能合约的时候值固定的话是不会发生变化的, 而没有固定的话会根据用户所给的gas量进行挖矿, 如果量多那么矿工会优先挖gas多的交易

9.发行比特币类山寨币的流程?

https://baijiahao.baidu.com/s?id=1591255057902365263&wfr=spider&for=pc  

10.公钥地址怎么生成的?

https://www.walian.cn/zixun/news/113.html    - -

http://bjiebtc.com/miyao-shengcheng-qkl/    私钥生成的详细方法

11.交互以太坊网络用过什么协议?

rpc(Remote Procedure Call), 远程进程调用的协议, 可查看metamask测试网络下一栏的端口, rpc端口也是8545, rpc使得开发包括网络分布式应用更加的容易.

不论什么时候只要多个路径产生了,一个”分叉“就会出现。我们通常都想避免分叉,因为它们会破坏系统,强制人们去选择哪条链是他们相信的链。 为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“GHOST协议(GHOST protocol.)”的数学机制。 简单来说,GHOST协议就是让我们必须选择一个在其上完成计算最多的路径。区块号越大,路径就会越长,就说明越多的挖矿算力被消耗在此路径上以达到叶子区块。使用这种推理就可以允许我们赞同当前状态的权威版本。

13.base64和base58是什么,解释一下?

https://xz.aliyun.com/t/2255

14.什么是mocha、solc、ganache、truffle?

在使用这些测试框架的时候, 必须要安装好node的环境  http://nodejs.cn/

mocha: javascript的一套框架;

solc: 用来编译智能合约的 , 是一套测试框架;

ganache: 一套测试网络, 测试的时候不需要花费一分钱, 网络上已经把钱都准备好了, 执行起来效率也是特别高, 它相当于是testrpc的升级版, 是本地使用的, 不过是用来写做测试的, 部署到真实测试环境需要的还是rinkeby

truffle: 快速进行以太坊开发的工具集, 以太坊开发的瑞士军刀 https://truffleframework.com/  智能合约的甜蜜工具, 它可以编译、连接、部署智能合约, 管理智能合约的二进制代码, 可以测试智能合约里付钱的操作, 可以直接和智能合约进行交互, 增加我们的开发速度, 

15.为什么要用DAPP, 它的好处?

收益高, 门槛低, 符合国情, 发展前景非常大, 工具也很全面, 可以做类似于以太猫的游戏...案例: 整个以太坊上只有这一只猫, 赶快来买, 只此一只

16.信息互联网和价值互联网?

信息互联网: 一个人讲笑话, 一堆人听笑话, 当那个人讲完笑话后, 那堆人也知道了这个笑话, 是属于复制的方式进行流动

价值互联网: 我兜里有一百块, 然后现在都给你了, 我就没钱了, 而你有100块,这就是价值互联网, 属于转移的方式进行流动

17.什么是以太坊?

1) 以太坊是一个区块链的网络, 由很多节点组成

2) 以太坊可以转账,可以做数据存储

3) 以太坊网络有很多个, 主网只有一个. 还有很多测试网络, 我们也可以自己搭建私链

4) 以太坊和比特币一样 有很多的node节点组成

5) 一个node节点其实就是一个运行以太坊客户端的计算机

6) 以太坊还是公有链, 每个人都可以加入以太坊网络, 后面学的hyperledger是私有链或者是联盟链

7) 每一个以太坊节点都可以同步全部的账本/区块链信息(blockchain)

8) 可以理解以太坊是一个数据库,存储了所有的转账信息(transaction信息)

18.什么是公有链、联盟链、私有链?

公有链: 以太坊就是一个公有链

私有链: 类似于创建一个只有自己的共和国, 只有自己

联盟链: hyperledger就是一个联盟链, 也是一个私有链, 联盟链本质上仍然是一种私有链,只不过它比单个小组织开发的私有链更大,却又没有公有链这么大的规模,可以理解为它是介于私有链和公有链之间的一种区块链。

19.web3.js是什么?有什么优缺点?

是一个开发环境, 与以太坊交互的javascript的一套SDK, 也可以理解为javascript编写的工具组合, 像metamask里面用的就是web3 0.20.3版本, 可以在控制台打印查看, 因为这个版本是他们自己进行改造过的, 很稳定, 我们一般用的话都是最新版, 当然也可以自己指定哪个版本

web3.js是以太坊提供的一个Javascript库,它封装了以太坊的JSON RPC API,提供了一系列与区块链交互的Javascript对象和函数,包括查看网络状态,查看本地账户、查看交易和区块、发送交易、编译/部署智能合约、调用智能合约等,其中最重要的就是与智能合约交互的API。

20.什么是对称加密和非对称加密?

对称加密: 加密算法是一个函数, 也可以比作一个钥匙, 通过使用一个加密的钥匙, 将明文或者数据转化为一串不可读的密文代码, 加密的流程不可逆, 必须要使用对应的解密钥匙才可以把这个加密信息转化为可以阅读的明文

非对称加密: 应用场景是私钥进行加密, 公钥进行数字签名, 也就是转账签名, 原理: 按照某种密钥生成算法, 将输入经过计算得出私钥, 然后采用另一个算法根据私钥生成公钥, 公钥的生成过程不可逆。就是说现有的算法是没办法经过计算穷举出私钥的, 所以说是非常安全

21.比特币的实现步骤

https://anders.com/blockchain/hash.html   可以通过这样的一个网站进行实际体验以及理解

1) translation 交易

2) hash校验

3) 工作量证明 pow

4) block成链

5) 私钥转账签名

6) web接口

7) websocket分布式

--->sha256

---> block(一个块)

---> blockchain(后面的每一个区块都保存的上一个区块的hash, 只要改了其中一个日志内容, 那么后面的所有区块都不合法了, 想要篡改数据, 就需要把每个块进行挖矿算出来他们所对应的的hash, 工作量异常之大)

---> Distributed Blockchain(就算把一条节点上的区块链都修改了, 但是还有很多的节点peer2.peer3.....数据都没法对的上, 黑客篡改数据的工作量加大了节点个数的倍数)

---> token(数据token化, 数据是各种交易 ,增加了coinbase, 如果转账了100就只能显示100, 如果不是这个数值, 那么就是不合法的)

数字签名: 通过把原始数据加密生成私钥, 然后别人用公钥进行验证

22.以太坊账户系统的公钥和私钥

私钥 <==> 公钥  :  有了私钥就可以知道公钥, 只有公钥才能和私钥配对

公钥(长) ==> 地址(短)    :  有了公钥, 但是公钥太长了, 不方便直接观看, 所以就转化成了地址

创建账户也不需要联网, 因为只要有私钥privatekey和publickey, 并且可以配对成功, 那么就是一个账户

23.以太坊转账流程

1) 点击submit

2) 地址通过get请求发给了服务器

3) web3.js 创造了一个转账 (translation) (什么是转账,转账包含什么信息)

4) 为什么需要等待, 后台server发送translation 到rinkeby网络

5) 等待挖矿,30秒左右, 因为矿工在以太坊网络上挖矿是要耗费一定的时间

6) 后台服务器把成功信息反馈给前端

30秒详解:

1) translation提交给一个node(如何修改node,选择node?)

2) node可能在某个时间内收到很多个translation

3) node对translation排序,挖矿

4) node算好nonce就会将hash广播给全网

5) 最先算出nonce的node会得到挖矿奖励

24.通证经济学(了解即可, 面试一般用不到)

http://www.sohu.com/a/240527457_100214311   

25.solidity开发项目最终步骤

编写javascript代码 ---> 听过ABI二进制接口 ---> 调用以太坊二进制数据0011的bytecode

这样做的原因是二进制显示出来是在太长了, 不方便程序员使用和查看

26.solidity的五个关键字修饰符, 以及它们的含义

public 公有,任何人(拥有以太坊账户的)都可以调用
private 私有, 只有智能合约内部可以调用
view/constant 函数不会修改任何contract的数据
pure 函数不使用任何智能合约的变量
payable 调用函数需要付钱,钱付给了智能合约的账户

27.函数调用call和send的区别

函数调用call 函数调用 send transaction
不修改智能合约的数据 修改智能合约的数据
函数可以返回数据 函数不能返回数据, 因为函数需要花时间执行
立刻执行 需要几十秒才能执行完毕,返回值是transaction的hash
免费 要花钱 钱!!!

28.助记词的规范是什么

bip39协议, 它可以把private key转换为可读的英文助记词, 这样可以很大的避免用户记忆private key时候犯错, 导致一些财产问题

29.怎么获取metamask测试网络的eth

https://faucet.rinkeby.io/     进入这个网站, 将自己的rinkeby放入到Google+转发后生成的地址copy到这个网站, 就可以得到测试eth啦

30.软分叉、硬分叉

软分叉:如果区块链的共识规则改变后,这种改变是向前兼容的,旧节点可以兼容新节点产生的区块,即为软分叉。

硬分叉:如果区块链软件的共识规则被改变,并且这种规则改变无法向前兼容,旧节点无法认可新节点产生的区块,即为硬分叉

31.web3的工作模式

插哪个'卡'就用的哪个测试网络, 插rinkeby用的就是rinkeby的测试网络, 如果插的是ganache的卡就用的是ganache的测试网络

32.通过web3怎么获取账户

web3.eth.getAccount();

const  asset = require('assert');
const ganache = require('ganache-cli');
//约定的规范,如果变量以大写字母开头,那他就是一个构造方法(构造函数)
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());//把ganache测试网络的卡插到web3里

descirbe('Inbox',()=>{
//使用ES6新语法, async和await
      it('测试web3的api', async ()=> {
        const accounts = await web3.eth.getAccounts();
        console.log(accounts);
        const money = await web3.eth.getBalance(accounts[0]);  //第1个账户有
        console.log(web3.utils.fromWei(money,'ether')); //100个比特币
  });  
});

33.infura是什么

https://baijiahao.baidu.com/s?id=1598513126213528659&wfr=spider&for=pc

Infura - 以太坊和区块链开发的总线系统, 我们调用infura的IPA接口, 用infura提供的节点与以太坊网络进行交互

34.智能合约开发总流程总结

1) solc 编译智能合约

2) mocha测试框架 beforeEach describ it

3) ganache 创建账户

4) provider 测试provider hd-wallet provider

5) web3 交互, 部署到真实的网络(rinkeby测试网络 )

35.express是什么?

Express基于 Node.js 平台,快速、开放、极简的 web 开发框架

http://www.expressjs.com.cn/

36.智能合约的安全问题

1) 最早的安全问题呢就是以太坊的DAO事件了, 导致了区块链的硬分叉, 后来又出来了软分叉

2) 再就是比如说uint8数据类型的范围是0 ~ 255, 256位, 2^8, 计算机里面表示数字类似于这样1111111, 如果黑客给这个数字后面加个1, 那么1111111 --> 0000000就会都变为0, 导致uint8溢出, 这种安全问题

怎么解决溢出的安全问题呢, 如果用到了数学运算, 就使用下面这些模版代码, 解决溢出问题

contract SafeMath {
  function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
    return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }
​
  function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }
​
  function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }
​
  function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

37.比特币utxo和时间戳解决双花问题

比特币作为一个去中心化的点对点电子现金系统,主要依靠UTXO(Unspent Transaction Output)和时间戳来应对“双花”问题。

UTXO:Unspent TXO 即未花费的交易输出比特币系统规定:只有对“尚未使用过”的交易签名才能是有效签名。

说白了,UTXO就是一个数据结构,包含交易数据和执行脚本(publickey)。这个数据结构包含每一笔的交易信息和未花费的交易输出。

时间戳:记录区块生成的时间。精确到秒。

http://baijiahao.baidu.com/s?id=1596083045153522500&wfr=spider&for=pc

https://www.douban.com/note/663186556/

38.区块链中的oracle是什么

翻译中文为: 先知, 可以让智能合约的链上和链下打交道, 也可能是跨链的需求

39.什么是event和emit

如果想让智能合约在执行过程中产生日志, 并且将日志打印到区块链上, 就可以用event和emit, 先声明event类型声明出来, 然后用emit打印出来日志

用它们调试时需要钱的, 所以一般慎用, 除非是要打印一些重要的日志

contract Test{
//声明类型
   event Demo (string log);
   function haha() public {
       emit Demo("打印日志");
   }  
}

40.数字货币的发行和编写, 就是发行基于以太坊的token

在以太坊官网里就有数字货币token, 可以参照里面的的代码编写出自己的数字货币, 或者称为token/通证, 比如说我自己有个LLT

https://www.ethereum.org/token  编写转账的前端逻辑 添加数字token到metamask

41.对solidity代码安全审计有经验

就比如说之前提到的以太币交易时间溢出, 二进制2^8 = 256如果加个1, 那所有的就变成0导致溢出, 所以对这样可能出错的情况作出正确的安全审计非常有必要, 甚至是有些公司他专门就是做代码的安全审计

42.hyperledger是什么?

它是一个跨企业级的区块链解决方案, 全球合作的项目, 托管在linux基金会的开源组织下, 所以它是一个真正贴近企业, 适合企业的技术

hyperledger fabric: hyperledger fabric是基于区块链的企业级分布式账本技术,通过智能合约解决多个组织之间的信任问题.

43.了解一下DAG

https://www.jinse.com/blockchain/68896.html

https://www.cnblogs.com/zhang-qc/p/8931932.html

44. assert、chaincode、ledger是什么?

assert: 他代表的是有价值的东西, 可以被交易的东西

chaincode: 链码/智能合约, 就是程序员写的商业逻辑transaction, 所有的交易都是由chaincode来发起, 它的作用只有一个, 就是用来更新账本数据的

ledger: 记录账本每一笔的交易信息, 只要产生了transaction, 就会被记录到ledger里面

assert <--- chaincode ---> ledger

资产必须要经过chaincode奖数据结构设计出来, 比如说车牌号是多少, 车架号是多少, 所有人姓名是什么,这些逻辑写好之后呢, 会将所有的transaction写入到ledger里, 包括world state世界状态, 日志也是 记录到了ledger账本里

什么是chaincode: sdk(=client, 可以是go编写的, 可以是nodejs编写也可以是java编写的逻辑)发起一个transaction交易, peer执行这个chaincode. chaincode必须属于某个channel, 因为channel里有多个peer, peer执行必须通过channel

最重要的一点: 任何操作chaincode的逻辑, 必须要有ca权限

45.以太坊和hyperledger的区别?

1) hpyerledger是区块链技术但是不是数字货币. 当然你可以使用hyperledger创建一个你自己的数字货币. 在hpyerledger里面没有挖矿的概念 hyperledger用独特的共识协议, 让挖矿不再是必需.

以太坊可以理解为是一个数据库,存储了所有的转账信息(transaction信息)

2) 处快速度不同: 没有交易时hyperledger是不出块的,比如1天都没有交易,则一天都没有新块生成。而比特币和以太坊不一样,即使没有交易也会出块(因为矿工自己会发布coinbase交易,赚取挖矿费)

3) 交易速度也不同: 比特币7笔/秒, 以太坊几百笔/分钟, hyperledger 50万笔/分钟 如果挖矿 挖这些交易, 很多硬件, 很不环保..

https://blog.csdn.net/youngzs/article/details/79362216   可以参考一下

46.hyperledger的工作流程.

以太坊和比特币它们的节点都是一样的, 而hyperledger节点有三种类型client、peer、orderer

它们分别对应下图的SDK、peer、orderer

client: cli、java sdk、node sdk

peer0、peer1、peer2: 同步存储ledger, 每个节点都存了整个区块链的数据, 在真实的企业里面, peer不止三个

orderer: 对数据的转账进行确认, 生成数据放到整个区块链里面, 类似于比特币以太坊的矿工

区块链以太坊以及hyperledger总结_第3张图片

这个图怎么理解呢:

1) 先有sdk/client产生一个提案, 比如说这个提案是: 小王用10块钱买洗衣液的同时还用10块钱买洗发露

2) peer0、peer1、peer2等节点收到了来自小王的两个提案, 模拟执行, 生成两个不同的背书策略

3) 然后交给sdk, sdk收到所有的背书响应, 更新申请, 交给orderer

4) orderer收到更新后, 检查签名、背书策略、排序, 如果先执行的是10块钱买洗衣液的提案, 那么账本ledger的状态就发生了变化, 钱用完了, 并且给peer节点发送了调用/更新, 再执行下一个提案10块钱买洗发露就不会成功了, 已经变成了无效的提案, 也就是在orderer里已经拒绝掉更新申请了.

下面也是流程, 比较简洁

  • sdk发送transaction proposal给一个或者多个peer
  • peer模拟执行, 给出模拟执行的结果,读写集,key的version, 这些信息反馈给sdk
  • sdk收集背书信息,带着签名,发给orderer节点
  • orderer节点,检查数字签名,检查每个peer背书的读写集是否一致.排序.如果没有问题,就发出invocation 让每个peer去apply新的读写集.
  • 最后强调几个细节: orderer节点不是立刻处理每个invocation request. 在orderer节点内部有一个消息队列 , 我们可以控制这个队列,控制队列的数量,容量大小,提交周期等参数 通过调整参数调整hyperledger的处理效率.这些是hyperledger开发中比较高级的话题, 关于性能调优, 后面我们会详细讨论.

47.hyperledger的channel

channel: 通道/频道, 每个channel可以理解成独立的hyperledger fabric的实例/子网, 所有的channel是相互独立的, 每个channel直接不会相互依赖, 它们也不会交换数据, 每个channel都有自己的规则、数据、策略, 可以把它比作微信群, 每个群里的成员、数据都是不一样的, 而且群之间是无法沟通的, 数据更加是无法看到, 可以完全保护用户的隐私

peer节点和channel的关系: 比如说你peer进了微信群之后, 如果什么话也不说, 那就什么事情都干不了, 所以只有有了channel才能让peer发挥作用, 创建和操作channel要用到sdk里的configtx工具, peer想要进入这个微信群就需要channel进行确认(规则是channel定的, 比如说有两个人意思同意才可以进来), 业务模型设定非常灵活. 除此之外换可以更新channel的配置文件, 比如说微信群里面有个人太过分了, 老是发一些不相关的东西, 那么群里的人就投票把他移除出去, 他就什么都看不到了, 这里用到的更新工具就是configtxlator

一个peer可能加入多个channel 一个channel 可能有多个peer 不同的channel是独立的,数据不会混淆: 可以理解为一个人可以加入多个微信群, 一个微信群可以有多个peer

http://www.cnblogs.com/kaixinyufeng/p/9290682.html   这篇文章是说明节点和channel的关系

48.买卖二手车

1) 登记车辆的归属, 买卖二手车会变得非常安全

2) 车辆的所有者可以百分百的全认

3) 整个车辆的流转过程也是可以追溯的

车主A和客户a(15万买二手车)是一个channel

车主A和客户b(12万买二手车)是一个channel

他们都在一个组里面, 也就是在一个channel微信群里面, 但是他们私下的channel相互之间是看不到的

49.授权网络和MSP和CA

  • 授权网络: 不同于比特币和以太坊的匿名网络, hyperledger在企业之间身份是透明的, 必须要经过授权, 才可以进行操作, 称为实名制的网络
  • ca: 在hyperledger网络里, 每一个更新啊, 查找啊之类的操作都需要数字签名认证的, hyperledger fabric 的chaincode可以获取用户的证书, 根据证书的类型决定某个智能合约是否可以执行.
  • MSP: MSP只是一个接口,Fabric-CA是MSP接口的一种实现
  • MSP抽象提供:具体的身份格式 用户证书验证 用户证书撤销 签名生成和验证 而 Fabric-CA 用于生成证书和密钥,以真正的初始化MSP。 
  • msp 定义 who you are 你是谁 which network you are 你在什么网络 msp的证书是由fabric ca来颁发的 每个peer都需要msp的证书 每个order都需要msp的证书. 我们实战的课程会具体的来带着大家操作. 现在需要明确的概念是, 只有拥有相同msp的 peer才可以互相发现 互相通讯 MSP ID 是一个名字定义一组证书,说明你是谁你在哪个网络. 使用hyperledger fabirc sdk的时候 经常需要指定mspid 所以这个概念要注意.

50.在hyperledger中node节点分为三种

  • client 实例化transaction的(cli: 控制台操作 , node sdk: nodejs操作, java sdk: java操作)
  • peer 用来存储和同步ledger的数据
  • orderer 用来排序分发transaction的, 类似于挖矿, 可以解决双花问题, 对同时发出的几笔交易进行排序, 确认之后打包成block, 然后交给peer节点存储数据

51.solo、kafaka、SBFT

用的时候把solo替换为kafaka或者把kafaka替换为solo, 目前企业用的最多的是kafaka, 比较稳定了, 而SBFT是简单的拜占庭容错共识, 等以后SBFT稳定下来, hyperledger也可以实现简单的容错了

52.hyperledger术语总结

channel

数据通道, 可以理解成独立的hyperledger fabric的实例 不同Channel的数据彼此完全隔离 Channel可以保证区块链上数据的隐私问题 Channel类似微信群组

ChainCode

链码 智能合约 Chaincode定义了business logic Ledger的变化只能通过调用chaincode来完成 在区块链系统里面code is law

ledger

账本 Ledger记录的是当前的世界状态(world state) Ledger还链式记录了所有的历史世界状态 在hyperledger里面,ledger是一个具有授权管理的共享账本系统 从底层设计上保证数据的一致性,有效性,不可篡改性

network

由peer组成network 在同一network的peer,实时同步记账,保证ledger数据的一致性

ordering service

排序服务 排序,验证transaction, 最终提交invocation,把数据写入peer的ledger

world state

世界状态 当前ledger里面存放的数据 Key和value 以version形式存在 当前实现有couchdb和leveldb

membership service provider

管理peer的身份和访问许可

53.对区块链代码的安全审计有经验

审计是一种思想, 很多代码我们就需要进行安全审计, 就比如说一些逻辑是转账之后的钱要比转账之前的钱要多, 检查转账呀加法呀之类的代码是否是正确的

54.共识机制

https://baijiahao.baidu.com/s?id=1606505576169238832&wfr=spider&for=pc

重点: 共识机制四大常用, 分别是pow、pos、dpos、侧链.

pow: 是通过区块链网络进行挖矿来获取奖励.

pos: 类似于银行, 存钱多和存钱时间越久, 给的权利和奖励也就越多.

dpos: 授权权益证明, 让某种资产的持有者共同选举一些人作为代表, 然后在按照某种机制进行出块, 当然如果有人干坏事, 那就会永久的把他踢出去

侧链: 可以让比特币安全的从比特币的主链转移到其他的区块链, 还可以从其他区块链安全的返回比特币主链的一种协议

55.ABI

应用程序二进制接口,简单来说就是 以太坊的调用合约时的接口说明. 

合同的ABI和字节码能够与来自DApp的合同进行交互.

56.Geth是什么?有哪些命令?

以太坊客户端Geth在以太坊智能合约开发中最常用的工具,一个多用途的命令行工具。 可以用来搭建以太坊私链. 具体指令见下面代码

创建账户
personal.newAccount('123456')
查看账户
eth.accounts
eth.accounts[0]
查看余额
eth.getBalance(eth.accounts[0])
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
此时账户数据为0
挖矿命令:
miner.start()
miner.stop()
交易
首先交易需2个账户,所以使用newAccount命令再创建一个账户;
其次交易之前需先解锁,否则会报错。
解锁命令:
personal.unlockAccount(eth.accounts[0],'123456')
转账命令:
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(1,"ether")})
此时查看另一个账户,可以看到已存在1eth。
若转账时若未开启挖矿,此时交易处于待打包交易,所以另一个账户查不到转账的数据,可以通过==txpool.status== 查看状态。

57.coinbase是什么?有什么用?

为了赚取以太币,你必须有coinbase 地址。这个etherbase默认为你生成的第一个账户。如果你没有etherbase地址,geth –mine就不会开启。挖矿必须要设置 coinbase的.

58.balance(余额)最多可以显示小数点后几位?

18位 ERC20规范建议都是20位.

59.Frontier(前沿)是什么?

「前沿」是以太坊的最初版本, 只有命令行界面,主要使用者是开发者

60.Homestead(家园)是什么?

「家园」增加了类似 Windows系统那样的图形界面普通用户也可以方便地体验以太坊的功能

61.Metropolis(大都会)是什么?

「大都会」加入了—个像谷歌浏览器那样的浏览器,除了使用方便之外,它还拥有一个强大的应用商店,可以安装插件实现更多功能。第三个版本在2017年年底发布了出来

62.Serenity(宁静)是什么?

「宁静」目前还没有确定发布时间,预计它会将前三个版本采用的工作量证明(Pow) 共识机制切换到混合的共识机制

63.零知识证明是什么?有哪些零知识证明的例子?

简单说就是,在不透露交易细节的情况下验证了交易记录。零知识证明可以有效保护交易隐私,隐藏交易来源并防止追溯,同时也能保证交易是安全的,因为任何试图修改交易的行为都无法通过验证。

64.Casper 的共识算法是什么样的?

以太坊中PoS协议的实现, 刚开始每100个区块将有一个采用PoS协议挖出

65.难度炸弹是什么?有什么作用?

为了确保以太坊的矿工能加入到新链条中来,开发团队引入了"难度炸弹"机制。它会使难度系数呈指数增加以至于让挖矿变得几乎不可能的。

66.ERC-20是什么?在什么地方会用到?

代币合约标准,一系列通过以太坊智能合约发布的代币制定了代币发放的通用规则。该标准是目前通过ICO发行代币的基础准则。

该标准能够确保基于以太坊的代币在整个生态系统中以一种可预测的方式进行,使去中心化应用程序和智能合约可以在整个平台上彼此协作,所有代币都遵循一个固定的安全标准。

ERC-20 标准是在2015年11月份推出的,使用这种规则的代币,表现出一种通用的和可预测的方式。简单地说,任何 ERC-20 代币都能立即兼容以太坊钱包, 由于交易所已经知道这些代币是如何操作的,它们可以很容易地整合这些代币。这就意味着,在很多情况下,这些代币都是可以立即进行交易的。

67 .叔块是什么?有什么缺点?

是一个区块的父区块与当前区块父区块的父区块是相同的。

由于以太坊区块生产时间(大概15秒左右)比比特币(大概10分钟左右)要快很多。更短的区块生产时间的一个缺点就是:更多的竞争区块会被矿工发现。

这些竞争区块同样也被称为“孤区块”(也就是被挖出来但是不会被添加到主链上的区块)

Ommers的目的就是为了帮助奖励矿工纳入这些孤区块,Ommer区块会收到比全区块少一点的奖励。

68.公有链是什么?

公有链是目前我们熟知的比特币,以太坊,瑞波币这些,每个人都可以参与,每个人都可以在上面进行交易,如果支持智能合约,每个人也都可以发布自己的应用。

69.联盟链是什么?

联盟链是指一些愿意彼此实现共信的机构和组织共同组建的,为各自机构提供共识信用和价值传递的平台,这样只要联盟不存在一家独大的情况,还是可以实现共识基础,而且相对来说可能价值更大一些,我其实觉得联盟链是有一些市场机会的。

70.私有链是什么?

用户自己搭建的私有链, 私有链缺乏共识,也需要公权机构背书,与传统中心化相比价值有限,只能说防黑客篡改可能略微有点意义。

71.DAO(decentralized autonomous organization)去中心自治组织作用是什么?有什么局限性?

这是一个组织(就像,一群人),其中,使用代码来保证最终的强制执行,而不是使用传统的法律文件。这群人使用智能合约来做常见组织做的所有的事情,比如在某件事上进行投票,比如决定是否对什么进行投资等等。

副作用是决策,管理,以及对什么进行投资的结果将会不可改变的存储在区块链上。

72 .区块链的共识算法

共识算法是计算中的过程,其在区块链过程中达成单数据值的协议。这些算法旨在提供涉及众多不可靠节点的网络可靠性,以防止双重花费。 有不同类型的算法,如PoW,PoS,DPoS,PoA

73. 如何查看有关交易和区块的详细信息?

etherscan.io

74. 跟以太坊网络交互的方式

web3.js web3j mist metamask

75.前端用什么库连接后端(智能合同)?

Web3.js库。

76.为什么需要检查在Web DApp代码的开始部分是否设置了web3提供器(Provider)?

因为Metamask会注入一个web3对象,它覆盖其他的web3设置。

77.为什么要使用web3.js版本1.x而不是0.2x.x?

主要是因为1.x的异步调用使用Promise而不是回调,可以通过async和await的方式调用. Promise目前在javascript世界中 是处理异步调用的首选方案。

78. 如何在web3 1.x中列出账户?

web3.eth.getAccounts

79. 以太坊的可扩展性解决方案?

分片,分区。

80.solidity是静态类型的还是动态类型的语言?

它是静态类型语言,这意味着类型在编译时是已知的。

81. 什么是合约实例和智能合约的区别?

合约实例是区块链上已部署的合约。

82.请说出Java和Solidity之间的一些区别。

都是面向对象, 语法有些相同之处, Solidity支持多重继承,但是要慎用

83. 你必须在Solidity文件中指定的第一件事是什么?

Solidity编译器的版本,比如指定为^ 0.4.17。 这是必要的,因为这样可以防止在使用其他版本的编译器时引入不兼容性错误。

84. 合约中包含什么?

主要由存储变量、函数和事件组成。

85.合约中有哪些类型的函数?

有构造函数、payable函数、修改合约状态的函数和只读的view函数。

86.如果我将多个合约定义放入单个Solidity文件中,我会得到什么错误?

将多个合约定义放入单个Solidity文件是完全正确的。跟java内部类类似

87. 两个合约之间交互的方式有哪些?

一个合约可以调用另一个合约,也可以继承其他合约。

contract Animal {
    function eat() {  }
  }
contract dog is Animal {    
}

88.看看下面的代码,并解释代码的哪一部分对应于哪个内存区域:

contract MyContract {
  // part 1
  uint count;
  uint[] totalPoints;

  function localVars(){
     // part 2
     uint[] localArr;
     // part 3
     uint[] memory memoryArr;
     // part 4
     uint[] pointer = totalPoints;
  }
}
第1部分 - Storage
第2部分 - memory
第3部分 - Memory
第4部分 - Storage

89.rpc

https://blog.csdn.net/weixin_37730482/article/details/80439591

你可能感兴趣的:(IT,区块链,以太坊,hyperledger,面试)