zoukankan      html  css  js  c++  java
  • 区块链: 编译发布智能合约

    什么是智能合约??

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

    在以太坊中,每个合约都有一个唯一的地址来标识它自己(由创建者的哈希地址和曾经发送过的交易的数量推算出来)。客户端可以与这个地址进行交互,可以发送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

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

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

  • 相关阅读:
    HDU5586 最大连续和 xingxing在努力
    HDU5587 递推式+二分 xingxing在努力
    HDU2639 第k小01背包 xingxing在努力
    Java面向对象之继承
    Java面向对象之封装
    Java面向对象之封装
    Java流程控制语句
    Java流程控制语句
    Java运算符
    Java运算符
  • 原文地址:https://www.cnblogs.com/huangenai/p/10109605.html
Copyright © 2011-2022 走看看