区块链以太坊以及hyperledger学习总结

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

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

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

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

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

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

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

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

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

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

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

虚拟机都是跨平台的

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

5.docker的原理? 这是属于后面的hyperledger的

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

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

默克尔树就是一个hash树, 可能是二叉的 也可以是多叉的, 默克树的基本原理就是将叶子节点两两配对做哈希运算  所以都是偶数个. 如果碰到奇数个就 复制一个成偶数个, 默克树的作用 就是不需要拿到全部区块 找到部分区块 就可以验证数据是否正确.

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    - -

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

rpc(Remote Procedure Call), 远程进程调用的协议, 可查看metamask测试网络下一栏的端口, rpc端口也是8545

不论什么时候只要多个路径产生了,一个”分叉“就会出现。我们通常都想避免分叉,因为它们会破坏系统,强制人们去选择哪条链是他们相信的链。 为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“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版本, 可以在控制台打印查看, 因为这个版本是他们自己进行改造过的, 很稳定, 我们一般用的话都是最新版, 当然也可以自己指定哪个版本

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是什么

它可以接入以太坊的网络, 能够让测试网络: ganache或者rinkeby和以太坊进行交互, 交互的时候很重要的一点必须要在测试网络里放入自己的助记词, 我们可以把数据交给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.智能合约的安全问题

先讲一个比喻: 某日薛xx获得了大量的以太币, 但是被人知道了, 那些人就把他绑架, 拉进小黑屋, 让他说出密钥, 不说就用搬砖锤, 说了以后那钱不就被拿走了嘛, 智能合约是没有第三方的, 不像银行用户被绑票最起码还得经过银行的手才能取出钱

那么这个安全问题就有了解决方案, 在智能合约里设限, 如果一次性挪动的以太币超过设定的数量(过多), 就会触发合约的设定, 只能等待一周或者更长的时间才能够将转账汇款完成, 这段时间就可以有很大的回旋余地

这样的设计也有一点问题, 那就是黑客可能会将时间溢出, 那么钱就会瞬间被转出去, 所以设计的时候要加一下判断, 这样就可以很好的解决智能合约的安全问题

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类型声明出来, 然后用eit打印出来日志

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: 对数据的转账进行确认, 生成数据放到整个区块链里面, 类似于比特币以太坊的矿工

这个图怎么理解呢:

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.对区块链代码的安全审计有经验

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

之后会持续更新....

猜你喜欢

转载自blog.csdn.net/qq_41618084/article/details/81570842
今日推荐