主页 > imtoken官网下载2.0国际版 > 区块链智能合约 Coursera(第 1 周)智能合约基础知识
区块链智能合约 Coursera(第 1 周)智能合约基础知识
课程链接
这是区块链专题课程Smart Contracts Smart Contracts的第二课
对于自己学习做的笔记,可能翻译有问题,还请谅解。
智能合约 智能合约 智能合约基础知识 智能合约基础知识
目录
为什么是智能合约?
智能合约的概念早在比特币之前就存在了。 计算机科学家 Nick Szabo 详细介绍了他的加密货币比特币黄金的概念,他还在 1996 年的出版物中概述了智能合约的概念。 事实上,萨博在 20 多年前就创造了“智能合约”一词。 智能合约是以太坊区块链的核心和主要驱动力。
设计和编码不当的智能合约可能导致重大故障比特币合约交易规则,例如 DAO 黑客攻击和 Parity 钱包锁定。 正如我们在第 1 课中讨论的那样,比特币具有包含规则和策略的脚本。 Linux 基金会的 Hyperledger 区块链具有称为 Chaincode 的智能合约。 Chaincode使用Go语言编写,在docker环境中执行。 Docker 是一种用于执行程序的轻量级容器技术。 您可以在参考资料部分找到有关这些内容的更多信息。
学习目标:
1) 能够解释智能合约的要素
2)讨论智能合约编程语言Solidity的语法和语义
3)解决问题,设计智能合约方案
4)使用remix开发环境构建和测试智能合约,使用remix部署智能合约,从简单的web界面调用合约。
在本课程中,必须在测试环境中尝试各种智能合约相关概念,以便理解和应用它们。 我们将使用 remix 集成开发环境 IDE,这是一个用于动手探索的 Web 界面。 现在,确保你可以访问 remix.ethereum.org 上的这个界面。 请注意,remix 只是一个开发环境,并且会随着新功能的添加而不断变化(甚至每周一次)。 本课程是您试用智能合约的地方。 在下一课中,我们将使用智能合约开发一个完整的端到端应用程序。 完成本模块后,您将能够解释智能合约的要素并解释智能合约可以解决的问题类型,定义智能合约的结构,应用这些知识来理解真正的智能合约是用什么编写的Solidity 语言,使用 Web 开发环境 remix 来调用智能合约并与之交互。
比特币区块链主要用于传输数字货币。 比特币通过嵌入式脚本添加了简单的条件价值转移。 这是一个条件特征,作为比特币的软分叉而被引入。 此脚本的功能是有限的。 它支持简单的条件分支。
在比特币之后,以太坊被开发出来。 以太坊的创始人在开发智能合约时牢记 Nick Szabo 20 年前关于智能合约的想法。
以太坊的一个重要贡献是一个有效的智能合约层,可以在区块链上执行任意代码。 智能合约允许用户定义任意复杂的操作。 此功能增强了以太坊区块链成为强大的去中心化计算系统的能力。
为什么要转移货币?
比特币等加密货币允许在没有任何中介的情况下从点对点转移货币或货币等价值。 为了什么? 赠送礼物、购买产品、甚至更新驾照或送花。
例如,我们可能希望在特定日期之前送达礼物。 购买特定颜色和质量的产品。 我们可能需要验证某些凭据才能续订许可证。
这引入了简单的汇款加密货币协议无法处理的条件、规则和政策。 智能合约解决了区块链应用程序特定应用程序验证的需求。
智能合约有一些优点:
1) 智能合约促进交易以转移加密货币以外的价值或资产。
2) 智能合约允许规范区块链上的操作规则。
3)它促进了去中心化网络中资产转移政策的实施。
4)它还为区块链增加了可编程性和智能性。
5) 智能合约代表业务逻辑层,实际逻辑用特殊的高级语言编码。
6) 智能合约嵌入函数,可以像函数调用一样被消息调用。 这些消息和单个消息的输入参数在事务中指定。
比较比特币交易和智能合约交易
在比特币中,所有交易都涉及发送价值。
在支持智能合约的区块链的情况下,交易可以嵌入智能合约实现的功能。
这里我们有一个投票智能合约。 这些功能是 Validate Voter、Vote、Count、Delare Winner。 智能合约提供可在区块链上执行的计算逻辑层,从而利用区块链框架启用的功能。 回想一下我们在第 1 课第 2 单元中讨论的去中心化应用程序的层。注意智能合约为领域应用程序提供了应用程序框架。 例如,考虑一个家庭抵押贷款申请。 智能合约可以嵌入所有的业务逻辑和规则和法规的智能,以实现自动化计算和启动操作。
这与现有系统有何不同?
在这里,所有操作都是透明的比特币合约交易规则,并记录在区块链上。 客户无需银行等中介机构即可直接访问这些工具。 就像 ATM 发起抵押一样。
智能合约能解决什么问题?
通常,汇款用于从个人或企业购买服务、产品或公用事业。 除了资金的可用性,执行交易时可能还有其他条件。 例如,商业交易可能涉及规则、政策、法律、法规和监管环境。 智能合约允许在区块链上实现这些其他现实世界的约束,因此,智能合约可以在区块链上启用各种任意复杂的去中心化应用程序。 这可以涵盖从供应链到灾难恢复的方方面面。 区块链技术的很多应用可能还没有构想出来。 智能合约正在引领下一代区块链超越将价值转移到有远见的领域。 智能合约允许执行规则、政策,并在区块链的帮助下,一种支持治理和来源的方法。
阅读材料:
智能合约:数字市场的基石
如何学习 Solidity:终极以太坊编码指南
混音 - Solidity IDE
测试题:
以下 zip 文件包含更新的智能合约版本(可靠版本 5.9
智能合约定义(第 1 部分)(Remix IDE 和 Greeter Demo)
学习目标:
1)能够定义智能合约的结构
2) 应用这些知识来理解用 Solidity 语言编写的真实合约
3)使用Web开发环境Remix调用智能合约并进行交互。
交易的结构和元级属性在区块链协议级别进行验证。 特定于应用程序的约束又如何呢? 答案在于智能合约发挥的关键作用。
智能合约使用特定于应用程序的语义和交易约束,并验证、验证和执行它们。 最重要的是,由于智能合约已经部署在区块链上,它利用了区块链不可篡改的记录和信任模型。
由于智能合约部署在区块链中,因此它是一个不可变的代码,一旦部署就无法更改。 我们将不得不将代码重新部署为新的智能合约,或者以某种方式将调用从旧合约重定向到新合约。 智能合约可以在其中存储称为状态变量的变量。 我们可以检索这些变量如何跨块变化。
以太坊区块链中的一个合约有pragma directive,contract name 合约名称,数据或定义合约状态的state变量,用于执行智能合约Collection函数集合意图执行的功能,以执行智能合约的意图。 其他项目,我们将在以后的课程中讨论。 表示这些元素的标识符仅限于 ASCII 字符集。 确保选择有意义的标识符并遵循驼峰式大小写约定。
我们将使用以称为 Solidity 的高级语言编写的简单合约来学习这些概念。 我们将使用名为 Remix 的 Web 集成开发环境 IDE 来创建、部署、执行和探索一些具有代表性的智能合约的工作原理。
混音.ethereum.org
欢迎使用 Remix IDE。 这是可用作 Web 界面的环境。 在左侧,您将看到文件浏览器,您可以在其中查看您创建的所有智能合约。 您可以创建一个新的。 中间是编辑器窗口,您可以在其中键入智能合约。 底部是控制台或输出窗口。 在右侧,您可以使用编译、运行、设置、分析、调试器和支持工具。 底部是 Web 界面,而创建智能合约的能力将在中间。 凭借所有这些功能,Remix 是真正的开发、部署和测试智能合约的一站式环境。
(现在新版本可能不一样了)
凭借所有这些功能,Remix 是真正的开发、部署和测试智能合约的一站式环境。 我们将看看两个非常简单的智能合约,一个欢迎程序和一个整数存储,一个简单的存储。 这两个示例是 Solidity 文档中给出的示例的修改版本。 我们的目标是在不深入了解 Solidity 语言细节的情况下获得智能合约结构的概述。
智能合约开发的三个步骤:设计、编码和测试。
Greeter合约的设计:这就是智能合约的Hello World
Greeter 有一个名为 yourName 的字符串变量、一个构造函数 Greeter、一个设置名称的 set 函数和一个返回字符串名称的 hello 函数,因此您可以使用它来欢迎世界。
pragma solidity ^0.4.0;
contract Greeter {
/*Define variable greeting of the type string */
string public yourName;
/*This runs when the contract is executed*/
function Greeter() public {
yourName = "World";
}
function set(string name)public {
yourName = name;
}
function hello() constant public returns (string) {
return yourName;
}
}
它以提供版本号的编译指示开头,以便编译器知道此版本是在哪个版本的 Solidity 中开发的。您还将看到合约 Greeter 的名称,即状态变量 yourName。 请注意,它使用骆驼符号。 接下来是函数,构造函数 Greeter 初始化 yourName 变量,set 函数将变量设置为用户消息提供的名称作为参数,hello 函数检索调用应用程序使用的名称。
在第一行,您会看到 pragma Solidity。 这提供了 Solidity 版本。 然后,它以合约名称开头,然后是数据或状态变量,然后是函数。 这里有三个函数:Greeter(它是一个构造函数)和一个set函数(它设置数据变量),然后是一个hello函数(它提取状态变量的值并返回它)。 这里的状态变量是yourName,它有public可见性修饰符,函数Greeter,构造函数将yourName初始化为World,函数set将yourName初始化为发送者提供的名字。 Hello 返回状态变量中设置的任何值。
我将从编译它开始,然后运行它。 在运行时,我必须在 JavaScript VM 上部署智能合约。 我将其更改为 JavaScript VM,并创建了它。 创建它时,这是 Web 界面,您将在其中看到所有公共变量。 YourName 是可用的公共变量。 Hello 是那里可用的公共函数,而 set 是那里可用的另一个公共函数。 当我简单地说出你的名字时,当前给出的你的名字就是显示的世界。
如果我将名称设置为 Buffalo,然后单击 yourName,yourName 将显示在 Buffalo 中。 如果你点击函数hello,hello会返回当前的yourName,恰好是Buffalo,并且会显示出来。
这里的截图是我自己操作的截图,和课程视频里的不一样。 仅供参考。
智能合约定义(第二部分)(简单存储演示)
这是简单存储的设计表示。 在统一建模语言类图中,它看起来与常规类定义完全一样。 有一些语法差异。 另外,请注意由于执行智能合约而导致的状态转换。 回想一下,我们在第一课中讨论了黑色标头中的状态和状态哈希。 这些就是那些状态。 初始状态为状态一,通过消息集更新,状态变为状态二。 接下来,递增消息的执行导致状态三,递减消息或函数的执行转换到下一个状态,依此类推。
pragma solidity ^0.4.0;
/*Imagine a biginteger that the whole world could share*/
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() constant public returns (uint) {
return storedData;
}
function increment (uint n) public{
storedData = storedData + n;
return;
}
function decrement (uint n) public{
storedData = storedData + n;
return;
}
}
只有一个状态变量存储数据。 有几个函数:设置、获取、递增和递减。 您会注意到没有显式构造函数,但默认情况下会自动为智能合约创建一个构造函数。 我会编译它,运行它,然后完成。 可以看到set、get、increment、decrement是可用的。 由于存储的数据不是公开的,因此在此公共 Web 界面中不可用。
现在,如果我选择“获取”,则不会设置任何值,因此您会返回零。 “设置”它的值为 456,点击设置,然后获取,您将看到返回 456。 如果我在“增量”中输入一个值,比如 3,然后单击增量,我会再次得到 459。 为“减量”输入一个值 8 并点击减量,我应该得到 451。我得到 451。这是简单的存储。
我可以使用智能合约地址再次创建这个简单的存储,将红框内的智能合约地址复制到本地合约地址中。 创建另一个智能合约。 这里我们有两个具有相同地址的智能合约。
这里的截图是我自己操作的截图,和课程视频里的不一样。 仅供参考。
阅读材料
合同结构
骆驼香烟盒
驼峰式大小写是一种书写短语的做法,使短语中间的每个单词或缩写都以大写字母开头,中间没有空格或标点符号。 常见示例包括“iPhone”和“eBay”。 驼峰式大小写在计算机编程中通常用作变量名。 某些编程风格更喜欢首字母大写的驼峰式大小写、upper camel case(上首字母,也称为单峰骆驼大小写)和 lower camel case(小首字母,也称为单峰骆驼大小写)
智能合约简介
试题
使用智能合约(编译工件演示)
完成本课程后,您将能够解释智能合约地址、列出编译器生成的编译工件、字节码、ABI、web3deploy 脚本、函数哈希和 gas 估算。 通过从命令行界面以编程方式应用应用程序以及通过高级应用程序和用户界面或 UI 中的命令脚本,可以代表外部拥有的帐户创建智能合约。 它也可以从智能合约中创建。 我们将在后面的课程中介绍这种方法。 我们需要智能合约的地址来部署它并调用它的功能。 该地址是通过散列外部拥有的帐户 UI 的帐号和随机数来计算的。
再次打开Greeter合约,编译后查看详情
你会看到合约名称、合约元数据、在以太坊虚拟机上执行的智能合约的字节码、Application Binary Interface、Web3deploy 脚本,Web 应用程序使用它来连接智能合约和元数据数据哈希。 还有其他细节,函数哈希,调用函数的函数哈希和执行函数时的gas估计,运行时字节码和汇编代码。
为了编译合约,会生成各种工件,包括:用于部署合约的字节码,以及智能合约与部署的字节码交互的应用程序的应用程序二进制接口(ABI)。 Remix 编译器脚本一次生成许多工件。 您可以通过单击“编译”按钮,然后单击“编译”按钮正下方的“详细信息”按钮来查看生成的这些项目。
Remix 智能合约编译过程中产生的一些工件及其使用。
ABI:Application Binary Interface,一种用于在智能合约实例字节码上调用函数的交易的接口架构。
合约字节码:这是执行以在 EVM 上实例化智能合约的字节码。 将其视为执行智能合约的构造函数来创建对象。
WebDeploy 脚本:这是两个项目,json 脚本到 Web 应用程序以调用智能合约功能,此脚本用于以编程方式从 Web 应用程序部署智能合约。
Gas 估算:这为部署智能合约和函数调用提供了 Gas 估算。
Function Hash:函数签名的前四个字节,方便调用交易函数。
实例字节码:智能合约实例的字节码。
阅读材料
账户类型、gas 和交易
试题
部署智能合约
学习目标:
1)能够解释智能合约的部署过程
2) 探索 Remix 编译过程生成的工件
3) 讨论如何使用这些工件来部署智能合约并与之交互。
智能合约部署流程
(根据视频内容,可能不够准确,如有错误请指出)
1) 用高级语言编写智能合约解决方案并编译字节码。 还为高级语言应用程序生成 ABI。 EVM 为字节码提供了执行环境。
2) 生成智能合约地址。 合约地址是通过散列发送者的帐户地址及其随机数生成的。 智能合约需要一个地址,以便它可以成为交易时调用其功能的目标。
3) 为智能合约的创建和部署预留一个唯一的目标账户。 如果目标的地址为零或为空,则意味着使用其有效载荷有效载荷提要来创建新的智能合约。 交易的有效负载包含智能合约的字节码。 此代码作为事务执行的一部分执行,以实例化实际智能合约的字节码。
4) 在 EVM 上部署此智能合约代码。 与构造函数创建对象的方式类似,执行智能合约创建交易会导致在 EVM 上部署此智能合约代码。 它永久存储在 EVM 中以供将来调用。
5) 交易经过以太坊区块链协议规定的所有常规验证和确认,全节点出块,交易确认在所有节点部署同一个合约。 这将在智能合约上使用功能消息调用常规交易时提供一致的执行。
现在我们已经解释了部署智能合约的基本过程,还有许多其他方式可以部署该智能合约。 可以从 Remix IDE、其他智能合约命令行界面、其他高级语言应用程序或 Web 应用程序进行部署。
用于使用 Remix IDE 进行部署
在 Remix IDE 中输入智能合约代码并编译。 Remix 生成了上面描述的一些工件。
为了便于部署,Remix 为我们提供了一个包含字节码、应用程序二进制接口(ABI)和帐户详细信息的 Web3 部署脚本。 要部署智能合约,我们只需执行脚本即可。 部署完成后,地址将由创建者的账号和一个随机数哈希生成。 为了与智能合约交互,我们将使用智能合约地址、ABI 定义和函数哈希。
阅读材料
以太坊、代币和智能合约
解密比特币挖矿之谜
试题
所需的测验资源和方向:智能合约
这些是本课程和演示中使用的 Solidity 文档中的所有智能合约程序。 你必须将正确的程序复制并粘贴到 Remix 中,编译并运行它,并根据结果回答问题。
注:BallotBasic.sol相当于视频中的Ballot版本1,BallotWithStages.sol相当于视频中的Ballot版本2,BallotWithModifier.sol相当于视频中的Ballot版本3