智能合约开发(1)—— 入门

由于使用了ubuntu1804,导致入门路上踩坑无数,好不容易才配好了环境,还不知道以后会不会出问题,反正暂时是能用了。这里主要参考这个教程,提供了很大帮助。当然这个教程也和实际环境不一样,因此这里还参考了这个 ,主要是针对2018最新版的truffle和以前的不同而引起的各种问题。
本文主要是记录一些学习感悟,并不详述整个入门过程,仅供自己学习使用。

1.第一个contract(合约)程序

pragma solidity ^0.4.4;

contract HelloWorld {
  function sayHello() returns (string) {
    return ("Hello World");
  }
}

其中

pragma solidity ^0.4.4;

该句为首句,指明使用的solidity版本,不同版本的solidity可能会编译出不同的bytecode。^代表兼容solidity ’‘0.4.4~0.4.9的版本。在命令行输入

npm solc --version

可以查看自己的soldity版本(我是3.5.2,和这里说的完全不一样。。。)暂时先运行着,后面出问题在说。

contract HelloWorld {
  function sayHello() returns (string) {
    return ("Hello World");
  }
}

contract 关键字类似于其他语言中较常见的class。这里声明后即内置了开发智能合约所需 功能(类似于继承功能),可以相当于class HelloWorld extends Contract.。
内部函数就比较清晰了,注意要传入或传出的参数值,要提前声明参数或回传值的类型。

2.编译
输入truffle compile就行了

记住部署之前一定先把testrpc跑起来

3.部署
这里不得不说一句,2018版的truffle init 以后migrations文件夹里面不会自带2_deploy_contracts.js文件了,这里我的方法是自己建了一个,输入truffle migrate后也确实执行了这个这个文件,和以前一样
在2_deploy_contracts.js中需要输入的代码如下

var HelloWorld = artifacts.require("HelloWorld");
module.exports = function(deployer) {
  deployer.deploy(HelloWorld);
};

使用 artifacts.require 来取得准备部署的合约。使用 deployer.deploy 语句将合约部署到区块链上。这部HelloWorld 是 contract的名称而不是文件名。因此可以用该语法读入任一 .sol 文件的任一合约。
部署完成后,可以看到testrpc那边窗口有反应了

4.与合约互动
执行truffle console进入truffle提供的命令行工具,可以用JavaScript来和刚刚部署的合约互动。
然后输入

扫描二维码关注公众号,回复: 2841972 查看本文章
HelloWorld.deployed().then(instance => contract = instance)

这里 truffle console 中预载了truffle_contract 函数库, 以方便部署到区块链上的合约。
这边使用 HelloWorld.deployed().then 语句来取得 HelloWorld 合约的 Instance(实例),并存到contract变量中,以方便后续的调用。(不会JavaScripts,只能边看边学了)
然后可以与合约互动

contract.sayHello.call()

这里也可以不用call(),truffle-contract提供call() 来读取只读的数据,这样可以不用提供gas。因此如果遇到的操作需要向区块链写入数据,就不能用call语句了。

5.加入新方法

  function echo(string name) constant returns (string){
    return name;
  }

在这里新添的echo方法中传入了一个name参数。我们也为echo方法加一个constant 声明,表示调用这个方法并不会改变区块链的状态。如此以来,通过truffle-contract 来调用该方法时,会自动xuanyongcall来呼叫,也不需要额外提供gas。
试下效果
先编译 truffle compile
在重部署 truffle migrate --reset
进入命令行 truffle console
取得实例 HelloWorld.deployed().then( instance => contract = instance)
调用新方法 contract.echo("mark")
‘mark’
可以看到我们不需要使用call()也可以呼叫,系统会自动使用

这里有一点是原教程中专门提到的,说这里如果我们用 truffle migrate的话,会提示

$ truffle migrate
Using network 'development'.
Network up to date.

(确实是),这里写着现在网络上的合约都已经是最新的,但实际上刚刚程序中新增的方法并没有更新到内存块链上。要更新内存块链上已部署的程序,需要改写migration中的脚步,但暂时不涉及。而这里我们开发用的内存块链是怎么改都没关系的restrpc,因此可以用truffle migrate --reset再重新部署一次。

到这里入门就结束了,算是大致上感受了智能合约开发的一些主要环境和特点,后面的学习就得更加系统的了解了。

猜你喜欢

转载自blog.csdn.net/weixin_42595515/article/details/81778231