用Geth设置基于POA权利证明的私有以太网网络

目标:逐步指导,帮助你使用权威证明共识引擎(也称为clique)设置本地私有以太网网络。

简而言之:我们将在同一台机器上设置两个节点,在我们的localhost上创建一个点对点网络。除了两个节点之外,还将设置启动节点(发现服务)。

我花了相当长的时间和广泛的研究和谷歌搜索,最终有一个坚实的以太坊开发环境来测试我的智能合约和我的DApps。

在这篇文章中,我决定分享我如何使用Geth的clique共识引擎设置一个Proof-of-Authority网络。这是我通过回馈感谢社区的方式,并希望让任何愿意探索以太坊宇宙的人都能过上更轻松的生活。

操作系统和软件

我的操作系统是Ubuntu 16.04 LTS(这个tuto是在一个新的虚拟机中完成的)。

对于以太坊客户端,我使用的是Geth(以太坊protocole的Go实现)。我相信Geth很容易安装,有很多很棒的教程,所以我不打算在这里安装任何装置。我目前正在运行Geth 1.7.3-stable:

$ geth version
Geth
Version: 1.7.3-stable
Git Commit: 4bb3c89d44e372e6a9ab85a8be0c9345265c763a
Architecture: amd64
Protocol Versions: [63 62]

和Geth 1.8.1-stable:

$ geth version
Geth
Version: 1.8.1-stable
Git Commit: 1e67410e88d2685bc54611a7c9f75c327b553ccc
Architecture: amd64
Protocol Versions: [63 62]

我强烈建议你查看Geth命令行界面文档。你需要它。非常的。

让我们开始吧

1.0 概述

让我们从头到尾......为了清楚起见,这是你完成第1章后应该得到的。

devnet$ tree -L 2
.
├── accounts.txt
├── boot.key
├── genesis.json
├── node1
│   ├── geth
│   ├── keystore
│   └── password.txt
└── node2
    ├── geth
    ├── keystore
    └── password.txt

1.1 创建工作区

$ mkdir devnet
$ cd devnet
devnet$ mkdir node1 node2

1.2 创建你的帐户

帐户(也称为钱包)拥有与任何区块链交互所需的公私钥对。任何挖掘节点(严格来说我们的节点不会挖掘但投票)需要能够签署交易(使用他们的私钥)并在网络上标识自己(地址来自公钥)。因此,我们至少需要两个帐户,每个节点一个帐户。

在Geth行话中,投票节点称为Sealer。

对于节点1:

devnet$ geth --datadir node1/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: pwdnode1 (for example)
Repeat passphrase: pwdnode1
Address: {87366ef81db496edd0ea2055ca605e8686eec1e6}

节点2:

devnet$ geth --datadir node2/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: pwdnode2 (for example)
Repeat passphrase: pwdnode2
Address: {08a58f09194e403d02a1928a7bf78646cfc260b0}

这将创建包含你的帐户文件的keystore/。请注意,keystore/中文件名的最后一部分是你帐户的地址(也在上面的终端中打印)。

我建议从终端屏幕复制这两个地址,并将它们保存在文本文件中。这将在以后简化一些复制粘贴工作。但请记住,你可以从keystore /中的UTC-datetime-address文件中读取这些addesses。

devnet$ echo '87366ef81db496edd0ea2055ca605e8686eec1e6' >> accounts.txt
devnet$ echo '08a58f09194e403d02a1928a7bf78646cfc260b0' >> accounts.txt

对于每个节点,我建议将密码保存在文件中。这将在以后简化某些流程(例如解锁你的帐户)

devnet$ echo 'pwdnode1' > node1/password.txt
devnet$ echo 'pwdnode2' > node2/password.txt

1.3 创建你的Genesis文件

genesis文件是用于初始化区块链的文件。第一个块,称为genesis块,是根据genesis.json文件中的参数精心设计的。

Geth带有一堆expeuables,如puppethbootnode。你可以在Geth github上找到完整列表。Puppeth消除了从头开始创建一个genesis文件的痛苦(并做了更多)。开始吧:

devnet$ puppeth

并愉快地回答问题(每个值都可以在以后手动更新,所以不要花太多时间为第一次试验设计它)。

Please specify a network name to administer (no spaces, please)
> devnet
What would you like to do? (default = stats)
 1. Show network stats
 2. Configure new genesis
 3. Track new remote server
 4. Deploy network components
> 2
Which consensus engine to use? (default = clique)
 1. Ethash - proof-of-work
 2. Clique - proof-of-authority
> 2
How many seconds should blocks take? (default = 15)
> 5 // for example
Which accounts are allowed to seal? (mandatory at least one)
> 0x87366ef81db496edd0ea2055ca605e8686eec1e6 //copy paste from account.txt :)
> 0x08a58f09194e403d02a1928a7bf78646cfc260b0
Which accounts should be pre-funded? (advisable at least one)
> 0x87366ef81db496edd0ea2055ca605e8686eec1e6 // free ethers !
> 0x08a58f09194e403d02a1928a7bf78646cfc260b0
Specify your chain/network ID if you want an explicit one (default = random)
> 1515 // for example. Do not use anything from 1 to 10
Anything fun to embed into the genesis block? (max 32 bytes)
>
What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> 2
1. Modify existing fork rules
 2. Export genesis configuration
> 2
Which file to save the genesis into? (default = devnet.json)
> genesis.json
INFO [01-23|15:16:17] Exported existing genesis block
What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> ^C // ctrl+C to quit puppeth

附注:来自Clique PoA EIP#225

注意:PoA没有采矿奖励

因此,我强烈建议你将一些ether(以wei为单位定义)分配给genesis文件中的一堆地址,否则你将在没有任何以太的情况下提交,因此无法支付你的交易费用。你可能有一个0的gasPrice,但有时会导致可能受扫描影响的节点的不良行为(如不根据网络上其他节点的配置广播待处理的交易)。不过我鼓励你玩每个参数:)

1.4 初始化节点

现在我们有了genesis.json文件,让我们初始化创始块!必须使用相同genesis文件初始化每个节点。

devnet$ geth --datadir node1/ init genesis.json
devnet$ geth --datadir node2/ init genesis.json

田田!完成。

旁注:加入以太坊主网或Ropsten测试网或Rinkeby测试网时,您的节点如何知道创世体参数? 它们已在params / config.go的源代码中定义。

1.5 创建一个bootnode

启动节点的唯一目的是帮助节点发现彼此(记住,以太坊区块链是对等网络)。节点可以具有动态IP,关闭,然后再打开。bootnode通常在静态IP上运行,因此就像一个pub,节点知道它们会找到它们的配对。

初始化bootnode:

devnet$ bootnode -genkey boot.key

这将创建一个名为enode的值,用于唯一标识你的bootnode(很快就会更多),我们将此enode存储在boot.key文件中。

1.6 中途庆祝下

恭喜!第1章完成:),来试试。

devnet$ tree -L 2

并将输出与1.0节进行比较。希望你应该得到同样的一个tree。

此时设置已完成,我们已准备好使用此区块链。

2. 激活

2.1 启动bootnode服务

devnet$ bootnode -nodekey boot.key -verbosity 9 -addr :30310
INFO [02-07|22:44:09] UDP listener up                          self=enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@[::]:30310

我喜欢对我的bootnode有一些冗长,因为很高兴看到节点在网络上播放乒乓球时(这意味着它正在工作!)。

随意使用你喜欢的任何端口,但请避免使用主流端口(如80 for HTTP)。30303用于公共以太坊网络。

2.2 启动节点

重要时刻!最后(但通常在这里麻烦也来了)。

一切都在一个巨大的命令!我将介绍一些选项,但请做好功课并参考文档

起始节点1

devnet$ geth --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcaddr 'localhost' --rpcport 8501 --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@127.0.0.1:30310' --networkid 1515 --gasprice '1' -unlock '0x87366ef81db496edd0ea2055ca605e8686eec1e6' --password node1/password.txt --mine
  • --syncmode'full',有助于防止错误,丢弃传播有问题的块Discarded Bad Propagated Block
  • --port 30311,是node1的enode端口,必须与bootnode端口不同(如果你遵循我的命令,则为30310),因为我们在本地主机上。在真实网络(每台计算机一个节点)上,使用相同的端口。 --rpcapi,允许列出的模块用于RPC调用(参见3.3节的示例)。有关详细信息,请参阅Geth Management API。如果没有防火墙保护你的节点,每个人都可以调用您的RPC方法,请注意黑客攻击。 --bootnodes,告诉你的节点找到你的bootnode的地址。用引导节点IP替换[::]。不允许域名!只有IP。检查enode URL格式--networkId,如genesis.json文件中所定义。请使用相同的ID! --gasprice'1',我不喜欢在自己的网络上付款:)小心使用gasprice。如果您的交易没有被广播到网络,但只有接收交易的节点正在处理它们,这意味着您发送的交易的天然气价格被网络上的其他节点接受(太低)。没有错误将返回。如果您有两个节点,则只有一个节点将处理事务。这是偷偷摸摸的,将您的网络吞吐量降低了2倍。 --unlock --password --mine,告诉节点解锁此帐户,使用该文件中的密码并开始挖掘(即投票/密封以获得权利证明)。 --targetgaslimit,值参见2.3节中的更新。

节点2相同(更新特定于节点的参数)

devnet$ geth --datadir node2/ --syncmode 'full' --port 30312 --rpc --rpcaddr 'localhost' --rpcport 8502 --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://3ec4fef2d726c2c01f16f0a0030f15dd5a81e274067af2b2157cafbf76aa79fa9c0be52c6664e80cc5b08162ede53279bd70ee10d024fe86613b0b09e1106c40@127.0.0.1:30310' --networkid 1515 --gasprice '0' --unlock '0x08a58f09194e403d02a1928a7bf78646cfc260b0' --password node2/password.txt --mine

此时,你的bootnode应流式传输来自node1(端口30311)和node2(端口30312)的连接,如上部终端窗口所示。Node1(中间终端)和node2(下层终端)应该愉快地挖掘和签署块。 这里我有1秒的时间(在创世纪文件中定义)因此创建了快速块。

2.3 更新你的创世纪文件

我相信你会想要修改你的genesis文件中的一些值。前进!但是,为了使这些更改生效,我们必须初始化一个新的区块链。这是我目前使用的创世纪文件:

{
    "config": {
        "chainId": 1515,
        "homesteadBlock": 1,
        "eip150Block": 2,
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "eip155Block": 3,
        "eip158Block": 3,
        "byzantiumBlock": 4,
        "clique": {
            "period": 1,
            "epoch": 30000
        }
    },
    "nonce": "0x0",
    "timestamp": "0x5a722c92",
    "extraData": "0x000000000000000000000000000000000000000000000000000000000000000008a58f09194e403d02a1928a7bf78646cfc260b087366ef81db496edd0ea2055ca605e8686eec1e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0x59A5380",
    "difficulty": "0x1",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {
        "08a58f09194e403d02a1928a7bf78646cfc260b0": {
            "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
        },
        "87366ef81db496edd0ea2055ca605e8686eec1e6": {
            "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
        },
        "F464A67CA59606f0fFE159092FF2F474d69FD675": {
            "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
        }
    },
    "number": "0x0",
    "gasUsed": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

我已经清理了puppeth在创建文件时包含的空地址(在1.3节)。我还添加了第三个地址,在创建创世块时获得资助。然后我将period从15秒更改为1,以便更快地挖掘这些块(小心,因为一个空块加权1024字节,这里我的chaindata/文件夹每秒增加1024字节(如果块不为空,则更多)。我已经增加了gasLimit以允许每个块进行更多的交易(trully,计算)。

更新:genesis文件中定义的gasLimit仅适用于genesis块!新块的gasLimitDYNAMIC,意味着它的值随着时间的推移而变化,具体取决于父(前一个)块中使用了多少gas。新gasLimit的计算在CalcGasLimit函数(github源码)中完成。如果你想要一个恒定的gas限制,请在运行geth时使用选项--targetgaslimit intValue。我建议将它设置为等于genesis文件中的gasLimit(命令选项是一个整数,而生成值是十六进制),这样你就可以获得一个不再随时间变化的恒定gas限制。鉴于上面的genesis文件带有“gasLimit”:“0x59A5380”,我正在使用--targetgaslimit 94000000运行我的节点,以获得所有块的恒定gas限制。

字段extraData包含允许密封的地址(这就是为什么puppeth很高兴)。

我已经调查了更改periodgasLimit对区块链可以处理的每秒交易数(交易率)的影响。

如果你对genesis文件感到满意。如果节点正在运行,请终止它们(在终端中按ctrl C)。然后删除node1/中的文件夹geth/node2/中的geht/。仅删除geth/文件夹!

然后初始化你的节点。从1.4节开始:

devnet$ geth --datadir node1/ init genesis.json
devnet$ geth --datadir node2/ init genesis.json

然后使用2.2节中的命令再次启动节点

3. 与你的节点交互

伟大的网络生活现在开始:)但如何连接到它并开始探索?

3.1 打开Geth Javascript控制台

使用节点的最简单且可能更直接的方法可能是将Geth javascript控制台附加到其中一个节点。

3.1.1 通过IPC

IPC(进程间通信)仅在本地工作:你应与节点位于同一台计算机上。打开一个额外的终端并连接到你的节点。要连接到node1:

$ cd devnet
devnet$ geth attach node1/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
coinbase: 0x87366ef81db496edd0ea2055ca605e8686eec1e6
at block: 901 (Sat, 10 Feb 2018 21:15:30 CET)
 datadir: /home/salanfe/privateNetworks/devnet/node1
 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>

仅在节点运行时才创建文件geth.ipc。所以如果你的node1关闭,不要指望找到它。

RPC提供对终端中列出的所有模块的访问而不受限制:admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

3.1.2 通过RPC

RPC(远程过程调用)作为HTTP请求在Internet上工作。因此,当您向外界打开RPC时要小心,因为每个人都可以访问您的节点。因此,默认情况下禁用RPC,启用后,它不会授予对所有模块的访问权限。在本指南中,我们使用命令--rpc在我们的Geth节点上允许RPC,并允许访问模块personal,db,eth,net,web3,txpool,miner(来自第2.2节)。 要使用RPC连接到node1:

$ cd devnet
devnet$ geth attach 'http://localhost:8501'
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
coinbase: 0x87366ef81db496edd0ea2055ca605e8686eec1e6
at block: 945 (Sat, 10 Feb 2018 21:16:14 CET)
 modules: eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>

3.1.3 使用Geth Javascript控制台

以下是一些方法示例

> net.version
"1515"
> eth.blockNumber
1910
> eth.coinbase
"0x87366ef81db496edd0ea2055ca605e8686eec1e6"
> eth.sendTransaction({'from':eth.coinbase, 'to':'0x08a58f09194e403d02a1928a7bf78646cfc260b0', 'value':web3.toWei(3, 'ether')})
"0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f"
> eth.getTransactionReceipt("0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f")
{
  blockHash: "0x212fb593980bd42fcaf3f6d1e6db2dd86d3764df8cac2d90408f481ae7830de8",
  blockNumber: 2079,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  from: "0x87366ef81db496edd0ea2055ca605e8686eec1e6",
  gasUsed: 21000,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  status: "0x1",
  to: "0x08a58f09194e403d02a1928a7bf78646cfc260b0",
  transactionHash: "0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f",
  transactionIndex: 0
}
> exit // to quit the Geth javascript console

有关方法的完整列表,请参阅管理APIJSON RPC API

3.2 使用 mist

Mist浏览器提供图形用户界面,用于部署智能合约和管理帐户并与之交互。要通过IPC将Mist连接到本地专用网络,只需执行以下操作:

devnet $ mist --rpc node1/geth.ipc

并通过RPC(确保启用RPC)

$ mist --rpc 'http://localhost:8501'

如果您想使用以太坊钱包而不是mist,则程序完全相同。只需在上面的命令中用ethereumwallet替换mist。

3.3 使用你喜欢的编程语言进行RPC调用

在3.1节中,我们了解了如何手动与Geth API进行交互。现在让我们将我们的PC用于最擅长的领域:自动化。

向你的节点发送JSON-RPC请求的引用和到目前为止是web3.js javascript库。我相信互联网上有很多关于如何使用web3.js库的精彩教程和示例。所以我不会在这里隐瞒任何一个。

JSON-RPC API目前也在使用web3.j库的java中实现,在python中使用web3.py库实现。这些库提供了与web3.js一样使用以太坊区块链的高级方法。

但是,也可以将原始JSON-RPC请求直接发送到你的节点。我认为值得尝试,因为它提供了一个有价值的理解,了解这些高级库如何在幕后工作。

下面是使用python 3将原始JSON-RPC请求发送到节点的简单示例:

$ python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 18:10:19) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import json
>>> session = requests.Session()
>>> method = 'eth_getTransactionCount'
>>> params = ["0x627306090abaB3A6e1400e9345bC60c78a8BEf57","latest"]
>>> PAYLOAD = {"jsonrpc":"2.0",
...            "method":method,
...            "params":params,
...            "id":67}
>>> PAYLOAD = json.dumps(PAYLOAD)
>>> headers = {'Content-type': 'application/json'}
>>> response = session.post('http://127.0.0.1:8501', data=PAYLOAD, headers=headers)
>>> response.content
b'{"jsonrpc":"2.0","id":67,"result":"0x0"}\n'
>>> json.loads(response.content)['result']
'0x0'

这里记录了方法geth_transactionCount

“account”随机数是一个交易计数器,与工作证明的随机数无关。帐户现时值为零意味着地址0x627306090abaB3A6e1400e9345bC60c78a8BEf57从未在网络上执行任何交易:0x0是十六进制表示为零。

3.4 在你的专用网络上使用Truffle部署和测试你的智能合约

Truffle(或Embark,Populus)这样的开发框架是开发和测试智能合约的绝佳工具。

使用时初始化工作空间时

$ truffle init

Truffle创建了一系列文件和文件夹,以帮助你入门。我通常会编辑truffle.js文件

module.exports = {
    // See <http://truffleframework.com/docs/advanced/configuration>
    // to customize your Truffle configuration!
    networks: {
        devnet: {
            host: '127.0.0.1',
            port: 8501,
            network_id: '*'
        },
        ganache: {
            host: '127.0.0.1',
            port: 7545,
            network_id: '*'
        }
    }
};

然后使用这个命令:

$ truffle deploy --network devnet

部署迁移/X_deploy.js中定义的智能合约。或者用于在test/中运行测试

$ truffle test --network devnet

通常,以太坊区块链模拟器Ganache足以运行你的测试。但是我喜欢使用我的私有区块链在真实节点上进行终极测试,而不仅仅是在模拟器上。有了Ganache,我相信抽象层太大了,它的美妙之处还有危险,因为它不需要理解真实节点的复杂性(交易池,gasPrice,gasLimit,节点之间的广播交易),挖掘或投票,计算时间,共识引擎等)。

下一步是什么 ?

这对于本指南来说非常重要。如果你了解这里的一切,我相信你已经处于非常好的轨道上,并且你有一个坚实的基础,你可以自信地继续你的旅程。

你可以通过抓取web3库或制作自己的自定义JSON-RPC包装器来开始开发Dapps(去中心化应用程序)。

在这篇文章中,我将探讨如何使用python仅使用原始HTTP请求与智能合约进行部署和交易。

最后的话

祝贺你做到最后。我希望本指南是全面的,并帮助你完成旅程。我欢迎任何反馈,以改进本指南!

并且非常感谢社区提供所有文档,教程,问答网站和指南。

快乐黑客!

更新:

geth 1.8在本指南发布几天后发布,幸运的是没有破坏任何东西。这篇文章是有效的,并测试了geth 1.7.3和geth 1.8。太棒了:)

我已经了解到每个区块的gas限制是动态的posteriori。因此,我更新了第2.3节,以提供有关此特定案例的更多信息。在我的私人网络中,块大部分时间都是空的,我根本不会减少gas限制!

Clique要求int(N/2+1) sealers(其中N是创世纪文件中定义的sealers数量——在extraData字段中)才能在线运行。

感谢Ivica Aracic指出clique PoA可与单个节点一起工作。出于任何原因,我错过了,我为这种困惑道歉。使用单个节点,我们只需要(A)创建只有一个sealer的genesis文件(extraData中只有1个地址),(B)创建一个帐户,(C)init geth,(D)运行geth,解锁帐户和mine。那么不需要bootnode。

使用geth 1.8如果收到指定的无效主机invalid host specified的错误,请尝试将选项--rpcvhosts值添加到geth命令。见geth --help

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券