区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署

在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下.

今天我们要做3件事:
        1) 学习搭建一个Solidity IDE(Remix).
        2) 使用这个Solidity Ide编写一份智能合约.
        3) 在我们前面第1,2,3章中部署的私有网络节点集群中部署这个合约,并能够在不同的节点中调用这个合约.

Remix,是一个Solidity开发语言的Ide, 它是一款运行在浏览器端的solidity ide,也是官方推荐使用的ide.

另外还有其它的solidiy ide,比如:Ethereum Studio, IntelliJ IDEA Plugin, Vistual studio extension...等这些ide的详细情况请参考官方文档:
https://solidity.readthedocs.io/en/latest/index.html

我们主要讲解Remix.

官方推荐的Solidity基于浏览器端的Ide(Remix)

运行Remix有两种方式,一种是直接用浏览器打开网址: https://remix.ethereum.org/
直接打开官方部署的编辑器,进行开发.

另外一种方式就是在本地部署Remix服务, 顺序运行下面的命令:
> git clone https://github.com/ethereum/remix
> cd remix
> npm install
> npm start
Remix服务就部署好了,然后在浏览器中打开:http://127.0.0.1:8080
就可以直接使用本地部署Remix进行开发了.

本地搭建Rmix 编辑器的好处,是可以随意修改编辑器中,源代码的字体.
vim ./node_modules/brace/index.js

找到下面的内容:
var editorCss = ".ace_editor {    position: relative;    overflow: hidden;    font: 10px/normal ‘Ubuntu Mono‘, ‘Monaco‘, ‘Menlo‘, ‘Consolas‘, ‘source-code-pro‘, monospace;    direction: ltr;}.ace_scroller {    position: absolute;    overflow: hidden;    top: 0;    bottom: 0;    background-color: inherit;    -ms-user-select: none;    -moz-user-select: none;    -webkit-user-select: none;    user-select: none;    cursor: text;}
在font这这一行,把字体修改成自己喜欢的大小和样式.

然后重新执行命令:
npm install
npm start

重新打开网页,即可看到效果:

在Remix上编写第一份智能合约

打开浏览器,访问http://127.0.0.1:8080, 新建文件‘SimpleStorage.sol‘
pragma solidity ^0.4.0;
contract SimpleStorage {
    uint storeddata;
    function set(uint x) {
        storeddata = x;
    }
    function get() constant returns(uint retVal)  {
        return storeddata;
    }
    function multiply(uint a) returns(uint d) {
        return a * 7;
    }
}

这个SimpleStorage功能很简单,把一个数乘以7并保存起来,提供获取和设置它的接口.

大家最好手动输入以上内容体验一下Remix的效果.也可以故意输错,看看Remix是如何提醒错误的.

Remix调试模式

第一种是默认模式:javascript vm
第二种,是通过本地私有网络的rpc端口,链接到本地私有网络进行调试
还记得我们第2章中创建的以太坊私有网络节点集群吗?  进入之前的私有网络目录,并使用我们讲过的方法启动节点:
cd ~/Documents/private-chain/
geth --datadir ./data/00 --networkid 314590 --ipcdisable --port 61910 --rpcport 8200 console
回到Remix浏览器Ide中,选中右侧边栏的‘Contact‘选项卡.在‘Execution environment‘选项中,选择:‘web3 provider‘, ide会弹出提示,让你输入之前我们启动的私有网络的rpc地址和端口, 输入:
http://localhost:8200

确定, 可以看到ide弹出提示:
Invalid JSON RPC response: ""
我们按照官方提供的方法,增加几个选项,启动命令修改之后如下:
geth --datadir ./data/00 --networkid 314590 --ipcdisable --port 61910 --rpc --rpcapi ‘web3,eth,debug‘ --rpccorsdomain ‘*‘ --rpcport 8200 console
####我们增加了以下几个命令选项:####
--rpc --rpcapi ‘web3,eth,debug‘ --rpccorsdomain ‘*‘
然后Remix重新链接私有网络的RPC地址, Idea没有了错误提示. 回到刚才启动的网络节点,在命令行输入命令查看账号:
> eth.accounts ["0x5fba50fce50baf0b8a7314200ba46336958ac97e"]
观察Remix中, 有侧边栏‘Contract‘ tab页中的‘Transaction origin‘,这里显示的就是这个账号地址.  
点击下方的‘create‘按钮.错误又来了:

    callback contain no result Error: authentication needed: password or unlock

提示账号被锁定,需要‘Transaction origin‘中指定的账号的密码,或者解锁账户.
回到geth命令行,执行下面的命令解锁账户:
> personal.unlockAccount("0x5fba50fce50baf0b8a7314200ba46336958ac97e", ‘password of account‘)
true
再次点击‘Create‘, 出现提示:
    

并且在geth命令行中,看到了一个提示:
    > INFO [06-19|00:21:11] Submitted contract creation              fullhash=0x5aaf0021c94f52e37eda6c17cfbea2995c1ad1935816e7cac84c73448bd6ab2d contract=0xa7fdc326fa65a15665e3637ff33a120ff3758cdb
    > 

就像之前我们在第三章中,从一个账户发送以太币到另一个账户,需要调用miner.start(),挖矿来确认我们的交易一样.
这里我们调用一下:
    > miner.start(3); admin.sleepBlocks(1); miner.stop();
    INFO [06-19|00:22:31] Updated mining threads                   threads=3
    INFO [06-19|00:27:08] Successfully sealed new block            number=38 hash=b7fdac…eb3c3f
    INFO [06-19|00:27:08] ?? mined potential block                  number=38 hash=b7fdac…eb3c3f
    INFO [06-19|00:27:08] Commit new mining work                   number=39 txs=0 uncles=0 elapsed=1.836ms
    INFO [06-19|00:27:08] Successfully sealed new block            number=39 hash=210027…1218e0
    INFO [06-19|00:27:08] ?? mined potential block                  number=39 hash=210027…1218e0
    INFO [06-19|00:27:08] Commit new mining work                   number=40 txs=0 uncles=0 elapsed=183.453μs
    true
    >
    这里这一串语句表示启动3个线程来挖矿,挖到第一个区块就停止.

####查看未确认的交易数量####
    >txpool.status

回到Remix中,我们可以看到,合约已经创建成功了.  

其中,有get, multiply, 和set 3个按钮分别对应了SimpleStorage合约中的3个函数,用于测试函数的功能.
下面在set按钮后面的的输入框中,输入参数‘106‘,点击‘set‘按钮.

合约就被调用了.但是任然需要挖矿来确认.继续运行这个命令:
    miner.start(3); admin.sleepBlocks(1); miner.stop();

等到挖矿完成,我们可以在浏览器的Remix中看到合约的set()函数的运行结果.
点击‘get‘按钮,获取SimpleStorage合约中‘storeddata‘的值,可以看到我们获取到的结果是‘106‘,说明我们的合约没有问题.
另外‘multiply‘,大家可以自行测试.

在私有链中部署智能合约

首先创建truffle项目,依次输入以下命令:
    mkdir SimpleStorage
    cd SimpleStorage
    truffle init
以上命令创建并初始化truffle项目,在第4章中有说明, 这里不在重复.

把Remix中的SimpleStorage.sol保存到SimpleStorage/contracts目录中.

增加SimpleStorage的部署
在migrations中增加部署SimpleStorage的功能.在第四章中曾经详细介绍Migration以及合约的部署.这里直接提供代码.  打开migration/2_deploy_contracts.js, 修改为:
var ConvertLib = artifacts.require("./ConvertLib.sol");
var MetaCoin = artifacts.require("./MetaCoin.sol");
var SimpleStorage = artifacts.require("./SimpleStorage.sol")

module.exports = function(deployer) {
  deployer.deploy(ConvertLib);
  deployer.link(ConvertLib, MetaCoin);
  deployer.deploy(MetaCoin);
  deployer.deploy(SimpleStorage);
};
编译
    cd SimpleStorage
    truflle compile

编译之后,我们开始把合约SipleStorage部署到我们的私有链中:
用我们第二章中的方法启动节点:
    > geth --datadir ./data/00 --networkid 314590 --ipcdisable --port 61910 --rpcport 8200 console
节点启动成功后,我们执行部署合约的命令.

    cd SimpleStorage
    truffle migrate

我靠,什么鬼意思...他妈的执行失败,显示下面的信息.
    Error: Invalid JSON RPC response: ""
        at Object.InvalidResponse (/usr/local/node-v6.10.2-linux-x64/lib/node_modules/truffle/node_modules/web3/lib/web3/errors.js:35:16)

[image023]

查看大量资料后,发现在部署合约到私有链时,需要要注意以下几点:

    1) geth启动节点的时候,必须带有--rpcapi选项,并且选项的值必须包含有:"web3", "net", "eth"这3个设置,另外为了保证rpc为启用,还应该带有"--rpc"等一系列相关的参数.

    2) 注意SimpleStorage项目目录中:SimpleStorage/truffle.js(项目的配置文件),关于"rpcport"的配置必须要与启动节点时,设置的端口号一致.
        module.exports = {
          networks: {
            development: {
              host: "localhost",
              port: 8545,
              network_id: "*" // Match any network id
            }
          }
        };
        我们需要把prot: 8545,修改为geth启动节点时设置的:8200

    3) 启动节点后,节点中默认的账户是被锁定的,无法执行部署合约的操作,需要调用下面的命令解锁账户:

        > personal.unlockAccount(eth.accounts[0],"password", 1000*60*20)

        第一个参数是账户地址.
        第二个参数:账户密码.
        第三个参数:账户解锁持续的时间, 以毫秒为单位,这里这样只是为了更方便的设置以分钟为单位(20分钟)
    我们把账户解锁持续时间稍微设置久一点,以免在部署的过程中,账户突然被锁定,导致意外的出现.

有了以上3个需要注意的地方,我们重新执行部署:

调整启动命令后,用下面的命令启动:
    > geth --datadir ./data/00 --networkid 314590 --ipcdisable --port 61910 --rpc --rpcapi ‘web3,eth,net‘ --rpccorsdomain ‘*‘ --rpcport 8200 console
    INFO [06-24|19:15:09] Starting peer-to-peer node               instance=Geth/v1.6.1-stable-021c3c28/linux-amd64/go1.8.1
#####....这里是很多书输出的日志信息....#####
    Welcome to the Geth JavaScript console!

    instance: Geth/v1.6.1-stable-021c3c28/linux-amd64/go1.8.1
    coinbase: 0x5fba50fce50baf0b8a7314200ba46336958ac97e
    at block: 41 (Sat, 24 Jun 2017 00:34:18 CST)
     datadir: /home/zl/Documents/private-chain/data/00
     modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
#####....启动完成,我们执行解锁账户unlock.....#####
    > personal.unlockAccount(eth.accounts[0], "ko2005", 20*(60*1000))
    true

私有网络节点的操作完成后,回到刚才SimpleStorage所在的命令行, 执行部署命令:
    > truffle migrate
    Using network ‘development‘.

    Running migration: 1_initial_migration.js
      Deploying Migrations...

可以看到,执行的输出结果与上一次不太一样了,好像离成功更近了.我们继续等一会儿.
[过了一分钟,还是没反应,先来放一首歌....]
[....等啊等....
[草它大爷的,等了快10分钟还是没有反应....]
[.....好像不按我们的套路来啊.....]
[........]

突然想起来一件事,我们在之前的私有网络中,用户之间转账都是要通过挖矿来确认的...
这尼玛..
回到刚才启动的私有网络命令行,执行挖矿:

    > miner.start(3); admin.sleepBlocks(1); miner.stop();
    INFO [06-24|19:16:43] Updated mining threads                   threads=3
    INFO [06-24|19:16:43] Starting mining operation
    INFO [06-24|19:16:43] Commit new mining work                   number=42 txs=1 uncles=0 elapsed=3.079ms

这行命令的意思: 启动挖矿程序,在挖到一个区块之后,停止挖矿.

[挖矿又是一个耗时间的操作...]

一会儿,私有网络所在的命令行挖矿成功,并输出内容:
一会儿, 部署合约的命令行输出内容:
      Migrations: 0xbc14f4725810403de4b31cdaf00a84e2ea7252dc
    Saving successful migration to network...

同时,查看私有网络的命令行,输出内容:
    > miner.start(3); admin.sleepBlocks(1); miner.stop();
    INFO [06-24|19:16:43] Updated mining threads                   threads=3
    INFO [06-24|19:16:43] Starting mining operation
    INFO [06-24|19:16:43] Commit new mining work                   number=42 txs=1 uncles=0 elapsed=3.079ms
    INFO [06-24|19:32:05] Successfully sealed new block            number=42 hash=de460c…aefbfb
    INFO [06-24|19:32:05] ?? mined potential block                  number=42 hash=de460c…aefbfb
    INFO [06-24|19:32:05] Commit new mining work                   number=43 txs=0 uncles=0 elapsed=2.730ms
    true
    > INFO [06-24|19:32:06] Submitted transaction                    fullhash=0xdf799ee7e5981011125dca4e5edcdbbf344dfbc81f466be7e69ba266572e2724 recipient=0xbc14f4725810403de4b31cdaf00a84e2ea7252dc

看这命令行输出"Submitted transaction",意思又的让我们挖矿确认吧, ,老套路,我们懂, 再挖,命令行我就不打出来了.跟之前一样的.
又等一会儿..

SimpleStorage命令行输出:
    Saving artifacts...

区块链网络命令行输出:
    > INFO [06-24|19:49:31] Submitted contract creation              fullhash=0xb399d73bb5ed563e4acf6ad0b8ffc5e28ef114a1643df90b6218e568473c0b66 contract=0x6853da42bccdee332f180be1dd1e118e825ac57e

这尼玛套路我们算是明白了,但这尼玛套路也太长了吧. 用周星驰的话来说就是:
我走过最长的路,就是这尼玛以太坊的套路....

反正我就这样一直走下去,最后总算是部署成功了,这就是我的执行结果:

合约部署成功后,我们尝试执行以下合约..今天就到这里吧...
这一章我们了解了以下几点:
    1) 基于浏览器端的solidity ide "Remix",以及如何搭建本地版本的"Remix"
    2) Remix 的大概使用方法
    3) 使用Remix部署智能合约到Debug网络中
    4) 如何创建一个简单的truffle 项目, 进行项目创建,编写部署代码, 编译..到执行部署的详细流程.
    5) 在部署智能合约到以太坊私有链时,需要注意的许多地方.
    6) 我们成功部署了一个智能合约在以太坊私有链中....

下一次我们讲一下如何在私有链中调用已经部署好的智能合约....
工作忙的时候,更新会稍慢,大家敬请期待..
时间: 2024-10-12 18:19:32

区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署的相关文章

区块链入门(4)Truffle创建项目,编译,及项目部署

上一章的结尾说这一次要讲编写一个智能合约部署到测试网络集群中,并进行交易,但我自己越看越觉得内容挺多的.先讲下truffle的项目创建,编译和部署的问题,然后再做上面说的事情吧. truffle是一套以太坊的开发测试框架, 使用solidity开发语言,类似于javascript. truffle的安装在第一篇文章中已经讲过.下面直接开始进入truffle的使用. 使用truffle可以很简单的创建项目: mkdir truffle-project truffle init 这个命令只会创建一个

区块链入门与去中心化应用实战

第1章 课程简介与学习安排 本章主要介绍为什么要开设这门课,课程目标是什么,谁适合学习这门课以及学习这门课需要哪些要求,然后详细介绍本课程要讲的主要内容,希望通过这章的学习,可以让大家对课程有一个整体的,清晰的了解. 第2章 区块链技术的核心概念和原理 本章会讲解比特币的由来,比特币概念及原理,如:账本如何验证,如何确定账户所有权问题,如何保护用户隐私,什么是工作量证明(POW),如何形成权威账本等,通过这部分内容的学习,大家基本上可以告别纯小白阶段了,无论是和别人聊区块链技术,或者是要继续深入

区块链入门学习资源

众所周知去年比特币大涨,很多人都投入到挖矿或者投资比特币上,而比特币的底层技术是区块链.所以导致最近区块链技术火热,区块链声称能够改变未来的互联网,让其能够成为一个能够传递价值的互联网.很多小伙伴也纷纷想投入到区块链的学习,虽然这是一项08年就提出的技术,可是到近年来才开始被广泛受到关注.所以网络上的学习资源也参差不齐,我这里就介绍一些我看到过的,而且还不错的入门学习资源.后续如果看到一些好的学习资源也会在这里更新. 如果英文好的话还可以不局限于国内的资源,国外的学习资源更丰富,还有教学视频啥的

区块链数字资产交易系统项目开发的优势

随着区块链技术的高速发展,国内及全球的区块链数字资产交易系统项目(+V信ruiec2723)短缺的现象日益突显,然而在此之中,交易平台的安全性成为了广大投资者的重要关注点.相对于其它的投资,区块链交易系统平台更加注重平台的安全性建设,同时需要打造高端的风控体系.为区块链数字资产的交易提供一个安全.可靠.方便.易用的交易环境.区块链资产交易系统项目的技术优势:1.区块链技术改变了很多行业的发展,目前很多人对区块链技术的认识都只局限于数字资产,对于区块链技术也有一种误解.区块链技术不只限于数字资产,

区块链入门教程以太坊源码分析fast sync算法一

区块链入门教程以太坊源码分析fast sync算法一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上.this PR aggregates a lot of small modifications to core, trie, eth and other packages to collectively implement the eth/63 fast synch

以太坊私链与智能合约部署学习(博主修正篇)—— 第一篇

以太坊(Ethereum)自2017年5月诞生以来,发展迅速.作为了一个小白,博主初步打算上个车,过个瘾.那什么是以太坊?请参看度娘的解释(https://baike.baidu.com/item/%E4%BB%A5%E5%A4%AA%E5%9D%8A/20865117?fr=aladdin). 事物是个新事特,也是个好东西,但资料不多,所以小白博主也只能慢慢找寻资料,慢慢记录自己填坑的过程.  第一篇的主题是:以太坊私链的创建:)    一.配置环境与软件安装 1.安装geth 以下的资料来自

区块链入门教程

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来. 可是,简单易懂的入门文章却很少.区块链到底是什么,有何特别之处,很少有解释. 下面,我就来尝试,写一篇最好懂的区块链教程.毕竟它也不是很难的东西,核心概念非常简单,几句话就能说清楚.我希望读完本文,你不仅可以理解区块链,还会明白什么是挖矿.为什么挖矿越来越难等问题. 需要说明的是,我并非这方面的专家.虽然很早就关注,但是仔细地了解区块链,还是从今年初开始.文中的错误和不准确的地方,欢迎大家指正. 一.区块链的本质

区块链入门视频?国外视频帮你快速入门了解区块链!!!

还不知道区块链是什么呢~快来看看老外帮你5分钟入门区块链!!!详情可以看视频:潮流国外新鲜科技视频 更多好玩好看充满科技感富有知识的现代国外视频请关注新浪微博 区块链技术如今非常的流行,但是,区块链到底是什么呢? (图片素材取自新浪微博:潮流国外新鲜科技视频  下同) 于是,这个视频告诉我们以下几个问题: 好奇宝宝们,我们开始吧! 区块链怎么来的呢?看下面(后面还有一小段历史,就不截图了): 接着图片说: 区块链技术最早是在1991年由一群研究人员研发并用来给数字化文档打时间戳,以使得这些文档不

区块链入门01-准备

过完春节,发现区块链火的不行了,得恶补一下区块链知识作为储备.于是看了一大堆教程,开始做准备. 先定一个目标: 1.要做什么样的项目,使用区块链能给项目(或某个功能)带来什么样的变革. 这个早就想好了,用区块链改进公益项目.得想好这个才能行动,以后写白皮书也好写嘛. 2.使用什么技术或框架? 恶补了一些比特币和以太坊的知识,发现大家都在用以太坊来作为应用平台研发.举个例子,以太坊就好像安卓,基于以太坊开发的应用就好像APP一样. 以太坊有很多客户端.我选了基于JS语言的Mist客户端,Mist是