以太坊简单的智能合约“Hello World”的部署以及运行

一、环境准备

在开始正式编写简单的智能合约之前,需要搭建好的环境如下:

①安装Geth
   下载地址:https://geth.ethereum.org/downloads/ 

②安装Solidity
 刚开始学习的阶段可以直接使用基于浏览器的Remix,来编写、编译智能合约。

二、正式开发

1. 启动环境(打开一个命令行窗口执行如下代码)

    geth是一个以太坊客户端,利用geth启动一个以太坊(开发者)网络节点。

geth --datadir "G:\eth\devchain" --dev console

命令参数说明:

           --datadir 后面的参数是区块数据及密钥存放目录。

(注:第一次运行该命令时,会自动在指定目录下创建一个文件夹来存放数据;若直接键入 --datadir test,则第一次运行该命令时会在当前目录下创建一个test文件夹来存放数据)

   注意:若添加参数 --allow-insecure-unlock,不需要解锁账户,否则还需要解锁账户,即如下步骤:

personal.unlockAccount(eth.accounts[0],"zhangqingqing")

         --dev 启用开发者网络(模式),开发者网络会使用PoA共识机制,默认预分配一个开发者账户并且会自动开启挖矿。 

     在启动一个开发者网络节点进入JavaScript控制台之后,默认分配了一个开发者账户,并且会自动开启挖矿。此时查看账户时,该账户是有余额。

     如果在进入开发者模式之后,开启挖矿的话,你会发现一个小问题:返回null,但是通过查看此刻的区块数目(eth.blockNumber)又是在增加的。

2. 查询账户(默认分配的开发者账户)

> eth.accounts

 

3. 查看用户余额

   因为后边部署智能合约的时候需要消耗gas。如果用户没有余额,是没有办法进行后续的交易以及调用、部署智能合约的。

> eth.getBalance(eth.accounts[0])

 

4. 创建新账户

> personal.newAccount("student")

5. 查看新账户的余额

> eth.getBalance(eth.accounts[1])
0

6. 转账(给新账转1个以太币)

eth.sendTransaction({from:'0x41f7c9eb9a81b025205fc6c21734b69fbfcc7758',to:'0x4d6315aec666ef95154ee254020f94a484dfdc19',value:web3.toWei(100,"ether")})

注意:web3.fromWei与web3.toWei用法的区别?

①web3.fromWei是把wei转换为其他种类的以太坊单位,如wei转换为ether(以太币)

> web3.fromWei("1000000000000000000", "ether")
"1"

②web3.toWei是把以太坊单位(包含代币单位)转为 wei

> web3.toWei("1", "ether")
"1000000000000000000"

如下图表示,转账已成功!!!

 此时,转账成功后,查看新账户的余额:

> eth.getBalance(eth.accounts[1])

或者直接查看以太币的个数:

> web3.fromWei(web3.eth.getBalance(eth.accounts[1]),"ether")

7. 部署以及运行智能合约

      刚开始编写智能合约的时候,可以使用在线编译器Remix。即不用下载,又便于使用。在线编译器Remix的地址为:https://remix.ethereum.org/

 ①新建hello.sol文件,编写智能合约

②编译智能合约

  编译成功之后,查看Compilation Details,并找到WEB3DEPLOY(已经编译好的合约内容)(红色框住的部分)复制到编译器里边,将其中的

var_greeting="Hello World"; 

var _greeting = "Hello World";
var helloContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_greeting","type":"string"}],"name":"setGreeting","outputs":[],"payable":true,"type":"function","stateMutability":"payable"},{"constant":true,"inputs":[],"name":"getGreeting","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"},{"inputs":[{"name":"_greeting","type":"string"}],"type":"constructor","payable":true,"stateMutability":"payable"}]);
var hello = helloContract.new(
   _greeting,
   {
     from: web3.eth.accounts[0], 
     data: '0x6060604052604051610362380380610362833981016040528080518201919060200150505b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10607157805160ff1916838001178555609f565b82800160010185558215609f579182015b82811115609e5782518260005055916020019190600101906082565b5b50905060c6919060aa565b8082111560c2576000818150600090555060010160aa565b5090565b50505b5061028a806100d86000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063a413686214610047578063fe50cc721461009d57610042565b610002565b61009b6004808035906020019082018035906020019191908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090909190505061011d565b005b34610002576100af60048050506101ce565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561010f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061016c57805160ff191683800117855561019d565b8280016001018555821561019d579182015b8281111561019c57825182600050559160200191906001019061017e565b5b5090506101c891906101aa565b808211156101c457600081815060009055506001016101aa565b5090565b50505b50565b602060405190810160405280600081526020015060006000508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561027b5780601f106102505761010080835404028352916020019161027b565b820191906000526020600020905b81548152906001019060200180831161025e57829003601f168201915b50505050509050610287565b9056', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

       仔细观察上面的代码,Remix帮我们将代码转成了EVM(以太坊虚拟机)可识别的样子,也就是将Solidity代码编译成web3的版本,其中也帮我们估算好了gas的金额,当我们执行这段合约时会自动扣掉我们余额中相应的数值作为gas费用。

③部署以及运行智能合约

将已经在编译器中修改好的内容粘贴到Geth JavaScript console.

稍等一会儿,直至出现Contract mined! 表示合约已经部署成功!!!

        其中,最后打印出来的address是合智能合约的账户地址transactionHash是交易号(这在以太坊中也被认定为是一笔交易,所以我们要给以太坊gas)

④调用智能合约(以及在此期间可能遇到的问题)

> helloworld.greet()

改变greeting的值:

因为改变greeting的值时,是在修改合约的内容,需要进行交易,所以在设置greeting值的时候,调用该合约的用户需要支付Gas.

支付Gas,还是出现错误,是因为,这是一笔交易,交易之前是需要解锁账户的。

> personal.unlockAccount(eth.accounts[1],"student")
> hello.setGreeting('hello',{from:eth.accounts[1], gas:4700000})

交易成功之后,可以查询到交易信息:

> eth.getTransactionReceipt('交易号')

   此时,重新调用greet函数时,返回的值即刚才修改以后的值。

> helloworld.greet()

查看一下gas消耗:(此时已经不足以1ether)

发布了83 篇原创文章 · 获赞 63 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/zqq_2016/article/details/103050801