Solidity快速上手教程(一)

前段时间被Solidity 限制住手脚,发挥点儿主观能动性啃下它了,现在开贴教程。

不知道能写多少,有多少写多少。每个教程都有案例&作业,有兴趣就跟帖,大家互相提携。

萌新认证:HelloWorld_1.sol

这个合约我们只实现一个功能:声明一个字符串变量,然后赋值,然后能够输出它。

这里就不使用 platon-truffle 工具了,对萌新不友好,我们用以太坊在线编辑器 Remix 来实践。

// HelloWorld_1.sol

// 声明我们使用的 Solidity 版本,有些书说 ^ 表示使用最新版本,有些说表示向上兼容。
// 我们不管这些,只需要明白 ^0.4.26 是指使用 Soldity 的 0.4.26 版本,且不会用到 0.5.0 以上。
pragma solidity ^0.4.26;

// 每一个合约开头就这样,contract表示要写一个合约了,差不多是其他语言的class,
// 然后合约名 HelloWorld_1
contract HelloWorld_1{
    // 编码规范,这里用四个空格缩进
    //(当然也可以用一个 tab【不过有些人的 tab 是两个空格,我觉得不好看】)
    
    // 声明一个字符串变量 content,它的值是 HelloWorld
    string content = "HelloWorld";
    
    // 定义一个函数,用于输出 content 内容
    // 这里的 public 和 view 都是修饰符
    // public: 任何地址都可以调用该函数
    // view: 自由调用,只读取不改变合约状态
    function getContent() public view returns(string str){
        return content;
    }
}

现在我们把这个合约复制下来,粘贴到 Remix 里面去试试

Remix 会帮我们编译好,然后去左侧第四个图标进行部署(deploy)

选择 Injected Web3 表示连接到当前 MetaMask 所选择的网络环境,我目前的环境是PlatON测试网络,点击 Deploy → Confirm → MetaMask(点击确认)

点一下getContent,Remix会帮忙 call 然后就看到小字的 HelloWorld


课外作业

教程一结束了,课外作业是:部署一个合约,使得 getContent 函数输出的内容是 HelloHuman

我觉得单纯的课外作业并不能吸引注意力,因此浅浅社区设置节点奖学金,当然我没啥钱就对了,成功完成课外作业的同学瓜分 100 LAT 。

作业回帖格式如下:

1 个赞

打卡,中午尝试下

1 个赞

abi:[
{
“constant”: true,
“inputs”: [],
“name”: “getContent”,
“outputs”: [
{
“name”: “str”,
“type”: “string”
}
],
“payable”: false,
“stateMutability”: “view”,
“type”: “function”
}
]

合约地址:lat1n8xk63hu5tszw6rfqk0dmy4rzj5yjawhspt9j8

测试网没水了,找朋友要了几个辣条在主网部,不晓得搞对没 还挺好玩haha

1 个赞

作业验证结果

image

作业校验源码 - 基于Web3.js

var Web3 = require("../node_modules/web3/src/index");

const provider = "https://openapi2.platon.network/rpc";  // 定义provider,即PlatON节点的RPC端口
const web3 = new Web3(provider); // 创建web3的实例,这里命名为w3
const chainID = 210425;        // 定义PlatON主网ChainID


var abi = [
    {
        "constant": true,
        "inputs": [],
        "name": "getContent",
        "outputs": [
            {
                "name": "str",
                "type": "string"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    }
];

var contractAddr = '0x99cd6D46fca2e0276869059edd92a314a84975D7';//部署合约时的获取的地址
var lat1182966 = new web3.eth.Contract(abi, contractAddr); //LatticeX 用户——lat1182966

lat1182966.methods.getContent().call({}, function (error, result) {
    console.log(result);
});

\color{green}{恭喜完成挑战!}

奖学金发放倒计时启动!第一位完成挑战的选手已经诞生,奖学金瓜分倒计时开始,当前时间 2022年7月3日20点11分,72小时后关闭,即2022年7月6日20点11分。在此期间内完成的读者将会瓜分100LAT。

另外,论坛发帖建议

你这个发帖格式我建议改成这样:

``` 中间有换行,表示代码块,可以填充很多代码进来,方便复制,例如 ```

image

效果就是下图:

var a = 1;
console.log(a);

并且你复制出来的abi 文件存在双引号错误,你看

这是你的

image

我不好复制检查啦,下次注意哦,这里的双引号必须是半角(英文)双引号

这是我修改语法错误后的

image

叮咚!瓜分倒计时结束了。

等我私信你,bro

芜湖起飞,haha