zoukankan      html  css  js  c++  java
  • 部署智能合约

    部署智能合约

    合约部署需要挖矿才能成功,我们新开一个窗口用与挖矿,新开一个控制台,输入命令:geth attach 连接到控制台,执行miner.start(1),开始挖矿。

    智能合约的部署需要编译,这里用在线编译 https://remix.ethereum.org

    合约DEMO如下:

    pragma solidity ^0.4.0;
    contract InfoContract {
    
        string name;
        uint age;
    
        function setInfo(string _name, uint _age) public {
            name = _name;
            age = _age;
        }
    
        function getInfo() public constant returns (string, uint) {
            return (name, age);
        }
    
    }
    

      

    编译后部署代码:

    var infocontractContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_age","type":"uint256"}],"name":"setInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
    var infocontract = infocontractContract.new(
       {
         from: web3.eth.accounts[0], 
         data: '0x608060405234801561001057600080fd5b506102fa806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635a9b0b89146100515780638262963b146100e8575b600080fd5b34801561005d57600080fd5b5061006661015b565b6040518080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156100ac578082015181840152602081019050610091565b50505050905090810190601f1680156100d95780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156100f457600080fd5b50610159600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190505050610207565b005b6060600080600154818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101f85780601f106101cd576101008083540402835291602001916101f8565b820191906000526020600020905b8154815290600101906020018083116101db57829003601f168201915b50505050509150915091509091565b816000908051906020019061021d929190610229565b50806001819055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061026a57805160ff1916838001178555610298565b82800160010185558215610298579182015b8281111561029757825182559160200191906001019061027c565b5b5090506102a591906102a9565b5090565b6102cb91905b808211156102c75760008160009055506001016102af565b5090565b905600a165627a7a723058209cd9d1fc6f2d24528eb8432fe797470bba6b502f377dd0d96024c8e01dd3de2c0029', 
         gas: '4700000'
       }, function (e, contract){
        console.log(e, contract);
        if (typeof contract.address !== 'undefined') {
             console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
        }
     })
    

      

    将编译好的代码拷贝直接放到控制台即可。如果出现Error: account is locked undefined错误的话, 则使用personal.unlockAccount(eth.accounts[0],'password')命令将用户解锁。Password为你创建账号的密码。 一段时间后geth窗口就会出现Contract mined! address..., 表明合约代码发布成功。

    部署之后会返回合约地址(合约账户地址)

    智能合约的调用

    合约部署成功后,在控制台可以直接调用。

    set方法改变了合约内部状态,所以也要解锁交易发送者账户,消耗gas,并且需要矿工打包交易持久化到区块。

    > infocontract.setInfo.sendTransaction("xiaoming",18,{from:eth.accounts[0]})

    get方法没有改变合约内部状态,所以不需要消耗gas和矿工打包。

    > infocontract.getInfo()
    ["xiaoming", 18]

    ERC20标准token

    为什么需要这个标准?

    以太坊是一个分布式的智能合约平台,可以分发代币(Token)。 访问 https://etherscan.io/tokens 可以了解到,如果这么多代币的标准不统一,对于其他人来查看代码是相当痛苦的,众筹的人也就没有办法来检查代币分发的是否合理,也没有办法做到多种钱包的兼容。

    为了我们发布的Token被以太坊钱包支持,要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等。

    所以才推出了一种以太坊代币的标准:ERC20标准。

    标准里包含了哪些内容?

    ERC20标准实际上就是一个合约接口标准。

    Method:
    1、name
    function name() constant returns (string name) 

    返回string类型的ERC20代币的名字,例如:StatusNetwork

    2、symbol
    function symbol() constant returns (string symbol)

    返回string类型的ERC20代币的符号,也就是代币的简称,例如:SNT。

    3、decimals
    function decimals() constant returns (uint8 decimals)

    支持几位小数点后几位。如果设置为3。也就是支持0.001表示。

    4、totalSupply
    function totalSupply() constant returns (uint256 totalSupply)

    发行代币的总量,可以通过这个函数来获取。所有智能合约发行的代币总量是一定的,totalSupply必须设置初始值。如果不设置初始值,这个代币发行就说明有问题。

    5、balanceOf
    function balanceOf(address _owner) constant returns (uint256 balance)

    输入地址,可以获取该地址代币的余额。

    6、transfer
    function transfer(address _to, uint256 _value) returns (bool success)

    调用transfer函数将自己的token转账给_to地址,_value为转账个数

    7、approve
    function approve(address _spender, uint256 _value) returns (bool success)

    批准_spender账户从自己的账户转移_value个token。可以分多次转移。

    8、transferFrom
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

    与approve搭配使用,approve批准之后,调用transferFrom函数来转移token。

    9、allowance
    function allowance(address _owner, address _spender) constant returns (uint256 remaining)

    返回_spender还能提取token的个数。

    10、approve、transferFrom及allowance解释:

    账户A有1000个ETH,想允许B账户随意调用100个ETH。A账户按照以下形式调用approve函数approve(B,100)。当B账户想用这100个ETH中的10个ETH给C账户时,则调用transferFrom(A, C, 10)。这时调用allowance(A, B)可以查看B账户还能够调用A账户多少个token。

    Events

    11、Transfer
    event Transfer(address indexed _from, address indexed _to, uint256 _value)

    当成功转移token时,一定要触发Transfer事件

    12、Approval
    event Approval(address indexed _owner, address indexed _spender, uint256 _value)

    当调用approval函数成功时,一定要触发Approval事件

  • 相关阅读:
    【OpenCV入门指南】第一篇 安装OpenCV
    java.lang.Math中的基本方法
    padding与margin的差别
    怎样做到从程序猿到管理者的跳跃
    秒杀多线程第四篇 一个经典的多线程同步问题
    NETSH WINSOCK RESET这条命令的含义和作用?
    如何在windows系统自带命令查看硬件信息?
    centos6.5 无线网卡配置
    ctagst简单应用,将Vim改造:Ctags,Taglist,Cscope,OmniCppComplete,SuperTab,Winmanager,NERDTree,MiniBufExplorer,vimrc
    lsof 拥有更多的功能
  • 原文地址:https://www.cnblogs.com/WPF0414/p/10046513.html
Copyright © 2011-2022 走看看