您的位置:首页 > 编程语言 > Go语言

以太坊笔记 使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署

2018-01-22 10:54 1171 查看


转载自:https://mshk.top/2017/11/browser-solidity-go-ethereum-1-7-2/


目录

Contents [hide]
目录
1、基本概念
1.1、什么是智能合约?
1.2、什么是Solidity?
1.2.1、Solidity的语言特性

1.3、什么是 Browser-solidity?

2、Browser-solidity
的源码在哪里?
3、如何在本地安装 Browser-solidity?
4、使用 Browser-solidity
编译代码
4.1 将 Browser-solidity
编译后的合约部署到 Geth


1、基本概念

  上篇文章中,已经讲过 
Go-Ethereum
1.7.2
 如何安装及搭建以太坊私有链,这里就不多介绍。

  在本文讲解之前,先介绍以下几点基本概念。


1.1、什么是智能合约?

  智能合约是存储在区块链上的一段代码,它们可以被区块链上的交易所触发,触发后,这段代码可以从区块链上读取数据或者向区块链上写入数据。

  


1.2、什么是Solidity?

  Solidity 是 Ethereum 的一种契约型编程语言,运行在Ethereum虚拟机(EVM)之上。

  


1.2.1、Solidity的语言特性

  它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:
以太坊底层是基于帐户,而非UTXO的,所以有一个特殊的Address的类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个帐户)。
由于语言内嵌框架是支持支付的,所以提供了一些关键字,如payable,可以在语言层面直接支持支付。
存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定变量使用内存,还是区块链。
运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行。
最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。

  


1.3、什么是 Browser-solidity?

  
Browser-solidity
 是一个官方提供的一个基于浏览器的合约编译器,非常好用,而且build版本会紧跟最新的 
Solidity
 的
build 版本。但由于网络原因以及GFW的存在,有可能会另一部分人访问很慢,进而影响开发效率。

  可以直接在线使用,访问后面的地址:https://remix.ethereum.org

  


2、Browser-solidity 的源码在哪里?

  https://github.com/ethereum/browser-solidity

  


3、如何在本地安装 Browser-solidity?

  由于国内网络的GFW原因,以及在网络上访问会影响效率,推荐部署到本地开发。

下面的4行代码开始将
Browser-solidity
安装到本地。
➜ /Users/lion/my_project/_eth > git clone https://github.com/ethereum/browser-solidity ➜ /Users/lion/my_project/_eth > cd browser-solidity
➜ /Users/lion/my_project/_eth/browser-solidity git:(master) > npm install
➜ /Users/lion/my_project/_eth/browser-solidity git:(master) > npm run prepublish


  

  安装以后,通过以下命令启动
Browser-solidity

npm start


  

  启动后,控制台会输出如下信息:
➜ /Users/lion/my_project/_eth/browser-solidity git:(master) >npm start
> browser-solidity@0.0.0 start /Users/lion/my_project/_eth/browser-solidity
> npm-run-all -lpr serve watch onchange

[serve ]
[serve ] > browser-solidity@0.0.0 serve /Users/lion/my_project/_eth/browser-solidity
[serve ] > execr --silent http-server .
[serve ]
[watch ]
[watch ] > browser-solidity@0.0.0 watch /Users/lion/my_project/_eth/browser-solidity
[watch ] > watchify src/index.js -dv -p browserify-reload -o build/app.js
[watch ]
[onchange]
[onchange] > browser-solidity@0.0.0 onchange /Users/lion/my_project/_eth/browser-solidity
[onchange] > onchange build/app.js -- npm-run-all lint
[onchange]
[watch ] WS server listening on 58651


  

  然后打开浏览器,在地址栏输入:http://127.0.0.1:8080,可以看到以下效果:



  


4、使用 Browser-solidity 编译代码

  下面是一个简单的智能合约代码,输入任何数值,都加上2009。
pragma solidity 0.4.9;

contract mshkDemo {

function mshkadd(uint a) public returns (address, uint b) {
uint resutl = a+2009;
return (msg.sender, resutl);
}

}


    

  第一行是声明使用
solidity
合约的版本号,在0.4.9版本以前,声明版本号,在版本号前要加上^,如
pragma
solidity ^0.4.0
solidity
 中的智能合约是一种类似javascript的语言,所以在语法上很像。

  在本地打开
Browser-solidity
后,在右侧的
Settings
选项卡中,在下拉列表中,选择solidity的版本
0.4.9




  

  点击
Run
选项卡,设置好
Gas
limit
Gas Price
后,点击
Create
,能够创建一个测试实例,对代码进行调试。这时会在中间下面的窗口中,看到输出的信息。

  在
mshkadd
的右侧输入100,点击
mshkadd
,中间下面的窗口会继续出现新的信息,点击
Details
,能够看到输入的值和输出的值。



  

  点击
Compile
选项卡,然后点击
Publish
on
,会看到提示层,然后点击
Details
,可以看到发布后的内容。



  

  发布以后,在上图弹出的层中我们可以看到编译后,能够通过web3部署的代码在
WEB3DEPLOY
中,代码如下:
var browser_mshk_sol_mshkdemoContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"mshkadd","outputs":[{"name":"","type":"address"},{"name":"b","type":"uint256"}],"payable":false,"type":"function","stateMutability":"nonpayable"}]);
var browser_mshk_sol_mshkdemo = browser_mshk_sol_mshkdemoContract.new(
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000c57fe5b5b60e48061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ee64a56014603a575bfe5b3415604157fe5b60556004808035906020019091905050609e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6000600060006107d9840190503381925092505b509150915600a165627a7a7230582008b5b31ef21a9273b2728793378a837f0b7a4e7517a15041a358e33fbf45899e0029',
gas: '300000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})


  


4.1 将 Browser-solidity 编译后的合约部署到 Geth

  将上面的代码贴到
geth javascript console
中执行
> var browser_mshk_sol_mshkdemo = browser_mshk_sol_mshkdemoContract.new(
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000c57fe5b5b60e48061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ee64a56014603a575bfe5b3415604157fe5b60556004808035906020019091905050609e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6000600060006107d9840190503381925092505b509150915600a165627a7a7230582008b5b31ef21a9273b2728793378a837f0b7a4e7517a15041a358e33fbf45899e0029',
gas: '300000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
null [object Object]
undefined
> null [object Object]
Contract mined! address: 0xf5f6d56c1c480d9235a4e538f2f2888c683b168c transactionHash: 0xf6203401fd0fe2237b7e53c021622272e7a9aa10d578ac0660c9145e7e700753


from
表示调用智能合约的帐户,代码中取的是accounts[0]
data
是编译后的代码,你的代码越长,这块的字符串越多
gas
调用合约要扣除的gas单位,可以理解为以太币,gas和ether之间有个汇率,汇率受矿机的算率影响会有调整,在公网上,这些gas用于奖励给挖矿者
address
表示已经部署智能合约的帐户地址,智能合约也相当于一个帐户
transactionHash
的智能合约产生时的hash值,会永久保存到区块链条里面

  

  输入
browser_mshk_sol_mshkdemo
可以看到合约的一些信息
> browser_mshk_sol_mshkdemo
{
abi: [{
constant: false,
inputs: [{...}],
name: "mshkadd",
outputs: [{...}, {...}],
payable: false,
stateMutability: "nonpayable",
type: "function"
}],
address: "0xf5f6d56c1c480d9235a4e538f2f2888c683b168c",
transactionHash: "0xf6203401fd0fe2237b7e53c021622272e7a9aa10d578ac0660c9145e7e700753",
allEvents: function(),
mshkadd: function()
}


  

  然后通过
browser_mshk_sol_mshkdemo.mshkadd.call
调用
> browser_mshk_sol_mshkdemo.mshkadd.call(10)
TypeError: Cannot access member 'call' of undefined
at <anonymous>:1:1


出现
TypeError: Cannot access member 'call' of undefined
的错误,是因为我们没有挖矿,在之前的章节提到过,如果停止挖矿,是不能进行转帐和智能合约的部署。

  

  重新启动挖矿,调用合约,就可以输出正确的值了。
> miner.start()
> browser_mshk_sol_mshkdemo.mshkadd.call(10)
["0xbe323cc4fde114269a9513a27d3e985f82b9e25d", 2019]
> browser_mshk_sol_mshkdemo.mshkadd.call(550)
["0xbe323cc4fde114269a9513a27d3e985f82b9e25d", 2559]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: