目录

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.0solidity 中的智能合约是一种类似javascript的语言,所以在语法上很像。

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

  

  点击Run选项卡,设置好Gas limitGas 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 上进行简单的智能合约部署的更多相关文章

  1. 区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署

    在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity I ...

  2. 用Solidity在Truffle上构建一个HelloWorld智能合约

    原文地址:石匠的blog Truffle的环境安装在前文已经整理,这次用Solidity在Truffle写一个HelloWorld以太坊智能合约,并在testrpc上进行测试.当前的软件版本信息如下: ...

  3. 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约

    本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...

  4. 以太坊智能合约 Solidity 的常用数据类型介绍

    目录 目录 1.数组 1.1.对数组的增删改查操作. 2.String.Bytes.Mapping的使用 3.Enums 和 Structs 的简单应用 4.Ether 单位和 Time 单位 5.A ...

  5. 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...

  6. 智能合约开发solidity编程语言开发一个以太坊应用区块链投票实例

    智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...

  7. 以太坊智能合约介绍,Solidity介绍

    以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...

  8. Solidity 官方文档中文版 2_Ethereum 智能合约介绍

    一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleStorage { uint storedDa ...

  9. Solidity 文档--第一章:智能合约入门

    一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; f ...

  10. 智能合约语言Solidity教程系列2 - 地址类型介绍

    智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...

随机推荐

  1. grep的正则表达式结合的几个典型应用

    一 几个特殊的字符: ^ :只匹配行首  如^a 匹配以a开头的行abc,a2e,a12,aaa,...... example: grep "^a" //列出所有以a开头的行 $ ...

  2. Spring Boot 最核心的 25 个注解,都是干货!

    学习和应用 Spring Boot 有一些时间了,你们对 Spring Boot 注解了解有多少呢?今天栈长我给大家整理了 Spring Boot 最核心的 25 个注解,都是干货! 你所需具备的基础 ...

  3. IOS开发之尺寸

    在移动端或者前端开发中,UI图通常是带标注的,指定某个控件的长宽等属性,一般UI给的是68px,72px这样的样式,但是我们在开发过程中通常又并不是完全按照上面的标注去设置值,有时候需要将这个标注除以 ...

  4. 【T-SQL】系列文章全文目录(2017-06-26更新)

    本系列[T-SQL]主要是针对T-SQL的总结. SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]0 ...

  5. python3+ selenium3开发环境搭建-手把手教你安装python(详细)

    环境搭建 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器:没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个I ...

  6. requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?

    在五一节之前和一网友讨论前端技术时,对方提到vue.vue-route如果配合requirejs应用.当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复.本是一天 ...

  7. 我对SQL性能优化的看法,对我的文章有提议的欢迎评论!

    影响你的查询速度的原因是什么? 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索引,索引不合理 表数据过大没有有效的分区设计 数据库设计太2,存 ...

  8. SpringCloud中使用Hystrix

    1.  引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gate ...

  9. C#版 - 226. Invert Binary Tree(剑指offer 面试题19) - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - 2 ...

  10. TypeScript 素描 - 高级类型、迭代器

    /* 交叉类型,在TypeScrpt中是很特有的.所以值得认真学习 交叉类型是将多个类型合并为一个类型,这让我们可以把现有的多种类型叠加到一起成为一种 类型 交叉类型同时拥有 Person 和 Emp ...