实训1 运行第一个智能合约

题目描述

编写一个HelloWorld合约,合约包含一个string变量、一个get方法和一个set方法。

  • 构造函数初始化该变量为”Hello world!”
  • 提供get方法获取变量string的值
  • 提供set方法设置string的值

示例1

编译合约,创建私钥用户,通过合约IDE部署合约。

示例2

部署合约后,直接调用get方法,获得string的返回值为"Hello world!"。

示例3

调用set方法,设置string为"123",获得交易回执,回执状态为0x0(成功)。

调用get方法,获取string的值,显示为"123"。

解法

伪代码

pragma solidity >=0.4.25 <0.6.11;
contract HelloWorld {
    string a;
    constructor;
    getter;
    setter;
}

Solidity

pragma solidity >=0.4.25 <0.6.11;

contract HelloWorld {
    string name;

    constructor() public {
        name = "Hello, World!";
    }

    function get() public view returns (string memory) {
        return name;
    }

    function set(string memory n) public {
        name = n;
    }
}

操作图示

示例1

通过合约IDE部署合约。

部署前,查看块高为0。

../../../_images/block_0.png

合约IDE中创建合约,点击“编译”按钮编译合约,点击“部署”按钮部署合约。若不存在私钥用户,则在“合约管理-测试用户”中创建一个新的私钥用户。

../../../_images/deploy.png

部署后,合约IDE中下方将显示合约的地址。

部署后,查看块高为1,部署合约的操作产生了一个新区块。

../../../_images/block_1.png

示例2

部署合约后,直接调用get方法,获得string的返回值为"Hello world!"。

调用前,查看块高为1。

../../../_images/block_1.png

点击合约调用,选中“get”方法,点击“确定”进行调用

../../../_images/getter.png

“get”方法返回了合约的string值

../../../_images/getter_result.png

调用“get”方法后,查看块高为1。由于“get”方法是viewconstantpure方法,即只查询交易,操作未产生新区块。

../../../_images/block_1.png

示例3

调用set方法,设置string为"123",获得交易回执,回执状态为0x0(成功)。

调用get方法,获取string的值,显示为"123"。

调用前,查看块高为1。

../../../_images/block_1.png

点击合约调用,选中“set”方法,选中一个私钥用户(默认会自动选中一个),在输入框中填入参数“123”,点击“确定”进行调用。

../../../_images/setter.png

“set”方法修改了链上的值,返回了一个交易回执,交易回执中状态为“0x0”代表交易成功了。

../../../_images/setter_result.png

同样的方法调用“get”方法,返回了“123”,代表合约中保存的string值为“123”,刚才的“set”操作成功了。

../../../_images/get_after_set.png

调用“set”方法后,查看块高为2。由于“set”会修改合约中的值,即修改链上账本,会产生一笔交易并返回交易回执,因此产生了一个新区块。

../../../_images/block_2.png