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.0005data: ‘0x’ // 也可以附加消息
}

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

创建智能合约

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

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

调用合约方法

{to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85’, //合约value: 0.0data: ‘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;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《点云处理》 点云去噪

前言 通常从传感器&#xff08;3D相机、雷达&#xff09;中获取到的点云存在噪点&#xff08;杂点、离群点、孤岛点等各种叫法&#xff09;。噪点产生的原因有不同&#xff0c;可能是扫描到了不想要扫描的物体&#xff0c;可能是待测工件表面反光形成的&#xff0c;也可能是相…

项目中webpack优化配置(持续更新)

项目中webpack优化配置 1. 开发效率&#xff0c; 体验 DLL&#xff08;开发过程中减少构建时间和增加应用程序的性能&#xff09; 使用 DllPlugin 进行分包&#xff0c;使用 DllReferencePlugin(索引链接) 对 manifest.json 引用&#xff0c;让一些基本不会改动的代码先打包…

大型语言模型:RoBERTa — 一种稳健优化的 BERT 方法

slavahead 一、介绍 BERT模型的出现BERT模型带来了NLP的重大进展。 BERT 的架构源自 Transformer&#xff0c;它在各种下游任务上取得了最先进的结果&#xff1a;语言建模、下一句预测、问答、NER标记等。 尽管 BERT 性能出色&#xff0c;研究人员仍在继续尝试其配置&#xff0…

Postman接口自动化测试之——批量执行(集合操作)

集合定义&#xff1a;在接口自动化测试过程中将一组请求&#xff08;多条请求&#xff09;保存到一起进行集中管理。方便执行过程中的维护、导出和执行等。 创建集合 在引导页点击“Collection”&#xff0c;或者在“Collection”标签点击图标&#xff1b; 字段解释 集合描述…

Oracle的学习心得和知识总结(三十一)| ODBC开放式数据库连接概述及应用程序开发

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

无人机在融合通信系统中的应用

无人驾驶飞机简称“无人机”&#xff0c;是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞行器&#xff0c;现今无人机在航拍、农业、快递运输、测绘、新闻报道多个领域中都有深度的应用。 在通信行业中&#xff0c;无人机广泛应用于交通&#xff0c;救援&#xff0c;消…

CentOS:Docker 创建及镜像删除

1、安装docker 远程连接服务器&#xff0c;可以直接下载netsarang比较好用 家庭/学校免费 - NetSarang Website 如果有残留docker未删除干净&#xff0c;请使用 sudo yum -y remove docker docker-common docker-selinux docker-engine Step1&#xff1a;安装必要的一些…

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&…

第十七章 爬虫scrapy登录与中间件2

文章目录 数据盘区太快会报错&#xff0c;setting中配置延迟 连接提取器

解决:Android 报错 Failed to transform exifinterface-1.2.0.jar

一、问题说明 Failed to transform exifinterface-1.2.0.jar (androidx.exifinterface:exifinterface:1.2.0) to match attributes {artifactTypeandroid-classes-jar, org.gradle.categorylibrary, org.gradle.libraryelementsjar, org.gradle.statusrelease, org.gradle.usa…

pycharm手动安装ini插件

pycharm中新增pytest.ini文件时发现&#xff0c;文件的图标不是配置文件的图标 原因是没有安装ini插件 安装插件的方式有很多种&#xff0c;今天通过去官网下载插件&#xff0c;再安装的方式 第一步&#xff1a;去官网搜索&#xff0c;地址是&#xff1a;https://plugins.jet…

使用深度学习的微光图像和视频增强:综述

1INTRODUCTION 微光图像增强&#xff08;LLIE&#xff09;旨在提高在光照较差的环境中捕获的图像的感知或可解释性。该领域的最新进展主要是基于深度学习的解决方案&#xff0c;其中采用了许多学习策略、网络结构、损失函数、训练数据等。在本文中&#xff0c;我们提供了一个全…

直流电、交流电和发电机、接地、变压器

直流电 此节内容主要摘录自&#xff1a;图文详解直流电与直流电路基本知识 直流电是指电流方向不随时间作周期性变化&#xff0c;由正极流向负极&#xff0c;但电流的大小可能会变化的电流。直流电可以分为稳定&#xff08;恒定&#xff09;直流和脉动直流两种&#xff0c;如下…

单片机应用实例:LED显示电脑电子钟

本例介绍一种用LED制作的电脑电子钟&#xff08;电脑万年历&#xff09;。其制作完成装潢后的照片如下图&#xff1a; 上图中&#xff0c;年、月、日及时间选用的是1.2寸共阳数码管&#xff0c;星期选用的是2.3寸数码管&#xff0c;温度选用的是0.5寸数码管&#xff0c;也可根据…

饥荒Mod 开发(十七):手动保存和加载,无限重生

饥荒Mod 开发(十六)&#xff1a;五格装备栏 饥荒游戏会自动保存&#xff0c;本来是一个好的机制&#xff0c;但是当角色死亡的时候存档会被删除&#xff0c;又要从头开始&#xff0c;有可能一不小心玩了很久的档就直接给整没了&#xff0c;又或者是打怪没爆好东西&#xff0c; …

LVS最终奥义之DR直接路由模式

1 LVS-DR(直接路由模式) 1.1 LVS-DR模式工作过程 1.客户端通过VIP将访问请求报文&#xff08;源IP为客户端IP&#xff0c;目标IP为VIP&#xff09;发送到调度器 2.调度器通过调度算法选择最适合的节点服务器并重新封装数据报文&#xff08;将源mac地址改为调度器的mac地址&am…

redis基本用法学习(字符串类型基本操作)

字符串类型是redis支持的最简单的数据类型&#xff0c;同时最简单的键值对类型也是key和value都是单个字符串&#xff0c;本质上就是字符串之间的相互映射&#xff0c;redis官网String类型简介页面提到可以用于缓存HTML片段或页面内容。   redis支持设置/获取单个键值对&…

机器学习 | 集成学习

团结就是力量&#xff01; Ensemble Learning 兼听则明&#xff0c;偏信则暗。 集成学习既是一种思想也是一类算法&#xff0c;它是建立在其他机器学习的算法之上&#xff0c;研究怎么让不同的算法之间进行协同。 既可以监督学习&#xff0c;也可以无监督学习。 集成学习用机器…

使用Gensim训练Word2vec模型

1、训练Gensim模型 import gensim # gensim 4.3.2 import jieba import re import warnings import logging warnings.filterwarnings(ignore)with open("dataset/sanguo.txt", r,encodingutf-8)as f: # 读入文本&#xff0c;此处使用的是三国演义&#xff0c;可自…

飞天使-k8s-知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…