1-完全理解以太坊智能合约

了解区块链

区块链技术的核心概念是分布式账本,它是许多参与者共享的特定类型的数据库。

这个特殊的数据库只是一个交易列表,记录着网络中发生的每笔交易。每个人都可以拥有自己的交易列表备份,再加上强有力的货币激励措施消除各方之间信任成本。

使用区块链,可以把信任放在一个网络中,不在需要第三方,它通过强有力的激励去规避作弊行为(简而言之:遵循规则更有利可图)。

在这里插入图片描述

智能合约

以太坊与比特币很大的不同是以太坊拥有智能合约的概念。
比特币是数字货币-价值存储。 而以太坊不单单是数字货币。
“智能合约”这个名称有点误导。 它不是真正的合约、也不是特别智能,它们只是可以区块链上运行代码。

智能合约是以太坊网络上的一种特殊帐户,我们有用户帐户,还可以拥有智能合约帐户。
用户帐户有:

地址(有点像我们的银行帐号 - 比特币也有同样的概念)
余额(我有多少钱: 以太)

智能合约账户有:

地址
余额(有多少钱: 以太)
状态
代码

状态是智能合约中声明的所有变量和变量的当前状态。 它的工作方式与大多数编程语言中的类中的变量变量相同。 实际上,最简单方法去理解智能合约可以类比为一个类实例化对象,唯一的区别是这个对象永远存在区块链网络中。

代码是编译后可以在以太坊客户端和节点可以运行的字节码。 它是在创建智能合约时执行的代码,它包含我们可以调用的函数。 就像面向对象编程语言中的对象一样。

contract Counter {
    uint counter;

    function Counter() public {
        counter = 0;
    }
    function count() public {
        counter = counter + 1;
    }
}

上面的代码创建一个智能合约。 代码有一个类型为uint(无符号整数) 名为“counter” 的变量。 counter变量的内容(值)就是该合约的状态。 每当我们调用count()函数时,此智能合约的区块链状态将增加1,这个状态是对任何人都可见的。

在这里插入图片描述

以太坊和比特币在交易层面的区别

比特币交易非常简单,它只做一件事,就是进行交易。 忽略细节,这一切都归结为TO(谁收钱),FROM(谁汇款)和AMOUNT(多少钱)。 这让比特币网络中的参与者可以传递价值并存储价值。

以太坊很大的不同是其交易还有一个DATA字段。 DATA字段支持三种类型的交易:

价值传递 (和比特币相同)
    TO :收款地址
    DATA :留空或留言信息
    FROM :谁发出
    AMOUNT :发送多少
创建合约
    TO :留空 (这就是触发创建智能合约的原因)
    DATA :包含编译为字节码的智能合约代码
    FROM :谁创建
    AMOUNT :可以是零或任何数量的以太,它是我们想要给合约的存款。
调用合约函数
    TO: 目标合约账户地址
    DATA: 包含函数名称和参数 - 标识如何调用智能合约函数
    FROM :谁调用
    AMOUNT : 可以是零或任意数量的以太,例如可以支付合约服务费用。

以太坊交易

价值传递

{
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
    value: 0.0005
    data: ‘0x’ // 也可以附加消息
}

非常简单,就是转移一定数量的以太到某个地址,如果我们愿意也可以向交易添加消息。

创建智能合约

{
    to: '',
    value: 0.0
    data: ‘0x6060604052341561000c57xlb60405160c0806……………’
}

TO为空表示创建智能合约,DATA包含编译为字节码的智能合约代码。

调用合约方法

{
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85’, //合约
    value: 0.0
    data: ‘0x6060604052341561000c57fe5b60405160c0806……………’
}

函数调用信息放在DATA变量中,把这个交易信息发送到要调用的智能合约的地址。

关于成本和执行

代码的执行由调用者以称为Gas的方式支付费用。 Gas是运行以太坊虚拟机的燃料。 我们可以将其视为每次执行指令的付款。

Gas 执行费用由网络的矿工(他们是运行代码的节点)决定。

智能合约是如何运行的?

在智能合约上调用函数在很多方面和“正常”编程类似,假设我们有一个“MyObject”类型的对象。 该对象有一个名为“myFunction”的函数。 要调用它,我们可以简单地引用对象的实例,调用哪个函数以及调用它的参数。 像这样:

myVariable = myObject.myFunction(parameters);

如果函数返回任何值,则可以把它保存在变量中。

调用智能合约是一回事。 唯一的区别是我们必须将有关调用的信息放入交易中,对其进行签名并发送到以太坊网络中执行。

假设想用一些参数调用智能合约“0x0123456”上函数“myFunction”,大概包含以下四个步骤:
在这里插入图片描述
现在,当交易被打包放入区块链时,状态的改变将反映在整个网络中。

世界计算机

虽然智能合约是图灵完整的,理论上可以做任何事情,但它们并不适合繁重的计算工作。
合约的计算越多,运行它的成本就越高。 合约越复杂,就越有可能出现安全漏洞。 智能合约中的安全漏洞是很难修复的,因为区块链的不可篡改特性。

智能合约应用:Token (通证或代币)

解释一下通证是如何工作的。 那些在ICO中每个人都赞不绝口的代币,就是一个智能合约,我们自己也可以在以太坊上创建自己的代币。

大多数这些代币都是在以太坊上创建的,这个概念非常简单,我们需要关注以下几个信息:

总供应量
帐号
账户中的金额
代币的流动
//通过用户和金额之间的简单映射
Map<Account, Double> usersAndTheirMoney;

//使用构造函数,我们可以在自己的帐户中设置初始供应量(或在任意其他中帐户中分配)
public Token(Account initialAccount, double initialSupply) {
  usersAndTheirMoney.put(initialAccount, initialSupply);
}

//代币的移动是通过简单的功能完成的,只需从一个帐户中减去并添加到另一个帐户
public transfer(Account from, Account to, double amount) {
  verifySenderOfMoneyIsCaller(from);
  verifySenderOfMoneyHasEnoughMoney(from, amount);
  usersAndTheirMoney.put(from, usersAndTheirMoney.get(from)-amount);
  usersAndTheirMoney.put(to, usersAndTheirMoney.get(to)+amount);
}

这与我们在以太坊中用于创建通证的完全相同的概念

不过以太坊有自己的编程语言Solidity,使用Solidity编写代码大概是这个样子:

contract MyToken {
    mapping (address => uint256) public balances;
    function MyToken(uint256 initialSupply) {
        balances[msg.sender] = initialSupply;
    }   
   
    function transfer(address to, uint256 amount) public {
        balances[msg.sender] -= amount;
        balances[to] += amount;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录今日将C语言的Windows程序更改为python语言Windows程序,实现子窗口控制,类似微信程序框架最简单的原型

基本思路 为什么要选择python制作Windows应用程序&#xff0c;主要就是源代码直接展示&#xff0c;发现问题随时修改&#xff0c;同时可以不断增加新的功能方便。 由于C语言的Windows程序中结构类型在python中不能使用&#xff0c; 因此我们按照ctypes模块指导意见继承structu…

基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双目视觉原理 4.2 深度信息获取 4.3 表面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

STM32与Freertos入门(三)任务的创建、删除

1、串口配置 首先将串口进行配置&#xff0c;后续经常会应用&#xff0c;具体步骤点击&#xff1a;串口配置。 2、任务 创建一个任务&#xff0c;就是开辟一个空间、每个任务中都会有while&#xff08;1&#xff09;死循环。 2.1相关函数 动态创建&#xff1a;xTaskCreate…

ros2/ros 4轮2驱机器人xacro/urdf文件示例代码

这个实验中最重要的是&#xff1a;colcon build 之后要记得source install/setup.bash.否则修改的文件是不会更新的。知道了吧 <robot name"half" xmlns:xacro"http://wiki.ros.org/wiki/xacro"><xacro:property name"PI" value"3…

SL3041高耐压100V降压恒压芯片 24V降压5V 24V降压12V 12V降5V

SL3041宽电压100V恒压芯片 24V降压5V 24V降压12V SL3041是一款宽电压100V恒压芯片&#xff0c;具有高效率、高精度、高可靠性等优点&#xff0c;广泛应用于各种电源系统中。在本文中&#xff0c;我们将详细介绍SL3041的工作原理、应用场景以及如何使用它实现24V降压5V和24V降压…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

GaussDB数据库表创建行访问控制策略

目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…

AWS解决方案架构师学习与备考

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

信息收集 - 网站服务器

操作系统 区分大小写: 如果修改首页或其他页面的大小写后,网站返回一个错误页面,例如报错 "404 Not Found" 或类似的错误,这可能意味着网站运行在 Linux 或类 Unix 操作系统上。这是因为大多数 Linux 系统是区分大小写的。如果修改大小写后,网站页面正常显示,这…

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…

人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测

人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 目录 人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 1.项目介绍 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&…

Vue--第十天

终极实战----大事件项目 1.简介&#xff1a; 2.创建项目&#xff1a; 1.创建&#xff08;159-163&#xff09;&#xff1a; 还是对着视频操作吧 2.路由&#xff1a; 3.element Plus: 导入element Plus 后不需要再导入插件配置&#xff0c;就连组件导入也不用 4.pinia构建用…

【C盘清理】Jetbrains全家桶(PyCharm、Clion……)更改 IDE 特定文件(配置、缓存、插件、日志等)存储位置

文章目录 一、官网说明二、更改 IDE 目录的位置1. 转到“帮助”|“编辑自定义属性”2. 各文件位置3. 以PyCharm系统目录为例4. 修改idea.properties 三、清理旧的 IDE 目录 一、官网说明 IDE 使用的目录官网说明 二、更改 IDE 目录的位置 默认情况下&#xff0c;PyCharm 将每…

pytorch——豆瓣读书评价分析

任务目标 基于给定数据集&#xff0c;采用三层bp神经网络方法&#xff0c;编写程序并构建分类模型&#xff0c;通过给定特征实现预测的书籍评分的模型。 选取数据 在各项指标中&#xff0c;我认为书籍的评分和出版社、评论数量还有作者相关&#xff0c;和其他属性的关系并大。…

vscode如何开发微信小程序?(保姆级教学)

1.安装“微信小程序开发工具”扩展 2.安装“vscode weapp api”扩展 3.安装“vscode wxml”扩展 4.安装“vscode-wechat”扩展 5.在终端执行命令&#xff1a; vue create -p dcloudio/uni-preset-vue uniapp-test uniapp-test就是我这里的项目名称了 6.如果遇到了这个错误&a…

云渲染插件怎么设置?云渲染插件设置教程

云渲染技术以其高效、便捷的特性正改变着3D设计和视频制作行业。为了进一步简化渲染过程&#xff0c;云渲染插件应运而生。云渲染插件可以让用户在熟悉的3D软件环境中直接完成渲染任务&#xff0c;大幅提高工作的连贯性与效率。那么如何在3D软件中安装和设定这些神奇的云渲染插…

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下&#xff0c;华为的数据消费已经不再局限于传统的报表分析&#xff0c;还要支持用户的自助分析、实时分析&#xff0c;通过数据的关联&#xff0c;支持业务的关联影响分析以及对目标对象做特征识别&#xff0c;进行特定业务范围圈定、差异化管理与决策等。…

传奇的GEE、翎风、V8引擎之间的区别,哪个引擎更好用?

我们在选择传奇版本时可以看到有很多GEE引擎的版本&#xff0c;同时也有少数的翎风和V8引擎版本&#xff0c;当我们选择的版本是翎风或是v8引擎&#xff0c;之前没有架设过怎么办呢&#xff1f;不要着急&#xff0c;往下看&#xff01; 这还得从GEE引擎说起&#xff0c;GEE引擎…

「数据结构」二叉树1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;C启航 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;树&#x1f349;二叉树&#x1f34c;特殊二叉树&#x1f34c;二叉树的性质&#x1f34c;存储结构 &#x1f349;…

【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

论文标题&#xff1a;Open X-Embodiment: Robotic Learning Datasets and RT-X Models 论文作者&#xff1a;– 论文原文&#xff1a;https://arxiv.org/abs/2310.08864 论文出处&#xff1a;– 论文被引&#xff1a;–&#xff08;12/18/2023&#xff09; 论文代码&#xff1a…