区块链智能合约solidity入门

2023-10-26

使用ubuntu系统安装ethereum开发环境

安装 Nodejs

sudo apt-get update

sudo apt install curl

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -

sudo apt-get install -y nodejs

sudo apt-get install npm

安装 ethereumjs-testrpc

sudo apt-get install build-essential

sudo apt-get install git

sudo npm install -g ethereumjs-testrpc

执行testrpc
在整个开发过程中需要一直云心testrpc。 每次执行testrpc,都会产生10个带有test funds的新地址。这些不是真正的钱,我们可以放心地进行任何测试而不用损失钱财。
编写Ethereum智能合约的最流行的语言是solidiy。我们会使用truffle 开发框架,它可以帮助我们创建新的智能合约、编译、发布、测试智能合约。

$ npm install -g truffle

$ mkdir solidity-experiments

$ cd solidity-experiments/

$ truffle init 

Truffle会为创建一个样例工程而新建一些文件。可以使用truffle compile进行编译。运行truffle migrate来讲合约部署到模拟网络中。

$ truffle compile
Compiling ConvertLib.sol...
Compiling MetaCoin.sol...
Compiling Migrations.sol...
Writing artifacts to ./build/contracts
$ truffle migrate
Using network 'development'.
Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x686ed32f73afdf4a84298642c60e2002a6d0d736a5478cc8cb22a655ac018a67
  Migrations: 0xa7edbac1156f98907a24d18df8104b5b1bd7027c
Saving successful migration to network...
  ... 0xe3bf1e50d2262d9ffb015091e5f2974c8ebe0d6fd0df97a7dbcde8a0e51c694a
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying ConvertLib...
  ... 0x2e0e6718f01d0da6da2ada13d6e4ad662c5a20e784e04c404e9d4ef1d392bdae
  ConvertLib: 0xf4388ce4d4ce8a443228d65ecfa5149205db049f
  Linking ConvertLib to MetaCoin
  Deploying MetaCoin...
  ... 0xb03a3cde0672a2bd4dda6c01dd31641d95bd680c4e21162b3370ed6db7a5620d
  MetaCoin: 0x4fc68713f7ac86bb84ac1ef1a09881a9b8d4100f
Saving successful migration to network...
  ... 0xb9a2245c27ff1c6506c0bc6349caf86a31bc9f700388defe04566b6d237b54b6
Saving artifacts...

如果遇到# [Truffle Migrate doesn’t work: Error: No network specified. Cannot determine current network] 问题,可以编辑truffle.js文件

module.exports = {
   networks: {
   development: {
   host: "localhost",
   port: 8545,
   network_id: "*" // Match any network id
  }
 }
};

编写第一个Ethereum智能合约

首先我们编写一个简单的ProofofExistence的智能合约。 主要思想就是创建一个数字公证:它存储了文档的哈希值作为存在的证明。使用truffle create contract命令来开始:

$ truffle create contract ProofOfExistence1

现在打开contracts/ProofOfExistence1.sol,然后将以下代码复制到这个文件当中:

pragma solidity ^0.4.15;
// Proof of Existence contract, version 1
contract ProofOfExistence1 {
  // state
  bytes32 public proof;
  // calculate and store the proof for a document
  // *transactional function*
  function notarize(string document) {
    proof = proofFor(document);
  }
  // helper function to get a document's sha256
  // *read-only function*
  function proofFor(string document) constant returns (bytes32) {
    return sha256(document);
  }
}

每一个合约都有状态state和函数functions。在智能合约中区分两种类型的函数是十分重要的:
- 只读(常量)函数:此函数不会产生任何状态state改变。它们只会读取状态,进行计算,返回值。这些函数会被各种节点在本地计算,不会消耗gas。会被关键字constant标记。
- 交易型函数: 会对状态进行改变的函数。这些改变会在区块链中有所体现,交易型函数需要将交易发送到网络中,会消耗gas、
下面我们将ProofOfExistence1部署到网络中。我们需要编辑migration 文件migrations/2_deploy_contracts.js 让truffle来部署新的交易。

var ProofOfExistence1 = artifacts.require("./ProofOfExistence1.sol");
module.exports = function(deployer) {
  deployer.deploy(ProofOfExistence1);
};

需要重新运行migration

truffle migrate --reset

和智能合约进行交互

我们的合约已经部署好了,我们可以测试一下。我们使用函数调用的方式发送消息,读取public state。我们可以使用truffle console来做这些

$ truffle console
// get the deployed version of our contract
truffle(default)> var poe = ProofOfExistence1.at(ProofOfExistence1.address)
// and print its address 
truffle(default)> poe.address
0x3d3bce79cccc331e9e095e8985def13651a86004
// let's register our first "document"
truffle(default)> poe.notarize('An amazing idea')
{ tx: '0x18ac...cb1a',
  receipt: 
   { transactionHash: '0x18ac...cb1a',
     ...
   },
  logs: [] }
// let's now get the proof for that document
truffle(default)> poe.proofFor('An amazing idea')
0xa3287ff8d1abde95498962c4e1dd2f50a9f75bd8810bd591a64a387b93580ee7
// To check if the contract's state was correctly changed:
truffle(default)> poe.proof()
0xa3287ff8d1abde95498962c4e1dd2f50a9f75bd8810bd591a64a387b93580ee7
// The hash matches the one we previously calculated

首先是要获取部署的合约存入到poe的变量中。然后调用交易函数notarize,它包含了一个状态的改变。当我们调用一个交易函数时,我们获得了一个promise来解析一个交易对象,而不是实际的函数返回。改变EVM的状态我们需要支付gas,然后对网络发送一笔交易。这就是为什么我们得到一个交易信息对象作为promise的结果,指的是这种状态改变的交易。在这种情况下,我们对交易ID不感兴趣,所以我们不用考虑promise。在编写一个真正的应用程序的时候,我们需要保存它来检查生成的交易并捕获错误。

接下来,我们调用只读(常量)函数proofFor。一定要使用关键字constant来标记只读函数,否则Truffle将尝试创建一笔交易来执行他们。这是一种告诉truffle我们不会和区块链进行交互而仅仅是读取值。使用这个只读函数,我们获得了文档的哈希值。

我们现在需要将其与我们的智能合约的状态形成对比。要检查状态是否正确改变,我们需要读取证明公共状态变量。为了获得一个公共状态变量的值,我们可以调用一个同名的函数,它返回一个值的Promise。在我们的例子中,输出哈希值是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链智能合约solidity入门 的相关文章

  • 关于区块链的原理:去中心化的分布式记账系统

    区块链技术的核心是所有当前参与的节点共同维护交易及数据库 它使交易基于密码学原理而不基于信任 使得任何达成一致的双方 能够直接进行支付交易 不需第三方的参与 从技术上来讲 区块是一种记录交易的数据结构 反映了一笔交易的资金流向 系统中已经达
  • 区块链基本概念学习笔记

    文章目录 区块链产生与发展历史 区块链的场景属性 区块链定义 区块链的特点 区块链加密货币的特点 区块链核心技术 区块链的核心概念 区块链分类 区块链架构特点 区块链产生与发展历史 区块链的场景属性 区块链定义 区块链是一种点对点传输协议
  • blockchain 区块链200行代码:在JavaScript实现的一个简单的例子

    了解blockchain的概念很简单 区块链 交易链块 它是分布式的 即不是放置在同一台机器上 不同的网络设备上的 数据库支持主办记录日益增长的名单 但是 这也是容易混淆blockchain与我们试图帮他解决了目标 在人们心中的那一刻 这个
  • 自学区块链:原理、技术及应用——什么是区块链(笔记)

    Bitcoin和区块链有很深的渊源 但Bitcoin与区块链两者不能等同 区块链是Bitcoin的底层技术 除了Bitcoin 还有很多其他的区块链技术应用 什么是 区块链 时间戳服务器对以区块 Block 形式存在的一组数据实施随机散列
  • 在区块链中保存文件的最佳实践

    将文件保存为区块链数据的一部分的最佳实践是什么 我有非常大的文件需要保存 我们不能将这些文件保存在云存储 像 dropbox 这样的集中式解决方案 上 并使用文件哈希将它们与区块链数据链接起来吗 还是使用IPFS这样的分布式文件存储更好 或
  • Hyperledger Fabric 1.4:如何测试和验证 Fabric Node SDK 中的 registerChaincodeEvent 函数?

    我目前在添加资产时从我的链代码发出一个事件 async addRequestNode ctx sampleAssetId sampleData console info Adding Sample Asset await ctx stub
  • 在 Hyperledger 结构中动态添加组织或组织中的对等方

    我在用http hyperledger fabric doc readthedocs io en latest getting started html用于 Ubuntu VM 中的 Hyperledger Fabric 设置 根据教程 f
  • 编写 Hyperledger Fabric Chaincode 时应遵循的最佳实践

    为了避免错误并编写高效的 Hyperledger Fabric Chaincode 应该遵循哪些最佳实践 编写 Hyperledger Fabric 链码的一般指南 有关详细说明 请参阅以下链接 https gist github com
  • Fabric 网络 - 当宕机的对等点连接回网络时会发生什么?

    我最近使用 Docker compose 部署了结构网络 我试图模拟一个宕机的对等点 本质上是这样的 使用运行结构网络的 docker compose 将 4 个对等点联机 1 个对等点 即第 4 个对等点出现故障 通过 docker st
  • 错误 HH604:运行 JSON-RPC 服务器时出错:错误:0308010C:数字信封例程::不支持

    我正在 Linux 中设置安全帽 我首先使用这些命令设置了反应应用程序 npx create react app react dapp cd react dapp 然后我使用此命令安装了一些安全帽依赖项 npm install ethers
  • Fabric Javascript SDK 和 Hyperledger Composer 之间有哪些功能差异?

    除了 Composer 使原型业务网络的部署和测试变得更加容易 以及我们不需要了解 golang 来开发链代码这一事实之外 这些接口提供的功能有何差异 可能会导致人们选择其中之一另一个 这篇文章或许可以为您提供所需的答案 https blo
  • 什么是区块链和以太坊?它用在哪里?

    我刚刚有机会在基于区块链的以太坊平台上工作 但我不清楚它在哪些场景中使用 在现实生活中使用它 有人可以帮助我了解基于区块链的平台及其现实生活中的用途吗 欢迎来到区块链世界 不要灰心丧气 区块链领域相对较新 很难找到好的教程 我一个月前也开始
  • 发送原始交易以太坊 infura nodejs npm

    我目前正在尝试实现与我的 Typescript 节点项目的以太坊节点连接 我正在连接到 Infura 节点服务器 我需要在本地签署我的交易 好吧 无论如何 我正在使用 npm 包 ethereumjs tx 签署我的交易 一切看起来都很棒
  • Hyperledger Fabric 和 Hyperledger Indy 之间的跨账本通信

    hyperledger Fabric 和 indy 之间是否可以进行跨账本身份管理 Hyperledger Fabric 和 Hyperledger Indy 之间是否可以进行通信 我可以从 Fabric 读取数据并将其存储在 Indy 中
  • Chainlink节点:交易待处理时该怎么办?

    我有一个 chainlink 节点 并且有些交易似乎被卡住了 如何修复待处理的传出确认 大多数情况下 您没有使用 Gas 为您的 chainlink 节点账户提供资金 转到您的配置并获取ACCOUNT ADDRESS并将 ETH 发送到该地
  • 私有区块链与 Hashgraph、Ripple、BigChainDb

    我一直在研究不同区块链的一些用例 最后我得出的结论是 建立一个私有区块链相当于拥有一个分布式数据库 在其之上添加了区块链概念 如不可篡改 数字签名等 例如 Bigchaindb 好吧 如果我们确实需要智能合约功能 那么分布式数据库可能无法工
  • ERC20:津贴不足

    我创建了两个代币 YAY e sYAY 和一个 StakeRewards 智能合约 代码如下 SPDX License Identifier MIT pragma solidity 0 8 0 import openzeppelin con
  • 如何发送wei/eth到合约地址? (使用truffle javascript测试)

    我正在尝试将 wei eth 发送到我的 Solidity 合约的地址 该合约具有外部应付回退功能 我下面的 truffle javascript 测试不会导致 instance address 的余额获得任何 wei instance a
  • 区块链是否包含 websocket 服务器?

    我最近阅读了有关区块链的文章 并对这项技术非常感兴趣 我有几个关于区块链的问题 区块链是否使用网络套接字在用户之间传输信息 如果是 那么发送的信息 块 总是 JSON 对象吗 是否所有用户都拥有区块链的完整副本 他们每个人是否只看到区块链的
  • 使用 BNB 从合约购买代币时出现问题

    我正在创建这个智能合约 它创建所有代币并将其添加到我的钱包中 然后我将钱包中的所有代币发送到我的合约中 然而 当我从另一个钱包向合约发送 BNB 时 我希望他返回我合约中的一些代币 当我这样做时 传输失败并发送以下错误消息 警告 合约执行过

随机推荐

  • IC SPEC相关数据

    恢复内容开始 静态电流 静态电流是指没有信号输入时的电流 也就是器件本身在不受外部因素影响下的本身消耗电流 纹波电压的害处 1 容易在用设备中产生不期望的谐波 而谐波会产生较多的危害 2 降低了电源的效率 3 较强的纹波会造成 浪涌电压或电
  • c++中string类与字符串数组

    strlen及用 给c 字符串数组赋值 strlen 很笨 它会在遇到 0之前一直找下去 所以在cstr2中没有 0的时候 它会一直找下去 而那些地方还没有被初始化过 所以就是乱的 而且strlen计算出的字符串数组长度是不包含 0的那部分
  • elasticsearch中mapping中的可设置的属性

    mappings 在index 库 下创建时使用 下面可以有多个mapping 以下数据结构主要针对每个mapping进行说明 一级属性 二级属性 三级属性 说明 dynamic 新增字段自动模式 true 表示自动识别新字段并创建索引 f
  • 动态爬虫(ajax)-爬取bilibili热门视频信息

    文章目录 前言 一 页面分析 二 编写爬虫 1 引入库 2 发出请求 2 1生成请求头 2 2发出请求并获取响应 3 解析响应的内容 4 保存提取的信息到本地 5 康康主函数 三 运行结果 前言 使用python爬虫爬取bilibli每日热
  • VS2019利用Developer Command Prompt for VS 2019查看对象模型中的Class

    本文利用Developer Command Prompt for VS 2019工具 快速查看对象模型中类的结构 便于大家迅速了解衍生类和基类的关系 文章目录 一 打开开发人员命令提示工具 二 使用步骤 1 确定cpp文件位置 1 1 查找
  • chatGPT侧边栏历史记录消失解决方法

    从昨天3月8日开始 很多程序员发现自己的chatGPT打开后左侧侧边栏历史记录消失了 自己辛辛苦苦测试的Prompt都没有了 折腾了很久都不行 不得不重新写Prompt 解决方法 其实很简单 就是退出账号登录 然后重新登录账号再刷新就恢复了
  • QT界面UI文件不读取问题

    QT的C 项目有一段时间没有打开 重新打开时发现部分ui界面不知道为什么无法在QT Creator中用designer编辑器打开了 问题如下图 1 双击该ui界面不会自动跳转到界面编辑器了 2 可以随意更改ui界面的代码内容了 正常的ui界
  • C/C++使用Windows的API实现共享内存以及同步

    目录 共享内存 事件 Event 实现思路 创建方 服务端 连接方 进程同步 windows的API CreateFileMapping MapViewOfFile CreateEvent WaitForSingleObject Creat
  • 复习js笔记

    JS w3cschool官网 1000多本编程教程免费学 在日常中遇到的js函数 forms document forms name for in 循环 let x name lai age 18 city nanyang var y fo
  • 深度学习:激活函数的比较和优缺点,sigmoid,tanh,relu

    1 什么是激活函数 2 为什么要用 3 都有什么激活函数 4 sigmoid Relu softmax 1 什么是激活函数 如下图 在神经元中 输入的 inputs 通过加权 求和后 还被作用了一个函数 这个函数就是激活函数 Activat
  • Vue

    一 vue router的实现原理 路由的概念来源于服务端 服务端中的路由描述的是URL和处理函数之间的映射关系 web前端单页应用SPA single page application 中 路由描述的是URL和UI之前的映射关系 这种映射
  • 华为机试题24-合唱队

    描述 N 位同学站成一排 音乐老师要请最少的同学出列 使得剩下的 K 位同学排成合唱队形 设K位同学从左到右依次编号为 1 2 K 他们的身高分别为T1 T2 TK 若存在i 1 i K 使得T1
  • 万字解读区块链游戏行业:洞察游戏的未来

    撰文 Mason Nystrom Jerry Sun Messari 分析师 编辑 南风 基于区块链的游戏领域正在快速扩张 这得益于 NFT 和游戏内货币的崛起 该领域的增长可以被视为数十年来游戏行业盈利策略和商业模式不断迭代的延续 在过去
  • VB--生成DLL的步骤

    1 找到工程栏下 当前工程 选中它 2 右键工程 属性 3 生成页签 改下版本号 以便区分 4 选择横的菜单栏 文件 生成 dll 文件 OVER
  • 驱动开发 linux内核GPIO子系统、及其新版API的概念和使用,linux内核定时器

    1 GPIO子系统 概述 每一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动 我们只需要调用对应的厂商驱动就可以完成硬件的控制 而linux内核源码中的gpio厂商驱动有很多 linux内核个会对厂商驱动做一些封装
  • 【HIve】java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT

    1 概述 xception in thread main java lang NoSuchFieldError HIVE STATS JDBC TIMEOUT at org apache spark sql hive HiveUtils h
  • 如何拥有个人的Github技术博客

    题图 87testing com 前不久用wordpress搭建了一个博客 用起来感觉不是太好用 并且数据库经常会发生异常挂掉 没找到解决方案 看到有不少人使用的hexo github方式搭建属于自己的博客 于是 我也做了一些尝试 将搭建的
  • 什么是Sui Kiosk,它可以做什么,如何赋能创作者?

    创作者和IP持有者需要一些工具帮助他们在区块链上实现其商业模式 Sui Kiosk作为Sui上的一种原语可以满足这种需求 为创作者提供动态选项 使他们能够在任何交易场景中设置完成交易的条件 本文将向您介绍为什么要在SuiFrens中使用Su
  • libusb linux 异步传输,libusb开发(关于异步IO)

    libusb开发 关于异步IO 上一篇介绍了libusb的同步传输接口 但是很多情况下使用同步传输远远达不到我们的要求 那么这个时候就应该使用异步传输 接下来的内容是我学习libusb时遇到的问题以及异步IO如何使用 异步写 void QU
  • 区块链智能合约solidity入门

    使用ubuntu系统安装ethereum开发环境 安装 Nodejs sudo apt get update sudo apt install curl curl sL https deb nodesource com setup 8 x