【区块链】DOCKER部署量子链私有网络环境以及部署智能合约实践

简介: DOCKER部署量子链私有网络环境以及部署智能合约实践安装环境安装Dockerhttps://store.docker.com/editions/community/docker-ce-desktop-mac这里安装的是CE的稳定版xiaoyu@LIXIAOYUdeMacBook-Pro.

DOCKER部署量子链私有网络环境以及部署智能合约实践

安装环境

安装Docker

https://store.docker.com/editions/community/docker-ce-desktop-mac

这里安装的是CE的稳定版

xiaoyu@LIXIAOYUdeMacBook-Pro.com docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:40:09 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:45:38 2017
 OS/Arch:      linux/amd64
 Experimental: true

xiaoyu@LIXIAOYUdeMacBook-Pro.com docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (******************): 
Password: 
Login Succeeded


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
5b0f327be733: Pull complete 
Digest: sha256:07d5f7800dfe37b8c2196c7b1c524c33808ce2e0f74e7aa00e603295ca9a0972
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

创建桥接网络


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker network create --driver bridge qtum_network
2b13b85764a65c48335edd059a7c715da1cbf7c07df4387d68bb269ef16e6796


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f180013a366c        bridge              bridge              local
d1f91168e308        host                host                local
c7412c2ee6d2        none                null                local
2b13b85764a6        qtum_network        bridge              local




拉取Qtum镜像


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker pull cryptominder/qtum
Using default tag: latest
latest: Pulling from cryptominder/qtum
280aca6ddce2: Pull complete 
a3ed95caeb02: Pull complete 
c05bbaad6588: Pull complete 
d58e30222385: Pull complete 
72e52753ff3a: Pull complete 
e2f4e66e4f9a: Pull complete 
ab49593d9269: Pull complete 
5334c4f4c433: Pull complete 
Digest: sha256:99764799a4fc807882cd8a2744d844f701b41f6846bf0b87c7d8780ff517a83f
Status: Downloaded newer image for cryptominder/qtum:latest


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cryptominder/qtum   latest              f5adde30c8eb        8 days ago          92.1MB
hello-world         latest              05a3bd381fc2        4 weeks ago         1.84kB

本地文件映射

docker run后面接下面两种参数


-v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro

-v ${PWD}/node1_data:/data

获取配置文件


git clone https://github.com/crypt0m1nd3r/docker-qtum-config.git

启动节点

xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -d --rm --name qtumd_node1 --network=qtum_network -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtumd
522be9f3d830c1f749f15c4a7b6e87008930b3a416bb2ae2cc8561ac84fe6a9c

列表


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                       NAMES
522be9f3d830        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   23 seconds ago      Up 25 seconds       3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node1

在当前文件夹可以看到一个node1_data文件夹


xiaoyu@LIXIAOYUdeMacBook-Pro.com ls node1_data/regtest 
banlist.dat blocks      chainstate  database    db.log      debug.log   peers.dat   qtumd.pid   stateQtum   vm.log      wallet.dat

其他两个节点



~/docker_qtum/docker-qtum-config git:(master) [11:47:23]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -d --rm --name qtumd_node2 --network=qtum_network -v ${PWD}/node2_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node2_data:/data cryptominder/qtum:latest qtumd
cf5bf31175d5627c52a6f3513f8f96bf1bdf74869bcb5b14bff9ef4232a02763

~/docker_qtum/docker-qtum-config git:(master) [11:48:11]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -d --rm --name qtumd_node3 --network=qtum_network -v ${PWD}/node3_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node3_data:/data cryptominder/qtum:latest qtumd 
c4bc72f072a500fbcf1ea3d63ecd02b59b8641c246afa6744ab40597edc9f7ca

查看


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS                                       NAMES
c4bc72f072a5        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   46 seconds ago       Up 48 seconds       3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node3
cf5bf31175d5        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   About a minute ago   Up About a minute   3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node2
522be9f3d830        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   4 minutes ago        Up 4 minutes        3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node1

验证节点有效

~/docker_qtum/docker-qtum-config git:(master) [11:49:30]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i –network container:qtumd_node1 -v PWD/node1qtumd.conf:/home/qtum/qtum.conf:rov{PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getinfo
{
“version”: 140301,
“protocolversion”: 70016,
“walletversion”: 130000,
“balance”: 0.00000000,
“stake”: 0.00000000,
“blocks”: 0,
“timeoffset”: 0,
“connections”: 2,
“proxy”: “”,
“difficulty”: {
“proof-of-work”: 4.656542373906925e-10,
“proof-of-stake”: 4.656542373906925e-10
},
“testnet”: false,
“moneysupply”: 0,
“keypoololdest”: 1508125526,
“keypoolsize”: 100,
“paytxfee”: 0.00000000,
“relayfee”: 0.00400000,
“errors”: “”
}

Proof-of-Stake (POS)


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli generate 1
[
  "56b7a6fb87d15dd289fe682f7adce8fb2c49a330a8f19ac4c0217a35d8c639c4"
]
  ~/docker_qtum/docker-qtum-config git:(master) [12:03:54]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli generate 4999
[
  "794857ae6cdae4b483407fda666d0004d0c4385335ea706d17aa2c3b4b591e62", 
  "1f6ab1697ece120857db6f7f364efaf01563985c5b962d2d76c0614423209ed8", 
  "74f72495383cd7037a94c4652165874727f7a86543527c30fae07c5b702492c4", 
  "310657e8a642213cfdfb0f93fb6bdaa11b485c16dc29daf792d0a5e69b0a21bd", 
  "3fbd40f4455c65fd15dddca49a401cbd568df1aec20d2f0c74108cd082dbb4d6", 
  "62893413cf52b7d0c990a847139ea402a002f18f9131470b841ff699eab5356f", 
  "7481d60c63d3a9c064c2c91d1ae7d50a2c6bd4ffea08fb6af9fcbd586b163861"
  ...................




超过5000个块后,开始POS,每过几分钟,就会自动产生新的区块。



xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getwalletinfo  
{
  "walletversion": 130000,
  "balance": 90000000.00000000,
  "stake": 110000.00000000,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 9900000.00000000,
  "txcount": 5005,
  "keypoololdest": 1508125526,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "hdmasterkeyid": "7edb36583046f5ca439537f24073d0a6602ea901"
}

stake为自动产生的部分。

停止运行


docker stop qtumd_node1

部署

确认环境


  ~/docker_qtum/docker-qtum-config git:(master) [13:35:19]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker ps -f name=qtumd
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                       NAMES
c4bc72f072a5        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   2 hours ago         Up 2 hours          3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node3
cf5bf31175d5        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   2 hours ago         Up 2 hours          3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node2
522be9f3d830        cryptominder/qtum:latest   "/entrypoint.sh qtumd"   2 hours ago         Up 2 hours          3888-3889/tcp, 13888-13889/tcp, 23888/tcp   qtumd_node1
  ~/docker_qtum/docker-qtum-config git:(master) [13:49:48]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getwalletinfo
{
  "walletversion": 130000,
  "balance": 90000000.00000000,
  "stake": 3960000.00000000,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 6400000.00000000,
  "txcount": 5180,
  "keypoololdest": 1508125526,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "hdmasterkeyid": "7edb36583046f5ca439537f24073d0a6602ea901"
}







确认是不是有智能合约


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli listcontracts
{
  "0000000000000000000000000000000000000083": 0.00000000,
  "0000000000000000000000000000000000000080": 0.00000000,
  "0000000000000000000000000000000000000081": 0.00000000,
  "0000000000000000000000000000000000000082": 0.00000000,
  "0000000000000000000000000000000000000084": 0.00000000
}

获取solc和ethabi


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run ethereum/solc:stable solc --version
Unable to find image 'ethereum/solc:stable' locally
stable: Pulling from ethereum/solc
88286f41530e: Pull complete 
5650800b8aa2: Pull complete 
4c72a311195d: Pull complete 
e416a2de4b1d: Pull complete 
6dcc936acf64: Pull complete 
Digest: sha256:c61b13352fb2feb691cce49439eababdf9da215d4669437c17c9fd36311ad264
Status: Downloaded newer image for ethereum/solc:stable
solc, the solidity compiler commandline interface
Version: 0.4.17+commit.bdeb9e52.Linux.g++
  ~ [14:48:40]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run ethereum/solc:stable solc --version
solc, the solidity compiler commandline interface
Version: 0.4.17+commit.bdeb9e52.Linux.g++


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker pull cryptominder/ethabi
Using default tag: latest
latest: Pulling from cryptominder/ethabi
219d2e45b4af: Pull complete 
ef9ce992ffe4: Pull complete 
d0df8518230c: Pull complete 
38ae21afde7b: Pull complete 
baa1c2e15c01: Pull complete 
85b637e7eada: Pull complete 
223f4c62bf4a: Pull complete 
7a1623674a9e: Pull complete 
Digest: sha256:2fabc4f844a1309037bfd93f63956cac6c3dd76779e674d5388c02192aec6147
Status: Downloaded newer image for cryptominder/ethabi:latest
  ~/docker_qtum/docker-qtum-config git:(master) [14:54:17]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run --rm -v ${PWD}:/ethabi cryptominder/ethabi:latest --help
Ethereum ABI coder.
  Copyright 2016-2017 Parity Technologies (UK) Limited

Usage:
    ethabi encode function <abi-path> <function-name> [-p <param>]... [-l | --lenient]
    ethabi encode params [-v <type> <param>]... [-l | --lenient]
    ethabi decode function <abi-path> <function-name> <data>
    ethabi decode params [-t <type>]... <data>
    ethabi decode log <abi-path> <event-name> [-l <topic>]... <data>
    ethabi -h | --help

Options:
    -h, --help         Display this message and exit.
    -l, --lenient      Allow short representation of input params.

Commands:
    encode             Encode ABI call.
    decode             Decode ABI call result.
    function           Load function from json ABI file.
    params             Specify types of input params inline.
    log                Decode event log.

编译智能合约




vi helloworld.sol


contract mortal {
    /* Define variable owner of the type address */
    address owner;

    /* This function is executed at initialization and sets the owner of the contract */
    function mortal() { owner = msg.sender; }

    /* Function to recover the funds on the contract */
    function kill() { if (msg.sender == owner) selfdestruct(owner); }
}

contract greeter is mortal {
    /* Define variable greeting of the type string */
    string greeting;

    /* This runs when the contract is executed */
    function greeter(string _greeting) public {
        greeting = _greeting;
    }

    /* Main function */
    function greet() constant returns (string) {
        return greeting;
    }
}


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run --rm -v ${PWD}:/solidity ethereum/solc:stable --optimize --bin --abi --hashes -o /solidity --overwrite helloworld.sol     
helloworld.sol:6:5: Warning: No visibility specified. Defaulting to "public".
    function mortal() { owner = msg.sender; }
    ^---------------------------------------^
helloworld.sol:9:5: Warning: No visibility specified. Defaulting to "public".
    function kill() { if (msg.sender == owner) selfdestruct(owner); }
    ^---------------------------------------------------------------^
helloworld.sol:22:5: Warning: No visibility specified. Defaulting to "public".
    function greet() constant returns (string) {
    ^
Spanning multiple lines.
helloworld.sol:1:1: Warning: Source file does not specify required compiler version!Consider adding "pragma solidity ^0.4.17
contract mortal {
^
Spanning multiple lines.


xiaoyu@LIXIAOYUdeMacBook-Pro.com ls
docker-qtum-config greeter.abi        greeter.bin        greeter.signatures helloworld.sol     mortal.abi         mortal.bin         mortal.signatures


部署智能合约



  ~/docker_qtum/docker-qtum-config git:(master) [15:20:48]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getaccountaddress greeter_owner
qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7

我们会得到一个地址qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli listaccounts
{
  "": 97420000.00000000,
  "greeter_owner": 0.00000000
}



开始编译



xiaoyu@LIXIAOYUdeMacBook-Pro.com cat greeter.bin && docker run --rm -v ${PWD}:/ethabi cryptominder/ethabi:latest encode params -v string 'Hello World!' --lenient
6060604052341561000f57600080fd5b6040516103173803806103178339810160405280805160008054600160a060020a03191633600160a060020a03161790559190910190506001818051610059929160200190610060565b50506100fb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a157805160ff19168380011785556100ce565b828001600101855582156100ce579182015b828111156100ce5782518255916020019190600101906100b3565b506100da9291506100de565b5090565b6100f891905b808211156100da57600081556001016100e4565b90565b61020d8061010a6000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b58114610047578063cfae32171461005c57600080fd5b341561005257600080fd5b61005a6100e6565b005b341561006757600080fd5b61006f610127565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100ab578082015183820152602001610093565b50505050905090810190601f1680156100d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101255760005473ffffffffffffffffffffffffffffffffffffffff16ff5b565b61012f6101cf565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101c55780601f1061019a576101008083540402835291602001916101c5565b820191906000526020600020905b8154815290600101906020018083116101a857829003601f168201915b5050505050905090565b602060405190810160405260008152905600a165627a7a72305820d4b628395b481f1c0f4bee7365b1922f05eaa223abe2bbebf74804849a66181c00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000

下面会用到的命令



createcontract "bytecode" (gaslimit gasprice "senderaddress" broadcast)
Create a contract with bytcode.

Arguments:
1. "bytecode"  (string, required) contract bytcode.
2. gasLimit  (numeric or string, optional) gasLimit, default: 2500000, max: 40000000
3. gasPrice  (numeric or string, optional) gasPrice QTUM price per gas unit, default: 0.0000004, min:0.0000004
4. "senderaddress" (string, optional) The quantum address that will be used to create the contract.
5. "broadcast" (bool, optional, default=true) Whether to broadcast the transaction or not.

正式部署




  ~/docker_qtum/docker-qtum-config git:(master) [15:25:47]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli createcontract  6060604052341561000f57600080fd5b6040516103173803806103178339810160405280805160008054600160a060020a03191633600160a060020a03161790559190910190506001818051610059929160200190610060565b50506100fb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a157805160ff19168380011785556100ce565b828001600101855582156100ce579182015b828111156100ce5782518255916020019190600101906100b3565b506100da9291506100de565b5090565b6100f891905b808211156100da57600081556001016100e4565b90565b61020d8061010a6000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b58114610047578063cfae32171461005c57600080fd5b341561005257600080fd5b61005a6100e6565b005b341561006757600080fd5b61006f610127565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100ab578082015183820152602001610093565b50505050905090810190601f1680156100d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101255760005473ffffffffffffffffffffffffffffffffffffffff16ff5b565b61012f6101cf565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101c55780601f1061019a576101008083540402835291602001916101c5565b820191906000526020600020905b8154815290600101906020018083116101a857829003601f168201915b5050505050905090565b602060405190810160405260008152905600a165627a7a72305820d4b628395b481f1c0f4bee7365b1922f05eaa223abe2bbebf74804849a66181c00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000 2500000 0.00000049  qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7 

error code: -3
error message:
Sender address does not have any unspent outputs

这是因为对应的地址有余额,我们需要保证部署合约的地址有UTXO


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli sendtoaddress    qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7    3
44de44c625fe3971b8cd528f98a46913a6b3a14ea4eb4a3d8b292202833f29ff

经过1个区块的确认,我们就有UTXO了。



xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli listunspent 1 9999999 [\"qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7\"]
[
  {
    "txid": "44de44c625fe3971b8cd528f98a46913a6b3a14ea4eb4a3d8b292202833f29ff",
    "vout": 1,
    "address": "qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7",
    "account": "greeter_owner",
    "scriptPubKey": "76a91408cd94aa2c2aea9fd23c7c1ff435066b88b5741288ac",
    "amount": 3.00000000,
    "confirmations": 12,
    "spendable": true,
    "solvable": true
  }
]


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli createcontract  6060604052341561000f57600080fd5b6040516103173803806103178339810160405280805160008054600160a060020a03191633600160a060020a03161790559190910190506001818051610059929160200190610060565b50506100fb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a157805160ff19168380011785556100ce565b828001600101855582156100ce579182015b828111156100ce5782518255916020019190600101906100b3565b506100da9291506100de565b5090565b6100f891905b808211156100da57600081556001016100e4565b90565b61020d8061010a6000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b58114610047578063cfae32171461005c57600080fd5b341561005257600080fd5b61005a6100e6565b005b341561006757600080fd5b61006f610127565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100ab578082015183820152602001610093565b50505050905090810190601f1680156100d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101255760005473ffffffffffffffffffffffffffffffffffffffff16ff5b565b61012f6101cf565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101c55780601f1061019a576101008083540402835291602001916101c5565b820191906000526020600020905b8154815290600101906020018083116101a857829003601f168201915b5050505050905090565b602060405190810160405260008152905600a165627a7a72305820d4b628395b481f1c0f4bee7365b1922f05eaa223abe2bbebf74804849a66181c00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000 2500000 0.00000049  qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7

{
  "txid": "2cb2ef3e57d9f72ddc76736e5859badf62904ddce2af5ddfe57fdbe2af9e8558",
  "sender": "qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7",
  "hash160": "08cd94aa2c2aea9fd23c7c1ff435066b88b57412",
  "address": "d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f"
}

检查智能合约


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli listcontracts
{
  "0000000000000000000000000000000000000083": 0.00000000,
  "0000000000000000000000000000000000000080": 0.00000000,
  "0000000000000000000000000000000000000081": 0.00000000,
  "0000000000000000000000000000000000000082": 0.00000000,
  "d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f": 0.00000000, //我们创建的智能合约
  "0000000000000000000000000000000000000084": 0.00000000
}



xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getaccountinfo d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f 
{
  "address": "d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f",
  "balance": 0,
  "storage": {
    "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": {
      "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000008cd94aa2c2aea9fd23c7c1ff435066b88b57412"
    },
    "b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": {
      "0000000000000000000000000000000000000000000000000000000000000001": "48656c6c6f20576f726c64210000000000000000000000000000000000000018"
    }
  },
  "code": "606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b58114610047578063cfae32171461005c57600080fd5b341561005257600080fd5b61005a6100e6565b005b341561006757600080fd5b61006f610127565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100ab578082015183820152602001610093565b50505050905090810190601f1680156100d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101255760005473ffffffffffffffffffffffffffffffffffffffff16ff5b565b61012f6101cf565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101c55780601f1061019a576101008083540402835291602001916101c5565b820191906000526020600020905b8154815290600101906020018083116101a857829003601f168201915b5050505050905090565b602060405190810160405260008152905600a165627a7a72305820d4b628395b481f1c0f4bee7365b1922f05eaa223abe2bbebf74804849a66181c0029"
}

运行智能合约



xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run --rm -v ${PWD}:/ethabi cryptominder/ethabi:latest encode function /ethabi/greeter.abi greet
cfae3217
  ~/docker_qtum [16:11:49]
xiaoyu@LIXIAOYUdeMacBook-Pro.com ls
docker-qtum-config greeter.abi        greeter.bin        greeter.signatures helloworld.sol     mortal.abi         mortal.bin         mortal.signatures
  ~/docker_qtum [16:11:57]
xiaoyu@LIXIAOYUdeMacBook-Pro.com cat greeter.signatures
cfae3217: greet()
41c0e1b5: kill()


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node2 -v ${PWD}/node2_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node2_data:/data cryptominder/qtum:latest qtum-cli callcontract  d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f    cfae3217
{
  "address": "d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f",
  "executionResult": {
    "gasUsed": 22737,
    "excepted": "None",
    "newAddress": "d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f",
    "output": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000",
    "codeDeposit": 0,
    "gasRefunded": 0,
    "depositSize": 0,
    "gasForDeposit": 0
  },
  "transactionReceipt": {
    "stateRoot": "5d6bf971874e554793c28ce2dcef60eadca95abd18e77686a9d14371f2504386",
    "gasUsed": 22737,
    "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "log": [
    ]
  }
}

解码output


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run --rm -v ${PWD}:/ethabi cryptominder/ethabi:latest decode params -t string 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000
string Hello World!

清除智能合约

这里对比两个命令

  • callcontract 链下完成,不会在区块链上产生记录。不消耗gas
  • sendtocontract 链上完成,需要同步,会消耗gas
我们使用下面的命令

sendtocontract "contractaddress" "data" (amount gaslimit gasprice senderaddress broadcast)
Send funds and data to a contract.

Arguments:
1. "contractaddress" (string, required) The contract address that will receive the funds and data.
2. "datahex"  (string, required) data to send.
3. "amount"      (numeric or string, optional) The amount in QTUM to send. eg 0.1, default: 0
4. gasLimit  (numeric or string, optional) gasLimit, default: 250000, max: 40000000
5. gasPrice  (numeric or string, optional) gasPrice Qtum price per gas unit, default: 0.0000004, min:0.0000004
6. "senderaddress" (string, optional) The quantum address that will be used as sender.
7. "broadcast" (bool, optional, default=true) Whether to broadcast the transaction or not.

xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli sendtocontract    d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f    41c0e1b5
{
  "txid": "07017d992df14d07dde8cd4fcf5e1dc3837deff6c463c677796d88b2c70defa7",
  "sender": "qbbWnpv1up8HP8T7tYSkfUiv6qnw4qbBw8",
  "hash160": "c5d9780aba93fec62be8624ab0bd1ccbb3bdf6a0"
}





再次调用发现并没有被销毁,因为在合约中规定了调用者必须和创建者一致。


xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli sendtocontract     d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f    41c0e1b5 0 250000 0.00000049 qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7
error code: -3
error message:
Sender address does not have any unspent outputs

//提示没有UTXO


 ~/docker_qtum/docker-qtum-config git:(master) [16:26:41]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli sendtoaddress    qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7    3      
fccbe9c36a26747314d40d2bdfc9cb917f67f0bc011a51e305a4b92dc79a422c
 ~/docker_qtum/docker-qtum-config git:(master) [16:27:22]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli sendtocontract     d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f    41c0e1b5 0 250000 0.00000049 qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7
{
  "txid": "fcc6904e090d89acd65f70c3708d5b49b2f2b1a03f3d3ac19572da6135206bbb",
  "sender": "qJMvqZibSRfVfbHNbew5rZmxD4cdhCXnR7",
  "hash160": "08cd94aa2c2aea9fd23c7c1ff435066b88b57412"
}

再次查看详情,发现已经不存在了



  ~/docker_qtum/docker-qtum-config git:(master) [16:27:26]
xiaoyu@LIXIAOYUdeMacBook-Pro.com docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getaccountinfo  d5662f5de4e5e3a2dc6dd49a87843f893dbcb48f    
error code: -5
error message:
Address does not exist

到此,智能合约的基本操作完成。

参考资料

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云专有网络VPC使用教程
专有网络VPC可以帮助您基于阿里云构建出一个隔离的网络环境,并可以自定义IP 地址范围、网段、路由表和网关等;此外,也可以通过专线/VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。 产品详情:https://www.aliyun.com/product/vpc
目录
相关文章
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
12天前
|
数据采集 网络协议 算法
移动端弱网优化专题(十四):携程APP移动网络优化实践(弱网识别篇)
本文从方案设计、代码开发到技术落地,详尽的分享了携程在移动端弱网识别方面的实践经验,如果你也有类似需求,这篇文章会是一个不错的实操指南。
32 1
|
15天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
12天前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
12天前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
12天前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
|
12天前
|
Linux Docker 容器
【赵渝强老师】Docker的Bridge网络模式
本文介绍了Docker容器的网络隔离机制及其四种网络模式:bridge、container、host和none。重点讲解了默认的bridge模式,通过示例演示了如何创建自定义bridge网络并配置容器的网络信息。文中还附有相关图片和视频讲解,帮助读者更好地理解Docker网络的配置和使用方法。
|
16天前
|
边缘计算 5G 数据处理
5G网络能耗管理:绿色通信的实践
【10月更文挑战第30天】
34 0
|
3月前
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
676 0
【云原生】阿里云服务器部署 Docker Swarm集群
下一篇
无影云桌面