使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署
目录
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]
博文作者:迦壹
博客地址:使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!
使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署的更多相关文章
- 区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署
在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity I ...
- 用Solidity在Truffle上构建一个HelloWorld智能合约
原文地址:石匠的blog Truffle的环境安装在前文已经整理,这次用Solidity在Truffle写一个HelloWorld以太坊智能合约,并在testrpc上进行测试.当前的软件版本信息如下: ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约
本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...
- 以太坊智能合约 Solidity 的常用数据类型介绍
目录 目录 1.数组 1.1.对数组的增删改查操作. 2.String.Bytes.Mapping的使用 3.Enums 和 Structs 的简单应用 4.Ether 单位和 Time 单位 5.A ...
- 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...
- 智能合约开发solidity编程语言开发一个以太坊应用区块链投票实例
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...
- 以太坊智能合约介绍,Solidity介绍
以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...
- Solidity 官方文档中文版 2_Ethereum 智能合约介绍
一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleStorage { uint storedDa ...
- Solidity 文档--第一章:智能合约入门
一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; f ...
- 智能合约语言Solidity教程系列2 - 地址类型介绍
智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...
随机推荐
- [Swift]LeetCode46. 全排列 | Permutations
Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- 破解第一课:NOP绕过登录界面
第一步 打开软件,任意输入密码,提示“用户密码错误还有2次机会” 第二步 OD载入软件,右键-----中文搜索引擎---智能搜索 按下CTRL+F,打开查找,输入“密码错误”,在结果中双击找到的结果 ...
- Python内置函数(44)——next
英文文档: next(iterator[, default]) Retrieve the next item from the iterator by calling its __next__() m ...
- Python内置函数(25)——getattr
英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must ...
- C++ gui程序附加dos输出窗口
C++ gui程序附加console qtcreator 1:在.pro文件中加入一句: CONFIG+= console 2:在运行设置里勾选在终端运行的选项 vs 1.新建gui项目 2.连接器( ...
- 第五章 服务容错保护:Spring Cloud Hystrix
在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能 ...
- [linux]CentOS 7 下安装 RabbitMQ
简介 RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件.RabbitMQ 服务器是用 Erlang 语言编写的,所以下面要安装 RabbitMQ 需要安装 Erlang. 一. ...
- 知识小罐头03(idea+maven+部署war包到tomcat 上)
自学的的小伙伴第一就要用maven!自学的的小伙伴第一就要用maven!自学的的小伙伴第一就要用maven! 重要的事说三遍!maven本质上,其实就是一种目录的格式,没有什么特别的地方!而且,你可以 ...
- Asp.Net SignalR - 持久连接类
持久连接类 通过SignalR持久连接类可以快速的构建一个即时通讯的应用,上篇博文已经我们创建一个owin Startup类和一个持久连接类来完成我们的工作,然后在Startup类的Configura ...