以太坊区块链学习之在私链上部署合约

2023-11-19

上一篇博客介绍了如何搭建私链并在私链上创建账户、挖矿、查看余额,本篇将介绍在私链上部署合约并与之交互。本篇开发环境为MacOS 10.12,建议读者使用macOS系统或者Ubuntu系统。

第一步,进入geth客户端

启动私链,进入geth客户端。启动终端,进入你的私链所在目录。输入:

geth --datadir "./" console 2>>geth.log
第二步,编写智能合约
智能合约,即智能化的合同,它使得程序员可以在区块链上进行编程。以太坊智能合约使用的语言为solidity,编辑器建议先使用Remix, Remix是一款在线编辑器。(如果网址打不开,建议翻墙打开)

合约代码我们使用出自以太坊官网的一段最简单的合约代码:

pragma solidity ^0.4.9;
contract Test{
    function f(uint a) returns (uint b){
        uint result = a*8;
        return result;
    }
}
如果你有过编程经验,一定能够猜测出这段代码的功能:输入一个数字,返回它的8倍的值。

第一行代码表示该合约支持solidity0.4.9及以上版本。contract Test可以看做是面向对象语言(如JAVA)中的类,f是这个合约的一个函数,returns指定返回值类型为uint,uint代表无符整型。将这段代码键入到Remix中。

第三步,编译合约

点击Remix右侧的start to compile(如果勾选了auto compile则不需要点击),如果没有报错,点击Details(这个按钮在start to compile的下面一行),此时会弹出一个信息框,里面有一块叫做WEB3DEPLOY,复制这段代码,代码如下:

var testContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"f","outputs":[{"name":"b","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var test = testContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x6060604052341561000f57600080fd5b60b68061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063b3de648b146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b600080600883029050809150509190505600a165627a7a7230582098308aba54ec83fa77e460bbb939783c32c67727e90e560c6e1975affac1b3f80029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })
这是一段js代码,这段代码的作用是将合约部署到当前链上,使用的账户是accounts[0]。gas是燃料的意思。在以太坊中,对链每进行一次“写”操作,都要付出“代价”,这个代价就是gas,消耗gas意味着消耗以太坊。如果你是跟着前一篇博客读过来的,此时你可以回头看看genesis.json文件,这个文件中有一项叫做gasLimit,这个属性定义了链单次消耗gas的上限。

第四步,部署合约

回到geth终端,如果此时你将复制的代码粘贴进geth中,并按下回车,会报错,报错信息大致如下:


这是因为账户accounts[0]处于锁住状态,输入:

personal.unlockAccount(eth.accounts[0],"password")
第一个参数是要解锁的账户地址,这里我们是accounts[0],第二个参数是账户的密码,按下回车返回true代表解锁成功。接着,输入挖矿指令,如果私链不挖矿就产生不了新的区块,合约是不能够成功部署的,

miner.start(1)
当私链开始挖矿后,把之前的代码复制进来,按下回车。等待片刻,当终端返回信息Contract mined,合约即部署成功!

第五步,与合约交互

观察WEB3DEPLOY可以发现,部署后的合约被赋值给了test,输入指令:

test.f.call(8)
回车得返回值64。通过这条指令,我们从geth终端调用了合约中的函数f,并获得了正确的结果!我们完成了与合约的第一次交互!指令中的call()表示调用函数进行“只读”操作,不会消耗gas。

至此,我们完成了在私链上部署、交互合约的学习!


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

以太坊区块链学习之在私链上部署合约 的相关文章

随机推荐

  • 宝可梦虚拟银行服务器连接不上,更多宝可梦!《精灵宝可梦:太阳/月亮》虚拟银行将开启...

    任天堂近日宣布3DS 精灵宝可梦 太阳 月亮 Pok mon Sun Moon 将在一月下旬开启 宝可梦虚拟银行 这个功能主要是让游戏与整个 口袋妖怪 系列进行联动 进行寄存或领出各种宝可梦 宝可梦虚拟银行 从1月下旬起对应 精灵宝可梦 太
  • 25 个 JavaScript 实用级语句 进阶

    1 复制内容到剪贴板 为了提高网站的用户体验 我们经常需要将内容复制到剪贴板 以便用户粘贴到指定的地方 const copyToClipboard content gt navigator clipboard writeText conte
  • 黑客美化版大马_2012版

  • JVM调优之GC调优——响应时间优先(三)

    GC调优之响应时间优先 上一节简单介绍了GC调优的吞吐量优先 详见 https blog csdn net Winner941112 article details 102679614 这一节将会考虑响应时长进行调优 响应时间优先 依然使用
  • Qt5学习之路(vs2012下创建一个QT应用程序)2013-10-14

    刚开始学习QT在网上找的资料基本都是使用QT Create进行开发的 VS下开发的学习资料感觉很少很难找的到 视频教程也基本没看到过貌似 因为我们研发中心是使用MFC进行开发开发工具是VS2010 使用QT开发的话基本我们不会再使用QT C
  • 2021-01-01 中国公务员级别

    中华人民共和国公务员 1 级别 一级到二十七级 27个级别 2 职务 国家级正职到乡科级副职 10级领导职务 3 职级 一级巡视员到二级科员 12个职级 根据 中华人民共和国公务员法 2018年12月29日第十三届全国人民代表大会常务委员会
  • 使用selenium自动登录淘宝并获取cookie

    http sunjun041640 blog 163 com blog static 256268322013101473549333 最近做个东西需要用程序登录淘宝然后去后台获取些东西 分析了一下登录页面 发现淘宝有用flash生成一个字
  • BLE连接、配对和绑定

    参考 一篇文章带你解读蓝牙配对绑定 参考 BLE安全之SM剖析 1 参考 BLE安全之SM剖析 2 参考 BLE安全之SM剖析 3 参考 https blog csdn net chengbaojin article details 103
  • 有趣的Hack-A-Sat黑掉卫星挑战赛——被破坏的阿波罗计算机(解法二)

    国家太空安全是国家安全在空间领域的表现 随着太空技术在政治 经济 军事 文化等各个领域的应用不断增加 太空已经成为国家赖以生存与发展的命脉之一 凝聚着巨大的国家利益 太空安全的重要性日益凸显 1 而在信息化时代 太空安全与信息安全紧密地结合
  • 时间与时间戳的转换

    什么是时间戳 时间戳是指格林威治时间自1970年1月1日 00 00 00 GTM 至当前时间的总秒数 它也被称为Unix时间戳 Unix Timestamp 时间戳是能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据 通常是一个
  • org.json.JSONException: No value for thumbnail_pic

    在JSON解析中会遇到一种错误 很常见的错误 是因为我们解析方法getString 是因为JSON里面不存在这个value 我们可以用另外一个方法optString 这个方法如果不存在value会返回 空字符串 不会报异常 为了安全起见我一
  • ECS突发性能型t6和轻量应用服务器区别和选择?

    这两款对比的话 个人还是首选推荐使用ECS突发性能型t6 毕竟是ecs服务器 功能上全面一些的 关于什么是阿里云ECS共享型S6 计算型 突发性能型 操作和地域镜像等系统选择 前往阿里云官网产品文档了解轻量服务器和突发型相关内容 共享型 云
  • 以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素。

    出队的时候一定要注意是不是最后一个元素出队 假设以带头结点的循环链表表示队列 并且只设一个指针指向队尾元素结点 试编写相 应的初始化 入队以及出队算法 include
  • Minio安装

    Minio安装 想要了解 Minio 直接去官网查看 官网 https min io GitHub地址 https github com minio minio minio概述文档 http docs minio org cn minio
  • 文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: FormMain --- 未能加载基类“WinForm.Win.FormsBase.FormMainBase”。请确...

    出现该问题的原因 FormMain从FormMainBase继承之后 一旦修改FormMainBase就会出现这个问题 解决方案 1 4是搜索网友的 1 关闭VS所有窗口 后重启 即可返回正常 2 第一种方案不成功 关闭VS所有窗口 点击解
  • 重置计算机后无法开机,win10重置此电脑失败怎么办_win10重置此电脑失败无法开机修复方法...

    当win10系统使用时间长了 难免会有一些电脑故障的出现 这时有些用户就会选择使用重置电脑的方式来解决 但是最近有用户再给自己的win10系统进行重置时总是出现失败的情况 那么win10重置此电脑失败怎么办呢 下面就来告诉大家win10重置
  • TCP/UDP

    TCP与UDP的相关知识 TCP的三次握手具体发生在哪个函数中 补充知识 TCP的三次握手具体发生在哪个函数中 在Linux编程中 在进行TCP网络编程时 通常分为客户端和服务器端两个模块 客户端 fd socket 利用socket生成文
  • jvm原理--简单的程序加载分析

    package com bzu csh 类加载器加载 class文件 gt 初始化static声明 并不赋值 gt 调用类 gt static声明赋值由上到下 程序开始运行 首先执行main方法 执行main方法第一条语句 调用Single
  • 时序预测

    时序预测 MATLAB实现SARIMA时间序列预测 arima函数 经常还会遇到一种情况 即某些时间序列中存在明显的周期性变化 这种周期是由于季节性变化 季度 月度等 引起的 ARIMA的扩展支持SARIMA 它支持对该系列的季节性成分进行
  • 以太坊区块链学习之在私链上部署合约

    上一篇博客介绍了如何搭建私链并在私链上创建账户 挖矿 查看余额 本篇将介绍在私链上部署合约并与之交互 本篇开发环境为MacOS 10 12 建议读者使用macOS系统或者Ubuntu系统 第一步 进入geth客户端 启动私链 进入geth客