经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
区块链: 编译发布智能合约
来源:cnblogs  作者:huangenai  时间:2018/12/13 9:11:25  对本文有异议

什么是智能合约??

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

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

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

 

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

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

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

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

 

实例web3对象

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

 

编译智能合约 

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

  1. pragma solidity ^0.4.0;
  2. contract HEA {
  3. mapping (address => uint) public balances;
  4. function Token() {
  5. balances[msg.sender] = 1000000;
  6. }
  7. function transfer(address _to, uint _amount) {
  8. if (balances[msg.sender] < _amount) {
  9. throw;
  10. }
  11. balances[msg.sender] -= _amount;
  12. balances[_to] += _amount;
  13. }
  14. }

 

部署到链上

  1. web3.eth.getAccounts().then(accountList => {
  2. console.log(accountList);
  3. web3.eth.personal.unlockAccount(accountList[0], "test001");//解锁
    //发布智能合约
  4. new web3.eth.Contract(abi).deploy({
  5. data: '0x' + bytecode,
  6. arguments: [],
  7. }).send({
  8. from: accountList[0],
  9. gas: 1500000,
  10. gasPrice: '30000000000000'
  11. }, function (error, transactionHash) {
  12. console.log("error:" + error);
  13. console.log("send transactionHash:" + transactionHash);
  14. })
  15. .on('error', function (error) {
  16. console.error(error)
  17. })
  18. .then(function (newContractInstance) {
  19. var newContractAddress = newContractInstance.options.address
  20. console.log("Contract Address:" + newContractAddress);
  21. });
  22. res.send(data);
  23. res.end();
  24. })

 

控制台输出

  1. server start port:8001
  2. version: 1.0.0-beta.34
  3. [ '0x0AafbD348BC902C9565623f13505D5A63ddfb531',
  4. '0x0286A797eff130b89771EC81907F7bC8905E8Ed8',
  5. '0xF13838C722EF7d417cF17B82b34F9cB2e0C0f514' ]

send transactionHash:0x430dc2d984005a25c63f69aeedfbb4a25a7c672b7fcb005cbe476eae92612c6c
Contract Address:0xD9D13119012BCCA9926e1bE50CaBa5354F419A45

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

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

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

结果:

 

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

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

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

 

 

参考链接

以太坊开发入门

solidity

web3js

solc

 

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号