1. 以太坊-truffle框架【第一部分】

可能文章比较长,为了方便创个目录吧

  • 0.入门教程
  • 1.在此之前你需要了解
  • 2.先说几句
  • 3.从Truffle框架说起
  • 4.Truffle安装
  • 5.Truffle创建一个项目
  • 6.选择以太坊客户端
      • 开发时用的客户端
            • GANACHE
            • Truffle Develop
            • GANACHE CLI
      • 部署时用的客户端
        • 【部署时】DEPLOYING TO LIVE NETWORKS
        • 【部署时】DEPLOYING TO PRIVATE NETWORKS
      • 所以这些讲的是个啥?
      • [多说几句]:XX链了解一下啊
        • 所谓的 公有链、私有链和联盟链
        • XX链是懂了一点,但还有几个名词不懂耶
  • 7.编译合约(COMPILING CONTRACTS)
      • 几个概念
          • 智能合约
          • Solidity语言
          • 交易/事务
          • 区块
          • 以太坊虚拟机 - 总览
          • 以太坊虚拟机 - 账户
          • 以太坊虚拟机 - 交易
          • 以太坊虚拟机 - Gas
          • 以太坊虚拟机 - 存储,主存和栈
          • 以太坊虚拟机 - 指令集
          • 以太坊虚拟机 - 消息调用
          • 以太坊虚拟机 - 代码调用和库
          • 以太坊虚拟机 - 日志
          • 以太坊虚拟机 - 创建
          • 以太坊虚拟机 - 自毁
      • 位置
      • 命令
      • 构建工件(BUILD ARTIFACTS)
      • 依赖(DEPENDENCIES)
          • 通过文件名导入依赖关系
          • 从外部包导入合约

0.入门教程


教程 | 你的第一个Truffle分布式app
官网 | Truffle框架官网
文档 | Truffle国人翻译
文档 | solidity语言文档

1.在此之前你需要了解


区块链是什么?
以太坊是什么?

2.先说几句


  • Truffle是啥?
    是以太坊平台的一种开放框架,简化开发以太坊Dapp
  • solidity是啥?
    是Truffle框架中用来编写智能合约1的高级语言
  • 为啥选择Truffle?
    因为我是自学的……所以我觉得探索觉得这个会好一点٩꒰▽ ꒱۶⁼³₌₃

3.从Truffle框架说起


Truffle是一个世界级的开发环境,用于以太坊的测试框架和资产管道,旨在使以太坊开发人员的生活更轻松。用Truffle,你会得到:

  • 内置智能合约编译,链接,部署和二进制管理。
  • 用于快速开发的自动合同测试。
  • 可编写脚本的可扩展部署和迁移框架。
  • 用于部署到任意数量的公共和专用网络的网络管理。
  • 使用ERC190标准,使用EthPM和NPM进行包装管理。
  • 交互式控制台,用于直接合同沟
  • 可配置的构建流水线,支持紧密集成。
  • 外部脚本运行器,用于在Truffle环境中执行脚本。

4.Truffle安装


环境要求:

建议使用NodeJS 5.0+。
Windows,Linux或Mac OS X

通过以下命令安装:

npm install -g truffle

5.Truffle创建一个项目


对于我们初学者,通过TRUFFLE BOXES2无疑是一种很好的选择

从MetaCoin例子开始,在命令行上运行以下命令:

mkdir MetaCoin
cd MetaCoin
truffle unbox metacoin

注意:MetaCoin松露项目过去是通过运行创建的truffle init。现在它作为松露盒存在。

您可以使用该truffle unbox 命令下载任何其他应用程序。

如果您希望从头开始,请创建一个项目目录并进入该目录。您可以通过您最喜欢的文件资源管理器或通过在命令行上运行以下命令来执行此操作:

mkdir myproject
cd myproject

接下来,通过运行以下命令来初始化您的Truffle项目:

truffle init
truffle项目结构
contracts/:Solidity 合同目录
migrations/: 可编写脚本的部署文件的目录
test/:用于 测试您的应用程序和合同的测试文件目录
truffle.js:松露配置文件

6.选择以太坊客户端

官方写的很清楚,但是我觉得详细的反而容易让人迷失,所以就简化提炼

有许多以太坊客户可供选择。根据您是在开发还是部署,我们推荐不同的客户端。

开发时用的客户端

GANACHE

GANACHE:运行Ethereum开发的个人区块链,Ganache通过将合同和交易放在前面和中心,简化了dapp的开发。

Ganache可用于Windows,Mac和Linux,您可以在此下载。

Ganache在启动时运行http://127.0.0.1:7545。它将显示前10个帐户和用于创建这些帐户的助记符(助记符更多信息)。
默认情况下,Ganache将使用以下助记符:

//这个助记符可以被改变为随机生成,或者你可以输入你自己的。
candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

警告:请勿在以太网主网络(mainnet)上使用此助记符。如果您将ETH发送到由此助记符生成的任何帐户,您将失去所有!

Truffle Develop

Truffle Develop:一种直接构建在Truffle 中的开发区块链。
无需安装。通过在终端中键入以下内容运行松露开发:

truffle develop

这将运行客户端http://127.0.0.1:9545。它将显示前10个帐户和用于创建这些帐户的助记符。Truffle Develop每次都使用相同的助记符来尽可能简化开发应用程序:

candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

警告:请勿在以太网主网络(mainnet)上使用此助记符。如果您将ETH发送到由此助记符生成的任何帐户,您将失去所有!

一旦启动,Truffle开发将为您提供一个控制台(点击查看控制台信息),您可以使用它来运行所有可用的松露命令。这些命令是通过省略truffle前缀来输入的。所以,例如,编译你的智能合约,而不是打字truffle compile,你只需要输入compile

GANACHE CLI

GANACHE CLI:在图形环境下工作的人提供了一个命令行界面
非常适合自动化测试和持续集成环境,Ganache CLI可以无人运行,可以配置为满足您的所有开发需求。Ganache CLI可以立即处理事务,而不是等待默认的阻止时间,因此您可以测试您的代码是否可以快速工作。它还会在您的智能合约出现错误时立即通知您,并直接与Truffle集成,以将测试运行时间与其他客户端相比降低90%。

了解关于Ganache CLI的更多信息

部署时用的客户端

【部署时】DEPLOYING TO LIVE NETWORKS

有许多官方和非官方的以太坊客户可供您使用。以下是一个简短列表:
- Geth(go-ethereum):https://github.com/ethereum/go-ethereum
- WebThree(cpp-ethereum):https://github.com/ethereum/cpp-ethereum
- Parity:https://github.com/paritytech/parity
- 更多:https://www.ethereum.org/cli

【部署时】DEPLOYING TO PRIVATE NETWORKS

PRIVATE NETWORKS采用与PRIVATE NETWORKS相同的技术,但配置不同。因此,您可以配置上述任何一个以太坊客户端来运行专用网络,并以完全相同的方式进行部署。

所以这些讲的是个啥?

PRIVATE NETWORKS采用与PRIVATE NETWORKS是啥?啥区别?

我怎么百度不出来这两个词跟以太坊有啥关系?这么专业的名词难道是要深入网络技术才能懂得吗?

╭(╯^╰)╮这么难吗?我还是放弃吧。。。

等。。。等一下

我也准备放弃的时候,我又理了一下网上的信息:
这个词前几天我也不是很知道,但是后来我看到一篇文章中提到过,关于私有链公有链相关的信息。据我猜测,应该是Dapp3部署阶段的部署的网络相关的所属,这么一联想,结论就是上面提到的PRIVATE NETWORKS就是所谓的私有链。这么一来,我们只要掌握私有链相关的知识,就是部署的相关知识啦。所以接下来我们说一下XX链。

[多说几句]:XX链了解一下啊

我们百度区块链或者以太坊或者dapp的时候肯定会发现相关词条类似于”XX链”(公有链、私有链什么的),所以我们会想这究竟是何方神圣呢?

所谓的 公有链、私有链和联盟链

以太坊网络发布的网络环境有三个:公有链、私有链和联盟链。什么意思?就是你部署dapp的三种形式。(这个关系没人告诉我,我就想了几天,终于能够联系上啦)

解释了三种区块链在许可方面的区别:

  • 公有链:世界上所有人都可以阅读和发送交易。如果他们合法都有希望看到自己被包括在内。世界上任何人都能参与到共识形成过程——决定在链条上添加什么区块以及现状是怎样的。作为中心化或准中心化信任的替代品,公有链受加密经济的保护,加密经济是经济激励和加密图形验证的结合,用类似工作量证明或权益证明的机制,遵循的总原则是人们影响共识形成的程度和他们能够影响的经济资源数量成正比。这类区块链通常被认为是“完全去中心化“。

  • 联盟链:共识形成过程由预先选择的一系列的节点所掌控,例如,设想一个有15个金融机构的团体,每个机构都操作一个节点,为了使区块生效,其中的10个必须签署那个区块。阅读区块链的权利可能是公开的,或仅限于参与者,也有混合的路径,比如区块的根散表和应用程序编程接口一起公开,使公共成员可以进行一定量的查询,重获一部分区块链状态的加密图形证明。这类区块链被认为是“部分去中心化”。

  • 私有链:书写许可对一个组织保持中心化。阅读许可可能是公开的或者限制在任意程度。应用很可能包含对单个公司内部的数据库管理,审查等,因此公共的可读性在很多情况下根本不必要,但在另一些情况下人们又想要公共可读性。

相关推荐:以太坊连载(16):公有链、联盟链、私有链及网络配置介绍

XX链是懂了一点,但还有几个名词不懂耶

常见的关于以太坊的名词:

  1. go-ethereum:以太坊Go语言版本的源码(也叫Client,注意区块链网络里没有服务端)。
  2. Geth:go-ethereum的命令行终端,能调用go-ethereum的API。可以通过多种方式获得,比如用homebrew安装、下载可执行二进制文件、通过go install/make geth go-ethereum源码等方式得到geth。
  3. Ethereum Wallet:可视化的Geth(以太坊钱包),可以管理账户、发布合约。
  4. Mist:以太坊浏览器,因为它连接的是以太坊区块链网络,可以通过mist访问DApp,当然也能访问管理Ethereum Wallet。
  5. Solidity:开发智能合约的编程语言,运行在EVM。
  6. Remix:开发智能合约的IDE,基于浏览器。适合新手(版本控制、存储等不便)。(Mix停止更新,browser-solidity也停止更新,都使用Remix了)
  7. Truffle和Embark是开发DApps的两个常用框架,可以写代码-编译-部署-测试-打包DApp(注意不仅仅可以开发智能合约)。
  8. web3:以太坊基金会为DApp开发的标准RPC访问接口,也就是以太坊区块链网络与链外网络的连接桥梁。

7.编译合约(COMPILING CONTRACTS)


啥?啥合约?干嘛用的?为啥编译?需要写啥代码吗?

几个概念

智能合约

合同是指前文提到过的智能合约
智能合约不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。
简而言之,依我的理解,就是一套控制交易活动的规则。(不知道理解对不对,哈哈哈)
因为合约由Solidity语言编写,所以为了能够让机器理解,所以需要编译
想要写出自己的规则,那么就需要学习Solidity语言啦。

Solidity语言

Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。在后续内容中你将会发现,使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。

注意目前尝试Solidity的最好方式是使用基于浏览器的编译器(需要一点时间加载,请耐心等待)。

所以说语言。。。这个我也说不明白,所以我会写Solidity语言记录相关用法的。
官方文档跳转:传送门

既然介绍了两个概念了,那不如我就在介绍几个,便于向我们这种没有基础的初学者学习吧。

交易/事务

啥?好突兀,一上来就交易和事务。别慌,这个就是功能如何去实现,也算是很关键了哦。通过下面的文字来理解吧。

区块链是一个全局共享的,事务性的数据库这意味着参与这个网络的每一个人都可以读取其中的记录。如果你想修改这个数据库中的东西,就必须创建一个事务,并得到其他所有人的确认。事务这个词意味着你要做的修改(假如你想同时修改两个值)只能被完完全全的实施或者一点都没有进行。(可以理解为事务,也就是你想要做出的改变只有两个状态,要么成功,要么不动。)

此外,当你的事务被应用到这个数据库的时候,其他事务不能修改该数据库。(可以理解为线程同步吧。哈哈哈)

举个栗子,想象一张表,里面列出了某个电子货币所有账号的余额。当从一个账户到另外一个账户的转账请求发生时,这个数据库的事务特性确保从一个账户中减掉的金额会被加到另一个账户上。如果因为某种原因,往目标账户上增加金额无法进行,那么源账户的金额也不会发生任何变化。

此外,一个事务会被发送者(创建者)进行密码学签名。这项措施非常直观的为数据库的特定修改增加了访问保护。在电子货币的例子中,一个简单的检查就可以确保只有持有账户密钥的人,才能从该账户向外转账。

区块

区块链要解决的一个主要难题,在比特币中被称为“双花攻击”。当网络上出现了两笔交易,都要花光一个账户中的钱时,会发生什么?一个冲突?

简单的回答是你不需要关心这个问题。这些交易会被排序并打包成“区块”,然后被所有参与的节点执行和分发。如果两笔交易相互冲突,排序靠后的交易会被拒绝并剔除出区块。

这些区块按时间排成一个线性序列。这也正是“区块链”这个词的由来。区块以一个相当规律的时间间隔加入到链上。对于以太坊,这个间隔大致是17秒。

作为“顺序选择机制”(通常称为“挖矿”)的一部分,一段区块链可能会时不时被回滚。但这种情况只会发生在整条链的末端。回滚涉及的区块越多,其发生的概率越小。所以你的交易可能会被回滚,甚至会被从区块链中删除。但是你等待的越久,这种情况发生的概率就越小。

以太坊虚拟机 - 总览

以太坊虚拟机(EVM)是以太坊中智能合约的运行环境。它不仅被沙箱封装起来,事实上它被完全隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程。甚至智能合约与其它智能合约只有有限的接触。

以太坊虚拟机 - 账户

以太坊中有两类账户,它们共用同一个地址空间。外部账户,该类账户被公钥-私钥对控制(人类)。合约账户,该类账户被存储在账户中的代码控制

外部账户的地址是由公钥决定的,合约账户的地址是在创建改合约时确定的(这个地址由合约创建者的地址和该地址发出过的交易数量计算得到,地址发出过的交易数量也被称作”nonce”)

合约账户存储了代码,外部账户则没有,除了这点以外,这两类账户对于EVM来说是一样的。

每个账户有一个key-value形式的持久化存储。其中key和value的长度都是256bit,名字叫做storage.

另外,每个账户都有一个以太币余额(单位是“Wei”),该账户余额可以通过向它发送带有以太币的交易来改变。

以太坊虚拟机 - 交易

一笔交易是一条消息,从一个账户发送到另一个账户(可能是相同的账户或者零账户,见下文)。交易可以包含二进制数据(payload)和以太币。

如果目标账户包含代码,该代码会执行,payload就是输入数据。

如果目标账户是零账户(账户地址是0),交易将创建一个新合约。正如上文所讲,这个合约地址不是零地址,而是由合约创建者的地址和该地址发出过的交易数量(被称为nonce)计算得到。创建合约交易的payload被当作EVM字节码执行。执行的输出做为合约代码被永久存储。这意味着,为了创建一个合约,你不需要向合约发送真正的合约代码,而是发送能够返回真正代码的代码。

以太坊虚拟机 - Gas

以太坊上的每笔交易都会被收取一定数量的gas,gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行交易时,gas将按照特定规则被逐渐消耗。

gas price(gas价格,以太币计)是由交易创建者设置的,发送账户需要预付的交易费用 = gas price * gas amount。 如果执行结束还有gas剩余,这些gas将被返还给发送账户。

无论执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out-of-gas异常。当前调用帧所做的所有状态修改都将被回滚。

以太坊虚拟机 - 存储,主存和栈

每个账户有一块持久化内存区域被称为存储。其形式为key-value,key和value的长度均为256比特。在合约里,不能遍历账户的存储。相对于另外两种,存储的读操作相对来说开销较大,修改存储更甚。一个合约只能对它自己的存储进行读写。

第二个内存区被称为主存。合约执行每次消息调用时,都有一块新的,被清除过的主存。主存可以以字节粒度寻址,但是读写粒度为32字节(256比特)。操作主存的开销随着其增长而变大(平方级别)。

EVM不是基于寄存器,而是基于栈的虚拟机。因此所有的计算都在一个被称为栈的区域执行。栈最大有1024个元素,每个元素256比特。对栈的访问只限于其顶端,方式为:允许拷贝最顶端的16个元素中的一个到栈顶,或者是交换栈顶元素和下面16个元素中的一个。所有其他操作都只能取最顶的两个(或一个,或更多,取决于具体的操作)元素,并把结果压在栈顶。当然可以把栈上的元素放到存储或者主存中。但是无法只访问栈上指定深度的那个元素,在那之前必须要把指定深度之上的所有元素都从栈中移除才行。

以太坊虚拟机 - 指令集

EVM的指令集被刻意保持在最小规模,以尽可能避免可能导致共识问题的错误实现。所有的指令都是针对256比特这个基本的数据类型的操作。具备常用的算术,位,逻辑和比较操作。也可以做到条件和无条件跳转。此外,合约可以访问当前区块的相关属性,比如它的编号和时间戳。

以太坊虚拟机 - 消息调用

合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户。消息调用和交易非常类似,它们都有一个源,一个目标,数据负载,以太币,gas和返回数据。事实上每个交易都可以被认为是一个顶层消息调用,这个消息调用会依次产生更多的消息调用。

一个合约可以决定剩余gas的分配。比如内部消息调用时使用多少gas,或者期望保留多少gas。如果在内部消息调用时发生了out-of-gas异常(或者其他异常),合约将会得到通知,一个错误码被压在栈上。这种情况只是内部消息调用的gas耗尽。在solidity中,这种情况下发起调用的合约默认会触发一个人工异常。这个异常会打印出调用栈。

就像之前说过的,被调用的合约(发起调用的合约也一样)会拥有崭新的主存并能够访问调用的负载。调用负载被存储在一个单独的被称为calldata的区域。调用执行结束后,返回数据将被存放在调用方预先分配好的一块内存中。

调用层数被限制为1024,因此对于更加复杂的操作,我们应该使用循环而不是递归。

以太坊虚拟机 - 代码调用和库

存在一种特殊类型的消息调用,被称为callcode。它跟消息调用几乎完全一样,只是加载自目标地址的代码将在发起调用的合约上下文中运行。

这意味着一个合约可以在运行时从另外一个地址动态加载代码。存储,当前地址和余额都指向发起调用的合约,只有代码是从被调用地址获取的。

这使得Solidity可以实现”库“。可复用的库代码可以应用在一个合约的存储上,可以用来实现复杂的数据结构。

以太坊虚拟机 - 日志

在区块层面,可以用一种特殊的可索引的数据结构来存储数据。这个特性被称为日志,Solidity用它来实现事件。合约创建之后就无法访问日志数据,但是这些数据可以从区块链外高效的访问。因为部分日志数据被存储在布隆过滤器(Bloom filter) 中,我们可以高效并且安全的搜索日志,所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。

以太坊虚拟机 - 创建

合约甚至可以通过一个特殊的指令来创建其他合约(不是简单的向零地址发起调用)。创建合约的调用跟普通的消息调用的区别在于,负载数据执行的结果被当作代码,调用者/创建者在栈上得到新合约的地址。

以太坊虚拟机 - 自毁

只有在某个地址上的合约执行自毁操作时,合约代码才会从区块链上移除。合约地址上剩余的以太币会发送给指定的目标,然后其存储和代码被移除。

注意,即使一个合约的代码不包含自毁指令,依然可以通过代码调用(callcode)来执行这个操作。

位置

所有的合约都位于您项目的contracts/目录中。由于合约是用Solidity编写的,所有包含合约的文件的文件扩展名为.sol。结合(Associated) Solidity 库也将有一个.sol扩展。

通过光秃秃的Truffle 项目(即通过truffle init创建的项目),您可以获得一个Migrations.sol文件,可以在部署过程中帮助你。如果您使用的是Truffle Box,您将在这里获得多个文件。

命令

要编译Truffle项目,请切换到项目所在目录的根目录,然后在终端中键入以下内容:

truffle compile

第一次运行时,所有合同都将被编译。后续运行时,松露只会编译自上次编译以来已更改的合同。如果您想覆盖此行为,请使用该--all选项运行上述命令。

构建工件(BUILD ARTIFACTS)

您编译的工件将被放置在build/contracts/相对于您的项目根目录的目录中。(如果该目录不存在,该目录将被创建。)

这些工件是truffle内部工作的一部分,它们在成功部署应用程序中起着重要作用。您不应编辑这些文件,因为它们将被合同编译和部署覆盖。

依赖(DEPENDENCIES)

您可以使用Solidity的import命令来声明合同依赖关系。松露将按照正确的顺序编译合同,并确保将所有依赖关系发送给编译器。依赖性可以用两种方式指定:

通过文件名导入依赖关系

要从单独的文件导入合约,请将以下代码添加到您的Solidity源文件中::

import "./AnotherContract.sol";

这将使所有合同AnotherContract.sol可用。这里AnotherContract.sol是相对于当前正在编写的合同的路径。

请注意,Solidity也允许其他导入语法。请参阅Solidity 导入文档以获取更多信息。

从外部包导入合约

Truffle支持通过EthPM4和NPM5安装的依赖项。要从依赖项导入合约,请使用以下语法

import "somepackage/SomeContract.sol";

这里somepackage表示通过EthPM或NPM安装的软件包,并且SomeContract.sol表示该软件包提供的Solidity 源文件。

请注意,在搜索从NPM安装的软件包之前,Truffle会首先从EthPM中搜索已安装的软件包,因此在极少数的命名冲突情况下,将使用通过EthPM安装的软件包。


先到这里吧,内容有点长,所以下一篇文章再继续讲哦。


  1. 智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。 ↩
  2. TRUFFLE BOXES是有用的样板,可让您专注于让您的dapp独一无二的原因。除了TRUFFLE外,TRUFFLE BOXES还可以包含其他有用的模块,Solidity合同和库,前端视图等等。一直到完成示例dapps。 ↩
  3. dapp中文名称为去中心化应用,了解区块链基本原理的同学应该都听过吧。(更多信息点击传送) ↩
  4. EthPM是以太坊的新软件包注册表。【将在后面的内容中提到】 ↩
  5. Truffle标配npm集成,并且知道node_modules项目中的目录(如果存在)【将在后面的内容中提到】。 ↩

你可能感兴趣的:(区块链)