什么是智能合约??
智能合约与平时的代码其实没有什么区别,只是运行于一个以太坊这样的分布式平台上而已。这个运行的平台,赋予了这些代码不可变,确定性,分布式和可自校验状态等特点。代码运行过程中状态的存储,是不可变的。每一个人,都可以开一个自己的节点,重放整个区块链,将会获得同样的结果(译者注:能控制所有节点都达到一致状态,就是所谓的共识)。
在以太坊中,每个合约都有一个唯一的地址来标识它自己(由创建者的哈希地址和曾经发送过的交易的数量推算出来)。客户端可以与这个地址进行交互,可以发送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
此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。
如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。