用Solidity在Truffle上构建一个HelloWorld智能合约
原文地址:石匠的blog
Truffle的环境安装在前文已经整理,这次用Solidity在Truffle写一个HelloWorld以太坊智能合约,并在testrpc上进行测试。当前的软件版本信息如下:
Truffle v4.1.11 (core: 4.1.11)
Solidity v0.4.24 (solc-js)
项目创建
打开Mac的terminal终端,创建一个新目录,并truffle项目初始化。
> mkdir HelloWorld
> cd HelloWorld
> truffle init
初始化好之后的目录结构如下:
HelloWorld
|____truffle.js
|____migrations
| |____1_initial_migration.js
|____test
|____contracts
| |____Migrations.sol
|____truffle-config.js
撰写HelloWorld合约
HelloWorld智能合约测试代码如下:
pragma solidity ^0.4.24;
contract HelloWorld{
address creator;
string message;
constructor()
{
creator = msg.sender;
}
function say() constant returns (string)
{
return message;
}
function setMessage(string _newMsg)
{
message = _newMsg;
}
/**********
Standard kill() function to recover funds
**********/
function kill()
{
if (msg.sender == creator)
selfdestruct(creator); // kills this contract and sends remaining funds back to creator
}
}
保存到contracts目录下的HelloWorld.sol文件中。合约保存了一个message变量,用来存储设置的信息。合约提供了message的设置和获取接口setMessage和say,测试的时候可以调用者2个接口进行测试确认。
编译
在HelloWorld目录下:
> truffle compile
compile只会编译更新过的合约文件,如果有多个文件,且想全部编译,可以使用 truffle compile-all.
运行测试
1.启动testrpc
通过testrpc可以很方便的进行测试,打开一个新的terminal终端执行命令:
> testrpc
默认会在localhost:8545进行合约部署的监听。
2.修改合约配置
因为合约是要发给testrpc做运行,需要再HelloWorld/truffle.js中配置testrpc的地址信息,如下:
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // Match any network id
}
}
};
3.添加迁移信息(migrate)
需要配置告诉truffle迁移哪些合约到testrpc,添加一个文件HelloWorld/migrations/2_deploy_contracts.js
var HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function(deployer) {
deployer.deploy(HelloWorld);
};
运行迁移命令,部署合约到testrpc:
> truffle migrate
同样的,这个命令只会迁移修改过的合约,如果有异常错误或者需要手动全部重新迁移,可以运行 truffle migrate --reset.
迁移成功后在testrpc窗口也会有响应的提示信息,包括函数调用和事务执行信息等。
4.命令行测试合约
通过console可以方便的测试合约的开发接口是否访问正常,运行命令:
> truffle console
运行成功后进入到truffle的命令行程序中,可以通过以下命令来测试合约接口,设置信息:
> HelloWorld.deployed().then(i=>i.setMessage("Hello world!"));
HelloWorld.deployed()返回了部署成功的HelloWorld合约的Promise对象,然后通过then()调用setMessage接口。执行成功后可以得到类似如下的信息:
{ tx:
'0xbb506d5a8ad80ae431fcffc326e4910dcd272bba1fe458c8c83b8eefd08b7de1',
receipt:
{ transactionHash:
'0xbb506d5a8ad80ae431fcffc326e4910dcd272bba1fe458c8c83b8eefd08b7de1',
transactionIndex: 0,
blockHash:
'0x8dd58db70ad49d2741a9d36a6e5f77e5e6c0e19f09935df5cd21e52762472491',
blockNumber: 16,
gasUsed: 43459,
cumulativeGasUsed: 43459,
contractAddress: null,
logs: [],
status: 1 },
logs: [] }
因为setMessage是一个设置接口,会修改区块链的状态,所以他是一个Transaction。然后调用say接口测试是否设置成功:
> HelloWorld.deployed().then(i=>i.say());
返回结果是:
"Hello world!"
表面前面的setMessage设置有效,且say接口访问正常。
小结
以上是用solidity写的很简单的智能合约测试程序,并部署在truffle和testrpc测试验证成功,功能虽然简单,但是走通了以太坊智能合约的基本开发测试流程,以后可以基于此继续做扩展。
用Solidity在Truffle上构建一个HelloWorld智能合约的更多相关文章
- 使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署
目录 目录 1.基本概念 1.1.什么是智能合约? 1.2.什么是Solidity? 1.2.1.Solidity的语言特性 1.3.什么是 Browser-solidity? 2.Browser-s ...
- 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约
文章目录 安装IBM Blockchain Platform extension for VS Code 创建一个智能合约项目 理解智能合约 打包智能合约 Local Fabric Ops 安装智能合 ...
- 在K8S上跑一个helloworld
建立docker镜像 为了方便起见,这里直接使用一个js网页作为应用,以此创建镜像 hello world网页 创建server.js,输入以下代码创建helloworld网页: var http = ...
- Linux上构建一个RADIUS服务器详解
作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息.但是网络设备通常只支持有限的用户管理功能.学习如何使用Linux上的一个外部RADIUS服务器来验证用户,具体来说是通过一个 ...
- 【阿菜用工具】利用 Web3.js 在 ganache 上部署以及调用智能合约
合约部署 要部署的合约 pragma solidity ^0.4.23; contract test { uint256 value; function setValue(uint256 _value ...
- 使用maven构建一个helloworld maven项目
1.下载maven http://maven.apache.org/ 选择一个较新版本下下来 2.配置m2_home环境变量 先解压,新建用户变量m2_home,将bin目录添加到path变量中 3. ...
- 以太坊智能合约开发工具 Truffle 入门1
Truffle是以太坊(Ethereum)智能合约开发的瑞士军刀,小巧好用,上手简单. 本篇文章主要展示如何用Truffle 开发第一个Ethereum智能合约. 1.准备工作:(本人针对window ...
- 智能合约开发solidity编程语言开发一个以太坊应用区块链投票实例
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...
- 区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署
在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity I ...
随机推荐
- TensorFlow函数(十)tf.global_variables_initializer()
tf.global_variables_initializer() 此函数是初始化模型的参数 with tf.Session() as sess: tf.global_variables_initia ...
- Day1 MySql安装和基本操作
数据和数据库 1.数据:客观事物的符号表示. 2.存储介质:纸,光盘,磁盘,u盘,云盘… 3.存储的目的:检索(查询) 存储数据量加大,导致检索的难度升高. 4.数据库(DB:database):按照 ...
- Ubuntu14.04更换阿里云源
步骤很简单一共三步,如下所示: 第一.备份源文件(防止万一) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 第二.修改源文件(这里的源 ...
- jenkins 构建触发器 Poll SCM 和 Build periodically区别
Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作.我的配置如下: */5 * * * * (每5分钟检查一次源码变化) Bu ...
- 论mysql主从复制里面的那些坑
1.找好配置文件,修改对的配置文件,有的时候会有多个配置文件,要搞清楚加载的哪个配置文件. 2.主库备份钱的操作除了设置 只读状态外,还要设置全局只读=1. 3.mysqldump备份sql很方便,恢 ...
- 论文笔记 Beyond Part Models: Person Retrieval with Refined Part Pooling_ECCV_2018
1. 摘要 使用part-feature 能够起到更好的效果,不过这个需要我们很好地定位part的位置. 本文中作者集中考虑part内部的一致性,提出了 part-based convolutiona ...
- 404 Note Found 队-Beta2
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- iOS渐变导航栏封装
由于最近开发的几个项目都有渐变导航栏,每次写的时候都要copy一堆关于导航渐变相关的代码,显得类很冗余,所以花了点时间封装了一个渐变类,直接继承就可以满足大部分需求啦,这里简单写一下心路历程: 渐变的 ...
- macOS 开启 VNC 远程桌面和 SSH 服务
macOS 开启 VNC 远程桌面和 SSH 服务 准备用 macOS 来做为服务器,既然是服务器,那不可缺少的是远程管理,实际上 macOS 自带 VNC 远程桌面和 SSH 服务,只是默认没有开启 ...
- ruby puts, print, p方法比较
1.puts([obj[, obj2[, ....]]] ) 依次将obj和换行符输出到$>.若没有参数的话则只会输出换行符. 若参数是数组,则依次输出数组元素和换行符.若将既非数组又非字符串的 ...