使用 Browser-solidity 在 Go-Ethereum 上进行简单的智能合约部署

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
>[email protected] start /Users/lion/my_project/_eth/browser-solidity
> npm-run-all -lpr serve watch onchange

[serve   ]
[serve   ] > [email protected] serve /Users/lion/my_project/_eth/browser-solidity
[serve   ] > execr --silent http-server .
[serve   ]
[watch   ]
[watch   ] > [email protected] watch /Users/lion/my_project/_eth/browser-solidity
[watch   ] > watchify src/index.js -dv -p browserify-reload -o build/app.js
[watch   ]
[onchange]
[onchange] > [email protected] 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]

原文地址:http://blog.51cto.com/iceman123/2089547

时间: 2024-11-07 03:56:47

使用 Browser-solidity 在 Go-Ethereum 上进行简单的智能合约部署的相关文章

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

原文地址:石匠的blog Truffle的环境安装在前文已经整理,这次用Solidity在Truffle写一个HelloWorld以太坊智能合约,并在testrpc上进行测试.当前的软件版本信息如下: Truffle v4.1.11 (core: 4.1.11) Solidity v0.4.24 (solc-js) 项目创建 打开Mac的terminal终端,创建一个新目录,并truffle项目初始化. > mkdir HelloWorld > cd HelloWorld > truff

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

在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity Ide编写一份智能合约. 3) 在我们前面第1,2,3章中部署的私有网络节点集群中部署这个合约,并能够在不同的节点中调用这个合约. Remix,是一个Solidity开发语言的Ide, 它是一款运行在浏览器端的solidity ide,也是官方推荐使用的ide. 另外还有其它的solidiy ide,

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

智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试环境. 智能合约就是运行在以太坊上的程序.客户端可以通过Web3.js API调用智能合约,而智能合约本身又可以直接访问以太坊网络,也就是说,智能合约前面连接着客户端,后面连接着以太坊网络,起到了承前启后的作用,而且通过智能合约,可以让整个以太坊网络更灵活,可控性更强.其实智能合约的作用相当于微软O

智能合约从入门到精通:用Solidity开发一个“Hello World”

简介:上一章中我们聊到了智能合约的应用场景,在了解区块链技术目前的发展情况.智能合约的概念以及其应用场景之后,我们将在后续的文章中共同学习智能合约的编成语言.今天,我们就来简单地谈一谈用于编写智能合约的语言--Solidity语言. 那么,什么是Solidity语言呢?在前面的文章中我们反复提到过以太坊,以太坊做区块链2.0的典型代表,Solidity在以太坊中是撰写智能合约最受欢迎的语言,因此今天我们就和大家介绍一下这个作为智能合约开发中最主流的语言. Solidity是运行于Ethereum

solidity编写智能合约(入门)

一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } } 在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成

智能合约语言 Solidity 教程系列9 - 错误处理

这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 欢迎订阅区块链技术专栏阅读更全面的分析文章. 什么是错误处理 错误处理是指在程序发生错误时的处理方式,Solidity处理错误和我们常见的语言不一样,Solidity是通过回退状态的方式来处理错误.发生异常时会撤消当前调

使用Go语言与Ethereum智能合约进行交互

尽管最近出现了麻烦,但Ethereum仍然是区块链空间中实现智能合约最重要的系统,而且这种情况似乎不太可能很快改变. 在我看来,技术本身具有很大的潜力,从学术的角度来看是非常有趣的,但正如前面提到的问题,之前展示出来了很多问题,区块链技术,智能合约,特别是带有Solidity的Ethereum生态系统是非常不成熟的,而且也没有准备好的黄金时段/生产用例. 然而,这是学习和了解这种技术的一个很好的机会,能够在应用程序奔溃前提前做准备. 在我之前的一篇文章中,我创建了一个小型应用程序,其中包含一个简

智能合约从入门到精通:Solidity语法之内存变量的布局和状态变量的存储模型

简介:在前面我们已经讲过Solidity语言的一些语法内容,在矩阵元JUICE开放平台的JIDE开发时,一定要注意Layout in Memory和Layout of State Variables in Storage,即内存变量的布局和状态变量的存储模型.内存变量的布局(Layout in Memory) Solidity预留了3个32字节大小的槽位: 0-64:哈希方法的暂存空间(scratch space) 64-96:当前已分配内存大小(也称空闲内存指针(free memory poi

2018年以太坊智能合约开发语言Solidity最佳IDEs

Solidity是一种以智能合约为导向的编程语言.这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约. 理解它官方文档应该是学习Solidity的最佳来源:solidity.readthedocs.io 想在以太坊的网络上建立自己的加密货币吗?想拥有自己的初始代码产品吗?以下是您今天可以使用的最佳Solidity IDE. Remix IDE Remix IDE是基于浏览器的,并且集成了编译器.没有服务器端组件. 官网: https://remix.ethereum.orggi