区块链: 编译发布智能合约

什么是智能合约??

智能合约与平时的代码其实没有什么区别,只是运行于一个以太坊这样的分布式平台上而已。这个运行的平台,赋予了这些代码不可变,确定性,分布式和可自校验状态等特点。代码运行过程中状态的存储,是不可变的。每一个人,都可以开一个自己的节点,重放整个区块链,将会获得同样的结果(译者注:能控制所有节点都达到一致状态,就是所谓的共识)。

在以太坊中,每个合约都有一个唯一的地址来标识它自己(由创建者的哈希地址和曾经发送过的交易的数量推算出来)。客户端可以与这个地址进行交互,可以发送ether,调用函数,查询当前的状态等。

智能合约,本质上来说就是代码,以及代码运行后存储到区块链上的状态两个元素组成。比如,你用来收发ETH的钱包,本质上就是一个智能合约,只是外面套了一个界面。

 

这里我使用web3+solc实现在链上编译并发布智能合约。

版本很重要 solc 跟 web3 下面这两个版本亲测是可以的,再次说明其他版本不一定是这样的写法。

我看了在不同版本有些api可能已经干掉了,或者新增了某些api,或者方法的参数有变化,具体需要参考官方的文档。

"solc": "^0.4.25"   "web3": "^1.0.0-beta.34"
let Web3 = require('web3');
let solc = require("solc");
let fs   = require('fs');

 

实例web3对象

web3 = new Web3(new Web3.providers.HttpProvider("http://192.168.4.245:55450")); //http://192.168.4.245:55450是一个子节点
console.log("version: " + web3.version)//web3js的版本号

 

编译智能合约 

  let source = fs.readFileSync("./static/demo.sol", "utf8");
solc.loadRemoteVersion("v0.4.24-nightly.2018.5.9+commit.1e953355", function (err, solcV) {
    if (err) {
      console.log("error:" + err)
    }
    let cacl = solcV.compile(source, 1);//1 是优化 0 是不优化
    let abi = JSON.parse(cacl.contracts[':HEA'].interface);//在比较低级的版本中 是cacl.contracts['HEA'].interface 这样写的,如果这一块出现报错,请断点进去看是[':HEA']还是['HEA']
    let bytecode = cacl.contracts[':HEA'].bytecode; });//同上

这里的版本号:v0.4.24-nightly.2018.5.9+commit.1e953355,我看了源码 是要去这个地址找到你需要的solc bin 版本号。到时候在区块浏览器进行合约验证的时候要选择一致的版本号。➡️ https://github.com/ethereum/solc-bin/tree/gh-pages/bin

 

智能合约:demo.sol

pragma solidity ^0.4.0;

contract HEA {
    mapping (address => uint) public balances;

    function Token() {
        balances[msg.sender] = 1000000;
    }

    function transfer(address _to, uint _amount) {
        if (balances[msg.sender] < _amount) {
            throw;
        }

        balances[msg.sender] -= _amount;
        balances[_to] += _amount;
    }
}

 

部署到链上

    web3.eth.getAccounts().then(accountList => {
      console.log(accountList);
      web3.eth.personal.unlockAccount(accountList[0], "test001");//解锁
//发布智能合约
new web3.eth.Contract(abi).deploy({ data: '0x' + bytecode, arguments: [], }).send({ from: accountList[0], gas: 1500000, gasPrice: '30000000000000' }, function (error, transactionHash) { console.log("error:" + error); console.log("send transactionHash:" + transactionHash); }) .on('error', function (error) { console.error(error) }) .then(function (newContractInstance) { var newContractAddress = newContractInstance.options.address console.log("Contract Address:" + newContractAddress); }); res.send(data); res.end(); })

 

控制台输出

server start port:8001
version: 1.0.0-beta.34
[ '0x0AafbD348BC902C9565623f13505D5A63ddfb531',
  '0x0286A797eff130b89771EC81907F7bC8905E8Ed8',
  '0xF13838C722EF7d417cF17B82b34F9cB2e0C0f514' ]

send transactionHash:0x430dc2d984005a25c63f69aeedfbb4a25a7c672b7fcb005cbe476eae92612c6c
Contract Address:0xD9D13119012BCCA9926e1bE50CaBa5354F419A45

拿着Contract Address到自己部署到区块浏览器上查,验证并发布源代码。

划重点:在这里下面的选择版本号 要跟代码中编译合约的时候选择的版本号要一致。

疑惑:我选择比较低级的版本编译,版本号也对的可是还是验证失败,后来选择了 0.4.24版本的 就可以了,迷~

结果:

 

这里只是简单介绍了很简单智能合约的编译以及部署验证,在发币的智能合约不能使用代码的形式进行编译和发布部署。

下面这篇文章将介绍如何部署一个 remix 对智能合约 页面化的发布部署以及测试智能合约。

 使用remix发布部署 发币 智能合约 

 

 

参考链接

以太坊开发入门

solidity

web3js

solc

 

此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。

如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。

posted @ 2018-12-12 17:29  huangenai  阅读(1446)  评论(0编辑  收藏  举报