1.首先了解了以太坊及以太坊智能合约概念
2.了解编程语言solidity语言
3.调试部署工具Remix
4.下载并熟悉钱包工具Metamask,属于chorm的 一个插件
5.了解以太坊浏览器
6.跑通一个例子——智能合约的hello world
1.1以太坊的概念:
以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台。它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。以太坊平台对底层区块链技术进行了封装,让区块链应用开发者可以直接基于以太坊平台进行开发,只要专注于开发应用本身逻辑的智能合约,这样就可以大大降低开发难度。
1.2 以太坊智能合约概念:
将法律条文写成可执行代码。让法律条文的执行中立化,这个理念和区块链上的程序可以不被篡改、不被干预(只有有人触发交易,它将自动执行)的执行不谋而合,因此区块链引入了这个概念。
智能合约现在的主要编程语言是 Solidity 和 Vyper ,Solidity 更为成熟一些。本文基于solidity开发。有点类似java语言。
pragma solidity >=0.4.22 <0.6.0;
// 用contract 关键字定义一个合约
contract Counter {
uint counter;
function count() public {
counter = counter + 1;
}
}
下面介绍两种实现的方法。第一种是本地基于终端上实现的。第二种是使用 Remix -Solidity IDE来实现的。
先介绍第一种
4.1开发环境搭建
第一步先安装brew。brew 是 Mac 下的包管理工具,和 Ubuntu 里的 apt-get 类似。为了方便接下来安装geth
[在这里插入图片描述](https://img-blog.csdnimg.cn/
第二步安装geth。geth 是一个以太坊客户端,现在利用 geth启动一个以太坊(开发者)网络节点。
具体代码:
brew tap ethereum/ethereum
brew install ethereum
第三步启动环境
geth --datadir testNet --dev console 2>> test.log
第四步 开始编写合约
部署智能合约需要一个外部账户,我们先来看看分配的开发者账户,在控制台使用以下命令查看账户:
> eth.getBalance(eth.accounts[0])
开发者账户因余额太多,如果用这个账户来部署合约时会无法看到余额变化,为了更好的体验完整的过程,这里选择创建一个新的账户。
> personal.newAccount("jianghuiwen")
查看当前用户
eth.accounts
给新账户转账
我们知道没有余额的账户是没法部署合约的,那我们就从默认账户转 1 以太币给新账户,使用以下命令:
eth.sendTransaction({from: '0xa6050f3adb3e65a89644dfd14f965c4993f2db45', to: '0x45ee7ffdac3041e43e3292b4e9808bb59e4bb232', value: web3.toWei(1, "ether")})
from是开发者的账户,to是我们新建用户的账户。
再次查看我们刚刚新建的账户,发现转账成功。
我们输入,可以查看交易详情
eth.getTransaction('0x125851b2cb2d00fff3877cb228c1c10027665b5383bd9116b070bdd992fdec6f')
解锁账户
在部署合约前需要先解锁账户(就像银行转账要输入密码一样),使用以下命令:
“jianghuiwen” 是之前创建账户时的密码
解锁成功后,账户就准备完毕啦,接下来就是编写合约代码。
代码如下:
pragma solidity ^0.4.0;
contract hello{
string greeting;
function hello(string _greeting) public{
greeting = _greeting;
}
function say() constant public returns(string){
return greeting;
}
}
我们定义了一个名为 hello 的合约,在合约初始化时保存了一个字符串(我们会传入 hello world),每次调用 say 返回字符串。
特别注意我们要保证setting里面使用的版本与我们代码版本是一致的,这是我第一次运行时遇到的问题。
没问题后我们点击Details
弹出的对话框中找到 WEB3DEPLOY 部分,点拷贝,粘贴到编辑器后,修改初始化字符串为 hello world。
var _greeting = "hello world" ;
var helloContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","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[4],
data: '0x6060604052604051610250380380610250833981016040528080518201919060200150505b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10607157805160ff1916838001178555609f565b82800160010185558215609f579182015b82811115609e5782518260005055916020019190600101906082565b5b50905060c6919060aa565b8082111560c2576000818150600090555060010160aa565b5090565b50505b50610178806100d86000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063954ab4b21461003c57610037565b610002565b346100025761004e60048050506100bc565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b602060405190810160405280600081526020015060006000508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101695780601f1061013e57610100808354040283529160200191610169565b820191906000526020600020905b81548152906001019060200180831161014c57829003601f168201915b50505050509050610175565b9056',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
第一行传入需要的,第六行代表在操作的账户
拷贝回 geth 控制台里,回车后,看到输出如:
表示部署成功了
最后我们跑通例子就可以了
第二种方法 是基于 Remix -Solidity IDE来实现。https://remix.ethereum.org/
第一步:
在plugin manager中添加编译和部署插件
第二步
创建并编写合约代码
代码如下
pragma solidity >=0.4.22 <0.7.0;
contract Helloworld{
string _name;
function setName(string name) public{
_name = name;
}
function getName() constant public returns(string){
return _name;
}
}
第三步
编译合约代码
第四步
部署合约
1.JavaScript VM是选择在浏览器里面部署,最简单,不需要安装MetaMask都能运行。
2.Injected Web3是在以太坊主网部署,需要用MetaMask,选择都时候、部署都时候以及更改都时候都要收gas费。
3.Web3 Provider是在私有链上部署。
代码