zoukankan      html  css  js  c++  java
  • 从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络

    P75 、1-以太坊私网建立 、合约编译、部署完全教程(1)

    使用此博文进行安装配置:https://blog.csdn.net/w88193363/article/details/79402074

    一、搭建私有链所需的依赖环境

    操作系统:ubuntu16.04,开虚拟机的话要至少2G,否则会影响测试挖矿时的速度

    软件:geth客户端 版本:1.8.1-stable-1e67410e

    二、安装geth客户端

    【Ctrl+Alt+T】打开终端,依次输入以下命令:

    sudo apt-get update
    
    sudo apt-get install software-properties-common
    
    sudo add-apt-repository -y ppa:ethereum/ethereum
    
    sudo add-apt-repository -y ppa:ethereum/ethereum-dev
    
    sudo apt-get update
    
    
    sudo apt-get install ethereum

    安装完成后,输入geth -h,如果有列出信息则说明安装成功,可查看列出信息,方便后续的操作

    三、建立私链:

    1、创建一个文件夹来存储你的私链数据

    mkdir privatechain
    cd privatechain

    2、使用geth来加载

    geth --networkid 123 --dev --datadir data --rpc --rpcaddr 192.168.2.223 --rpcport 8545 --port 3000 console

    各选项含义如下:

    • --identity:指定节点 ID;
    • --rpc:表示开启 HTTP-RPC 服务;
    • --rpcaddr:HTTP-RPC 服务ip地址;
    • --rpcport:指定 HTTP-RPC 服务监听端口号(默认为 8545);
    • --datadir:指定区块链数据的存储位置;
    • --port:指定和其他节点连接所用的端口号(默认为 30303);
    • --nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点。

    执行上面的命令,你应该能看到下面的信息:

    INFO [10-15 03:14:50] IPC endpoint opened: /Users/liyuechun/Desktop/1015/privchain/geth.ipc
    INFO [10-15 03:14:50] HTTP endpoint opened: http://127.0.0.1:8545

    为了方便操作,我们将上面的命令存为init.sh:

    nano init.sh
    //输入 geth --networkid 123 --dev --datadir data --rpc --rpcaddr 192.168.31.140 --rpcport 8545 --port 3000 console //赋予执行权限 chmod 775 init.sh

    保持节点的运行,不要关闭终端,重新打开一个终端,使用geth attach连接节点,并且打开geth console

    geth attach ipc:data/geth.ipc 

     为了方便操作,我们将上面的命令存为connect.sh:

    nano connect.sh
    
    //输入
    geth attach ipc:data/geth.ipc
    
    //赋予执行权限
    chmod 775 connect.sh

    这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:

    • eth:包含一些跟操作区块链相关的方法;
    • net:包含一些查看p2p网络状态的方法;
    • admin:包含一些与管理节点相关的方法;
    • miner:包含启动&停止挖矿的一些方法;
    • personal:主要包含一些管理账户的方法;
    • txpool:包含一些查看交易内存池的方法;
    • web3:包含了以上对象,还包含一些单位换算的方法。

    另外开启一个终端1

    cd privatechain/data
    geth attach ipc:geth.ipc

    3、相关api命令

    查看账户

    personal.listAccounts

    创建账户

    personal.newAccount("密码")

    4、web3命令 

    查看创世账户

    web3.eth.coinbase

    获取账户

    personal.listAccounts[1]

    查看账户余额

    eth.getBalance("账户地址")
    //eth.getBalance(personal.listAccounts[0])

    开始挖矿

    miner.start();

    停止挖矿

    miner.stop();

    终端1账户0向账户1转账

    //解锁账户0(密码为空)
    personal.unlockAccount(personal.listAccounts[0]);
    //以太币转wei
    amount = web3.toWei(5,'ether');
    //转账
    eth.sendTransaction({from:personal.listAccounts[0],to:personal.listAccounts[1],value:amount});
    //查看交易状态
    txpool.status
    //查看区块信息
    eth.getBlock("pending",true);
    //开始挖矿
    miner.start();
    //停止挖矿
    miner.stop();
    //查看交易状态
    txpool.status
    //查看账户1的余额
    eth.getBalance(personal.listAccounts[1])
    //转账成功!!!
    //查看区块数
    eth.blockNumber
    //查看交易信息
    eth.getTransaction("0xc9d079c276cb8d026705430d1f0c543d88d11e6058f09b17717c7dc7df222dcd")
    //查看区块信息(区块号)
    eth.getBlock(1)

    5、mist钱包连接私链

    Mist钱包下载地址:https://github.com/ethereum/mist/releases

    Mist = Ethereum Wallet + Web3 浏览器

    下载:Mist-linux64-0-11-1.zip

    解压

    unzip Mist-linux64-0-11-1.zip /home/ethereum/Mist

    使用mist链接到私链

    "/home/ethereum/Mist/mist" --rpc "/home/ethereum/privatechain/init/data/geth.ipc"

     为了方便操作,我们将上面的命令存为mist.sh:

    nano mist.sh
    
    //输入
    "/home/ethereum/Mist/mist" --rpc "/home/ethereum/privatechain/init/data/geth.ipc"
    
    //赋予执行权限
    chmod 775 mist.sh

    打开即可

    ./mist.sh

    6、编写智能合约 

    这里我们部署合约分两种情况:

    • 命令行方式部署
    • Mist钱包中部署

    a、命令行方式部署

    终端1编写合约

    cd privatechain
    nano DemeterContract.sol

    输入以下内容,并保存:

    pragma solidity ^0.5.4;
    
    contract DemeterContract {
        mapping (address => uint) balances;
        event Transfer(address indexed _from, address indexed _to, uint256 _value);
    
        uint public ticketIndex;
        mapping(address => mapping(uint => Ticket)) stores;
        mapping(uint => address) ticketIdInStore;
    
        struct Ticket{
            uint id;   //票据id
            string name;  //票据名称
    
            string content;  //票据内容
            address receiveraddr;  //付款人地址
            //address payeeaddr;   //收款人地址
        }
    
        constructor() public{
            ticketIndex = 0;
            balances[tx.origin] = 10000;
        }
    
        function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
            if (balances[msg.sender] < amount) return false;
            balances[msg.sender] -= amount;
            balances[receiver] += amount;
            emit Transfer(msg.sender, receiver, amount);
            return true;
        }
    
        function getBalanceInEth(address addr) public view returns(uint){
            return getBalance(addr);
        }
    
        function getBalance(address addr) public view returns(uint) {
            return balances[addr];
        }
    
        /*  添加票据信息到区块链  */
        function addTicketToStore(string memory _name,string memory _content, address _receiveraddr) public {
            ticketIndex += 1;
            Ticket memory ticket = Ticket(ticketIndex, _name, _content, _receiveraddr);
            stores[msg.sender][ticketIndex] = ticket;
            ticketIdInStore[ticketIndex] = msg.sender;
        }
    
        /*  添加票据信息到区块链  */
        function addTicketToStoreByAddress(string memory _name,string memory _content, address _senderaddr, address _receiveraddr) public {
            ticketIndex += 1;
            Ticket memory ticket = Ticket(ticketIndex, _name, _content, _receiveraddr);
            stores[_senderaddr][ticketIndex] = ticket;
            ticketIdInStore[ticketIndex] = _senderaddr;
        }
    
        /*  test  */
        function test(string memory _name, string memory _content, address _receiveraddr) public returns(uint,address,string memory,string memory) {
            ticketIndex += 1;
            Ticket memory ticket = Ticket(ticketIndex, _name, _content, _receiveraddr);
            stores[msg.sender][ticketIndex] = ticket;
            ticketIdInStore[ticketIndex] = msg.sender;
    
            /**/
            Ticket memory ticketback = stores[ticketIdInStore[ticketIndex]][ticketIndex];
    
            return (ticketIndex,msg.sender,ticketback.name,ticketback.content);
        }
    
        /*  通过票据id读取票据  */
        function getTicket(uint _ticketId) public view returns(uint, string memory, string memory){
            Ticket memory ticket = stores[ticketIdInStore[_ticketId]][_ticketId];
            return (ticket.id, ticket.name, ticket.content);
        }
    
        /*  通过票据id读取票据  */
        function getTicketByByAddress(address searcher, uint _ticketId) public view returns(uint, string memory, string memory){
            Ticket memory ticket = stores[ticketIdInStore[_ticketId]][_ticketId];
            //ticketIdInStore[_ticketId]==searcher
            if( ticketIdInStore[_ticketId] == searcher || ticket.receiveraddr == searcher )
                return (ticket.id, ticket.name, ticket.content);
            else
                return (0, "0", "0");
        }
    }

    安装solc

    参考:https://blog.csdn.net/u013137970/article/details/52255001、https://www.cnblogs.com/lidonghao/p/8497145.html

    npm install -g solc
    //npm install -g solc-cli
    //检测是否安装成功
    solcjs --help
    //sudo add-apt-repository -y ppa:ethereum/ethereum
    //sudo add-apt-repository -y ppa:ethereum/ethereum-dev
    //sudo apt-get update
    
    //sudo apt-get install solc
    
    //检测是否安装成功:solc --help

    终端2获取字节码

    //使用solcjs获取合约的字节码
    solcjs --bin DemeterContract.sol
    //使用gedit打开 ,并复制字节码
    gedit DemeterContract_sol_DemeterContract.bin

    终端1定义字节码变量(在字节码前面加上 0x):

    var bytecode = "0x608060405234801561001057600080fd5b5060006001819055506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061199d8061006d6000396000f3fe608060405234801561001057600080fd5b50600436106100b0576000357c010000000000000000000000000000000000000000000000000000000090048063c803932611610083578063c80393261461051e578063d252d3b314610690578063dc9460a8146107ca578063ea4a06081461095c578063f8b2cb4f1461097a576100b0565b806351bf46c0146100b55780637bd703e8146103465780637dc379fa1461039e57806390b98a11146104b8575b600080fd5b610225600480360360608110156100cb57600080fd5b81019080803590602001906401000000008111156100e857600080fd5b8201836020820111156100fa57600080fd5b8035906020019184600183028401116401000000008311171561011c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561017f57600080fd5b82018360208201111561019157600080fd5b803590602001918460018302840111640100000000831117156101b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109d2565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156102a1578082015181840152602081019050610286565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156103075780820151818401526020810190506102ec565b50505050905090810190601f1680156103345780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6103886004803603602081101561035c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dcc565b6040518082815260200191505060405180910390f35b6103ca600480360360208110156103b457600080fd5b8101908080359060200190929190505050610dde565b604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156104145780820151818401526020810190506103f9565b50505050905090810190601f1680156104415780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561047a57808201518184015260208101905061045f565b50505050905090810190601f1680156104a75780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b610504600480360360408110156104ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611043565b604051808215151515815260200191505060405180910390f35b61068e6004803603606081101561053457600080fd5b810190808035906020019064010000000081111561055157600080fd5b82018360208201111561056357600080fd5b8035906020019184600183028401116401000000008311171561058557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156105e857600080fd5b8201836020820111156105fa57600080fd5b8035906020019184600183028401116401000000008311171561061c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061119c565b005b6106dc600480360360408110156106a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061132b565b604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561072657808201518184015260208101905061070b565b50505050905090810190601f1680156107535780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561078c578082015181840152602081019050610771565b50505050905090810190601f1680156107b95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61095a600480360360808110156107e057600080fd5b81019080803590602001906401000000008111156107fd57600080fd5b82018360208201111561080f57600080fd5b8035906020019184600183028401116401000000008311171561083157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561089457600080fd5b8201836020820111156108a657600080fd5b803590602001918460018302840111640100000000831117156108c857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116af565b005b61096461183f565b6040518082815260200191505060405180910390f35b6109bc6004803603602081101561099057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611845565b6040518082815260200191505060405180910390f35b600080606080600180600082825401925050819055506109f061188d565b60806040519081016040528060015481526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff16815250905080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020600082015181600001556020820151816001019080519060200190610aa59291906118cc565b506040820151816002019080519060200190610ac29291906118cc565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503360036000600154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b6961188d565b6002600060036000600154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000206080604051908101604052908160008201548152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d415780601f10610d1657610100808354040283529160200191610d41565b820191906000526020600020905b815481529060010190602001808311610d2457829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905060015433826020015183604001518292508191508090509550955095509550505093509350935093565b6000610dd782611845565b9050919050565b6000606080610deb61188d565b600260006003600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206080604051908101604052908160008201548152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f1d5780601f10610ef257610100808354040283529160200191610f1d565b820191906000526020600020905b815481529060010190602001808311610f0057829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fbf5780601f10610f9457610100808354040283529160200191610fbf565b820191906000526020600020905b815481529060010190602001808311610fa257829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050806000015181602001518260400151819150809050935093509350509193909250565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156110945760009050611196565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b600180600082825401925050819055506111b461188d565b60806040519081016040528060015481526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815250905080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000206000820151816000015560208201518160010190805190602001906112699291906118cc565b5060408201518160020190805190602001906112869291906118cc565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503360036000600154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600060608061133861188d565b600260006003600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206080604051908101604052908160008201548152602001600182018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561146a5780601f1061143f5761010080835404028352916020019161146a565b820191906000526020600020905b81548152906001019060200180831161144d57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150c5780601f106114e15761010080835404028352916020019161150c565b820191906000526020600020905b8154815290600101906020018083116114ef57829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508573ffffffffffffffffffffffffffffffffffffffff166003600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061160957508573ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff16145b1561162f57806000015181602001518260400151819150809050935093509350506116a8565b60008090506040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152506040805190810160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250935093509350505b9250925092565b600180600082825401925050819055506116c761188d565b60806040519081016040528060015481526020018681526020018581526020018373ffffffffffffffffffffffffffffffffffffffff16815250905080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600154815260200190815260200160002060008201518160000155602082015181600101908051906020019061177c9291906118cc565b5060408201518160020190805190602001906117999291906118cc565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508260036000600154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60015481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b608060405190810160405280600081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061190d57805160ff191683800117855561193b565b8280016001018555821561193b579182015b8281111561193a57825182559160200191906001019061191f565b5b509050611948919061194c565b5090565b61196e91905b8082111561196a576000816000905550600101611952565b5090565b9056fea165627a7a72305820503f708ff6b3bba7652d212d7ca500d453c63ae800676f0574290c56ceb9dd450029"

    终端2生成abi

    //使用solcjs生成abi
    solcjs --abi DemeterContract.sol
    //使用gedit打开,并复制abi
    gedit DemeterContract_sol_DemeterContract.abi

    终端1定义字abi:

    var abi = [{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_content","type":"string"},{"name":"_receiveraddr","type":"address"}],"name":"test","outputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getBalanceInEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ticketId","type":"uint256"}],"name":"getTicket","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"sendCoin","outputs":[{"name":"sufficient","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_content","type":"string"},{"name":"_receiveraddr","type":"address"}],"name":"addTicketToStore","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"searcher","type":"address"},{"name":"_ticketId","type":"uint256"}],"name":"getTicketByByAddress","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_content","type":"string"},{"name":"_senderaddr","type":"address"},{"name":"_receiveraddr","type":"address"}],"name":"addTicketToStoreByAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ticketIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}]

    终端1部署合约

    //通过abi创建合约对象
    var
    myContract = web3.eth.contract(abi);
    //预估手续费
    web3.eth.estimateGas({data:bytecode})
    //1822408

    account1 = eth.coinbase;
    //解锁coinbase账号,我们通过coinbase账号来付费部署合约
    personal.unlockAccount(account1)

    //定义合约实例,gas要大于手续费
    contractInstance = myContract.new(
      {
        data: bytecode,
        gas: 2000000,
        from: account1
      },
      function(e, contract){
        if(!e){
          if(!contract.address){
            console.log("Contract transaction send: Transaction Hash: "+contract.transactionHash
              +" waiting to be mined...");
          }else{
            console.log("Contract mined! Address: "
              +contract.address);
            console.log(contract);
          }
        }else{
          console.log(e)
        }
      }
    )
    //返回合约部署成功后的地址
    //Contract mined! Address: 0xfcaeee24285696e4427cdb41a105829f3156d33f

    //查看交易状态(pending = 1)
    txpool.status
    //开始挖矿
    miner.start();
    //停止挖矿
    miner.stop();
    //查看交易状态(pending =0)
    txpool.status
    //查看是否部署成功(如果没有部署成功,续集重新部署)
    eth.getCode(contractInstance.address)
    //合约地址
    contractInstance.address

    查询合约发布情况

    transReceipt=eth.getTransactionReceipt(contractInstance.transactionHash)

    status 0x1 表示成功 0x0 表示失败  contractAddress就是合约地址

    通过合约地址获取合约对象

    entityContract = myContract.at(transReceipt.contractAddress)

    调用合约的查询方法ticketIndex()

    entityContract.ticketIndex()

    通过交易transaction调用合约方法addTicketToStore

    txSend=eth.sendTransaction({"from": eth.coinbase, "to": transReceipt.contractAddress, "data": "0xa869765a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000014697320636f6e747261637420737563636573733f000000000000000000000000"})

    参考博文:https://blog.csdn.net/boneix/article/details/80223189

    //调用合约方法

    contractInstance.ticketIndex()
    //0
    > contractInstance.addTicketToStore("name","content",eth.coinbase)
    Error: invalid address
        at web3.js:3930:15
        at web3.js:3756:20
        at web3.js:5025:28
        at map (<native code>)
        at web3.js:5024:12
        at web3.js:5050:18
        at web3.js:5075:23
        at web3.js:4137:16
        at apply (<native code>)
        at web3.js:4223:16

    解决办法:https://blog.csdn.net/qq_31915745/article/details/84205849

    > contractInstance.addTicketToStoreByAddress("name","content",eth.accounts[0],eth.accounts[1])

    b、Mist钱包中部署

     

     花费1个eth

     将合约复制粘贴过来,并把合约版本改为 0.4.24(我们下载的mist钱包合约编译器的版本就是0.4.24)

     开始部署

     等待合约挖矿确认

    P76 、2-以太坊私网建立 (2) - 同一台电脑/不同电脑运行多个节点

    先思考两个问题

    • 决定存储区块链数据的目录
    • 选择网络id,默认1为主网

    为了在同一台机器能够运行两个节点,我们需要为不同的节点设置不同的 port 和 rpcport。

    //去除--dev
    geth --networkid 123 --datadir data2 --rpc --rpcaddr 192.168.1.23 --rpcport 9000 --port 3001 console

    再新开启一个终端,执行

    //去除--dev
    geth --networkid 123 --datadir data3 --rpc --rpcaddr 192.168.1.23 --rpcport 9001 --port 3002 console

    查看节点信息

    admin.nodeInfo.enode

    查看连接

    admin.peers

    增加连接(有时候可以,有时候不可以,连接不稳定

    admin.addPeer("enode://d1b089c2c7c8b00aff37d7671de93a011136b5caeafa2ba24d92aee50643ee368b819cee059d8bd046410131a805058c8b0cd31c6a969b7591cc9050bdcaea5b@117.164.239.245:3002?discport=7498")

    查看连接

    admin.peers

    查看节点连接数

    web3.net.peerCount

    P77 、3-以太坊私网建立 (3) - 通过创世区块来初始化区块链

     保存配置文件为genesis.json

    {
            "config": {
                    "chainId": 15,
                    "homesteadBlock": 0,
                    "eip155Block": 0,
                    "eip158Block": 0
            },
            "alloc": {
                    "bc9a3ece02d7cb31cf63dfdfc48db0b82770d014": {
                            "balance": "300000"
                    },
                    "457e7d69fd3ac576aa744228e6b3319cde768473": {
                            "balance": "400000"
                    }
            },"difficulty": "4","gasLimit": "2100000"
    }

    加载配置文件

    geth init genesis.json --datadir data5

    打开终端

    geth --networkid 123 --datadir data5 console

    查看余额

    eth.getBalance("0xbc9a3ece02d7cb31cf63dfdfc48db0b82770d014");
    eth.getBalance("0x457e7d69fd3ac576aa744228e6b3319cde768473");

    设置coinbase

    miner.setEtherbase("0xbc9a3ece02d7cb31cf63dfdfc48db0b82770d014")

    参考博文:https://blog.csdn.net/qq_36652517/article/details/86235738
    https://learnblockchain.cn/2017/11/29/geth_cmd_options/

    https://www.cnblogs.com/tinyxiong/p/7918706.html

  • 相关阅读:
    delphi 调用百度地图api
    Delphi XE5 for android 图片缩放和拖动处理
    利用FMX控件的MakeScreenshot过程实现WAIT效果
    老外写的在桌面添加快捷方式(DELPHI XE5 ANDROID)
    第01组 Alpha冲刺(5/6)
    2019 SDN上机第4次作业
    2019 SDN阅读作业
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺(3/6)
    第01组 Alpha冲刺(2/6)
  • 原文地址:https://www.cnblogs.com/little-kwy/p/10360266.html
Copyright © 2011-2022 走看看