以太坊私有链搭建教程

2023-11-16

写在前面

写这个主要是为了记录下自己的学习过程,同时如果能帮助到同样想搭建私有链的朋友们,那是再好不过了

Step 1 环境搭建

私链搭建有三宝,环境,终端和钱包。我这里用到的是Geth客户端,所以环境当然就是指Go语言运行环境。Ethereum的终端(客户端)有很多语言(C++,Python…bala..bala)的实现版本,这里我用的是Go语言的实现版本,也是使用较多的版本,这里就随个大流,毕竟用的越多,资料越丰富[1]
- Go环境
Go环境的安装还是算方便的,在不用理解各种目录的情况下,直接下载客户端安装好就ok了。以前Go是被墙了的,不过现在谷歌推出了中国开发者的官网,但是我进去后也没看到下载。为了方便大家,我在网盘保存了一份,大家可以下载,Windows版密码:jq7a,Linux版密码:ngbp,Mac版密码:lavf。想要了解具体Go环境安装及其目录关系,大家可以自行搜索。

  • Geth客户端
    Geth的安装很简单。
    Windows的用户很方便,直接下载客户端即可。不过貌似被墙了,我这里提前下载过一个,放在了百度网盘。虽然个人很不喜欢流氓网盘,因为不买会员,下载速度奇慢,百兆宽带也枉然,不过也实在没啥好地方放。大家可以下载安装,密码:zzch
    Mac,Ubuntu的同学也可以方便的安装端执行以下命令即可完成安装,FreeBSD等其余Linux版本的同学可以下载源码编译安装。
Mac同学
brew tap ethereum/ethereum
brew install ethereum
//开发版的安装可以加上 --devel参数(如下),我没加,直接用的上面的命令,二选一即可吧
brew install ethereum --devel

Ubuntu同学
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
  • Mist或Ethereum钱包
    我用的Mist钱包源码,及Ethereum的钱包安装包。钱包的安装包安装方式与之前无异,这个安装比较简单,下载对应平台的安装包即可。我也提供我放到百度网盘的Ethereum钱包安装包。Mac安装包下载密码:qfug,Linux的deb安装包下载密码:8jvr,Windows安装包下载密码:epul
    我是下载Mist钱包源码,然后安装了开发环境的。事实证明,如果不是非要弄山寨币修改钱包,还是不要折腾源码钱包,直接用安装包装Ethereum钱包。如果对自家网络比较有信心,不妨一试,我反正运行命令后,去城市郊区玩儿了两天回来,亲眼见证了安装完成的最后一刻。
    开发环境安装[2]
    先安装Node.js环境,我选择的推荐的8.9.4LTS安装
    然后依次运行下面的命令,安装依赖(我知道,你肯定会直接拷贝命令的,别把$也拷贝下来了):
//安装依赖:
$ curl https://install.meteor.com/ | sh
$ curl -o- -L https://yarnpkg.com/install.sh | bash
$ yarn global add electron@1.7.9
$ yarn global add gulp

//下载钱包源码并运行,相信我,你一定会看见钱包连接节点的界面!
$ git clone https://github.com/ethereum/mist.git
$ cd mist
$ yarn

此时,三个小时已过去,一下午没了…下载上传,码字不易。不过这一切是值得的,你即将运行以太坊,激不激动!我反正已经肝儿颤了。接下来,进入主题,运行以太坊私有链!

Step2 修改创世块

以太坊,比特币等的区块链都是从创世块开始的(你可以简单理解成链表的头结点),创世块是要手动配置后生成的。下面是创世块的配置文件(也就是一个Json文件)。修改好后保存为genesis.json即可。 当然,你想换个canglaoshi.json也没人说什么[1]

{
  "config": {
        //区块链的ID,你随便给一个就可以
        "chainId": 21,
        //下面三个参数暂时不知道干啥的
        //等我知道了补上,或者有哪位大神知道
        //可以在评论里指点我,谢谢
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  //用来预置账号以及账号的以太币数量,应该也就是所谓的预挖
  //我这里不需要预挖,所以给了个空对象
  //如果需要可以这样加
  //"alloc": {
  //"0x0000000000000000000000000000000000000001": {"balance": "111111111"},
  //"0x0000000000000000000000000000000000000002": {"balance": "222222222"}
  //}
  "alloc"      : {},
  //币基地址,也就是默认的钱包地址,因为我没有地址,所以全0,为空
  //后面运行Geth后创建新账户时,如果Geth发现没有币基地址,会默认将第一个账户的地址设置为币基地址
  //也就是矿工账号
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  //挖矿难度,你可以随便控制哦,这里设置的难度比较小,因为我喜欢钱来得快
  "difficulty" : "0x4000",
  //附加信息,随便填个文本或不填也行,类似中本聪在比特币创世块中写的报纸新闻
  "extraData"  : "",
  //gas最高限制,以太坊运行交易,合约等所消耗的gas最高限制,这里设置为最高
  "gasLimit"   : "0xffffffff",
  //64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊黄皮书中的要求
  //直接用我这个也可以
  "nonce"      : "0x0000000000000042",
  //与nonce共同用于挖矿,注意他和nonce的设置需要满足以太坊黄皮书中的要求
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  //上一个区块的Hash值,因为是创世块,石头里蹦出来的,没有在它前面的,所以是0
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  //创世块的时间戳,这里给0就好
  "timestamp"  : "0x00"
}

Step3 打开你的Geth客户端,给它找点事做

修改好创世块的Json文件后,我们就可以利用它来创建私有链了。创建一个文件夹来存放你的创世块文件。我这里就叫eth_test,里面放着我的创世块Json文件image.png

接下来,打开终端,输入下面这个命令[3][7]

//--datadir 后面跟的eth的工作目录,你随便给一个文件夹就行,区块的数据会存在这个文件夹里
// init 后面跟的参数是genesis.json文件所在位置。我是在genesis.json文件所在的目录打开的终端,所以不需要给genesis.json的路径,给出文件名即可
geth --datadir "your/ethdata/filelocation" init your/genesis.json/loaction

image.png

如果你指定的目录下面出现了红框的文件夹,终端中出现Successfully wrote 等信息,恭喜你,创世块创建完成!

然后我们开启一个Geth节点,输入下面的命令:

geth --datadir "/Users/guojh/Documents/ethTestFiles/eth_test" --identity "Guo Chain" --networkid 19900418 --port 61916 --rpcport 8206 console

//--datadir 后面跟的是你指定的工作目录
//--identity 后面跟的是你的区块链标识,随便写
//--networkid 后面跟的是你的网络id,这个是区别区块链网络的关键
//--port  --rpcport 你随便给一个就行,别跟在用的端口重复就行

如果你得到的结果如下图,说明你成功开启了Geth的节点,并进入JavaScript终端。注意箭头,第一个箭头位置就是创世块中配置的chainId。最后一条INFO告诉你ipc文件位置,这个后面会用到。

image.png

进入JavaScript终端后,你可以输入下面三个命令,创建一个账户。在创建账户之前,coinbase地址是空的,创建完账户后,coinbase为刚才创建的账户地址。

//创建一个新账户
personal.newAccount("123456")
//user1变量保存刚才创建的账户,可以看出,eth.accounts数组存放了账户地址
user1 = eth.accounts[0]
//解锁刚才创建的账户,如果不解锁,不能转账
//Geth隔一段时间就会锁定账户,所以需要解锁
personal.unlockAccount(user1, "123456")
//查看coinbase
eth.coinbase

image.png

输入命令查看账户余额
eth.getBalance(user1)
可以看到账户余额为0
image.png

现在,开始为自己赚钱吧~ 输入挖矿命令:
miner.start()
如果你看到终端不停有输出,那就对了。如果想停止挖矿,输入停止命令:
miner.stop()
在输入的时候你会发现输入的文字被打印出的log打乱了,不用担心,输你的,不影响。此时再查看余额,你变成富翁了!
到这里,我想到个问题,现在没有任何交易,区块里也没有任何交易信息,这也能得到以太币奖励?后来在Gitter的go-ethereum讨论组中咨询得知,只要是能产生区块,就有奖励,即使区块中没有任何有用信息。
image.png

Step4 多节点测试

只有一个节点略显孤单,我们再创建一个节点,让他俩有情人终成眷属 :)。这里我们会在创建节点命令中增加一个参数 bootnodes,在创建节点的同时,让新节点连接上刚才创建的节点。bootnodes跟的参数是节点地址。如果没有加bootnodes也不怕,创建好节点后调用admin.addPeer(“enode”),将enode替换成节点地址即可。

将Step3中开启节点的命令替换成下面的命令(这里的genesis.json和第一个节点的必须一样,否则就是两个链了。另外,两个端口号不要和第一个节点重复,工作目录也不要重复,但是networkid必须一致):
略有点长

geth --datadir "your/ethdata/filelocation" init your/genesis.json/loaction
geth --datadir "your/ethdata/filelocation" --identity "Guo Chain" --networkid 19900418 --port 61917 --rpcport 8207 --bootnodes "enode://40fadf14ab5084f03dcea80f1380e60ce270d423f45e1ba71e37ba892d9822bb0e681cf3c551e13f5a82ced6468c4dc4f3942925878ea0f57165ab5e1299bd2b@192.168.3.32:61916" console

这里的enode可以在第一次创建的节点中输入:
admin.nodeInfo.enode
终端会显示出节点enode信息,用你的本机IP替换[::]
image.png

同样看到下图,进入JavaScript控制台,就是看到亲人了
image.png

但是如何验证两个节点连接上了呢?见证奇迹的时刻到了。在新节点中创建账户,创建完成后,看!发现没,节点在同步区块数据了!说明两个节点连上了!
image.png

Step5 连接钱包

在终端中进入之前下载好的Mist钱包的源码文件目录中。现在就要用到之前启动节点时创建的ipc文件了

  • 首先来说说使用Ethereum钱包的连接方式[4][5]
    我使用的是Mac,就是在终端输入下面的命令,给钱包一个rpc参数,其余平台应该也类似,就是通过终端启动钱包,并提供参数(geth.ipc文件就是你启动完节点后,自动生成的,就在节点目录下,钱包连接到私有链需要提供这个文件,否则会连接到主链上):
open -a /Applications/Ethereum\ Wallet.app/ --args --rpc /Users/guojh/Documents/ethTestFiles/eth_test/geth.ipc

image.png
瞬间发现我还挺有钱的。注意到那个红框了吗,说明确实连接到的是私有链。

接下来我们可以转账了!
在另一个节点查看地址(可以直接输入user1查看),拷贝下来地址,粘贴到钱包中转账
image.png
image.png
点击send,输入密码,转账完成!
去另外一个节点终端查看,却发现余额是0
image.png
这是怎么回事呢?朋友,不要忘了,交易是需要矿工确认的。矿工在哪里呢?矿工就是你自己。交易通知到P2P网络中的节点,但是没有矿工确认交易,所以交易没有执行。我们现在有两个节点,随便哪个开启挖矿,就能确认交易。当然,也可以玩儿玩儿,两个节点同时开启挖矿,看看谁能抢先确认交易。你可以看到,这边在挖矿,钱包就收到了确认交易的消息

这时,再查看另一个节点的余额,窃喜吧,朋友,你有钱了
image.png

  • 下面说下Mist钱包源码方式
    输入下面的命令:
yarn dev:electron --rpc /Users/guojh/Documents/ethTestFiles/eth_test/geth.ipc --node-ipcpath /Users/guojh/Documents/ethTestFiles/eth_test/geth.ipc

敲击回车,你有可能看到如下界面

这就略显尴尬了,一片空白。咋办呢,我猜想可能是区块同步有问题,要不开开采矿试试看钱包连上没。结果就连上了!激动啊!但人就是贱啊,我想看看是不是挖矿就一定能连上,立马关闭钱包,再试一次,然后悲剧了,从此以后,Mist钱包就打不开了,每次都是一闪而过,就消失了,终端提示窗口被关闭。有没有哪位大神知道原因?
image.png
过了很久之后我又连接上过一次,钱包操作方法和Ethereum钱包一样,然后就又打不开了,本文的遗憾…后面我找到原因再来补充更新这个地方

如果不想用钱包,也可以使用命令来转账,你需要输入from,转账来源,to,转账目的地址,value,转账金额,这里把1个ether转成以太币最小单位Wei来发送
eth.sendTransaction({from: "0x5fba50fce50baf0b8a7314200ba46336958ac97e", to: "0x0a8c35653d8b229c16f0c9ce6f63cffb877cfdcf", value: web3.toWei(1, "ether")})
回车后开启挖矿,一样可以转账。

Step6 创建你的代币

在以太坊上创建代币很简单,但是这种代币的交易是基于以太坊,也就是交易费还是要用以太币支付。如果需要修改矿工奖励,有自己的钱包等,还是需要修改以太坊源码的,这里我先介绍最简单的代币创建[6]

为了简便,我们在私有链上创建代币,跟在以太坊主链上创建代币是一样的操作方法。按照Step5的方法打开钱包(Mist或者Ethereum钱包都可以,看哪个你能打开…),连接到你的私有链上。
点击右上方的合约按钮(CONTRACTS),然后点击部署新合约(DEPLOY NEW CONTRACT)
image.png

将下面的代码拷贝到SOLIDITY CONTRACT SOURCE CODE编辑框中(编辑框中默认的代码全部删除)

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract TokenERC20 {
    // Public variables of the token
    string public name;
    string public symbol;
    uint8 public decimals = 18;
    // 18 decimals is the strongly suggested default, avoid changing it
    uint256 public totalSupply;

    // This creates an array with all balances
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;

    // This generates a public event on the blockchain that will notify clients
    event Transfer(address indexed from, address indexed to, uint256 value);

    // This notifies clients about the amount burnt
    event Burn(address indexed from, uint256 value);

    /**
     * Constrctor function
     *
     * Initializes contract with initial supply tokens to the creator of the contract
     */
    function TokenERC20(
        uint256 initialSupply,
        string tokenName,
        string tokenSymbol
    ) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);  // Update total supply with the decimal amount
        balanceOf[msg.sender] = totalSupply;                // Give the creator all initial tokens
        name = tokenName;                                   // Set the name for display purposes
        symbol = tokenSymbol;                               // Set the symbol for display purposes
    }

    /**
     * Internal transfer, only can be called by this contract
     */
    function _transfer(address _from, address _to, uint _value) internal {
        // Prevent transfer to 0x0 address. Use burn() instead
        require(_to != 0x0);
        // Check if the sender has enough
        require(balanceOf[_from] >= _value);
        // Check for overflows
        require(balanceOf[_to] + _value > balanceOf[_to]);
        // Save this for an assertion in the future
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        // Subtract from the sender
        balanceOf[_from] -= _value;
        // Add the same to the recipient
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);
        // Asserts are used to use static analysis to find bugs in your code. They should never fail
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    /**
     * Transfer tokens
     *
     * Send `_value` tokens to `_to` from your account
     *
     * @param _to The address of the recipient
     * @param _value the amount to send
     */
    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }

    /**
     * Transfer tokens from other address
     *
     * Send `_value` tokens to `_to` on behalf of `_from`
     *
     * @param _from The address of the sender
     * @param _to The address of the recipient
     * @param _value the amount to send
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    /**
     * Set allowance for other address
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     */
    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    /**
     * Set allowance for other address and notify
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     * @param _extraData some extra information to send to the approved contract
     */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData)
        public
        returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    /**
     * Destroy tokens
     *
     * Remove `_value` tokens from the system irreversibly
     *
     * @param _value the amount of money to burn
     */
    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);   // Check if the sender has enough
        balanceOf[msg.sender] -= _value;            // Subtract from the sender
        totalSupply -= _value;                      // Updates totalSupply
        Burn(msg.sender, _value);
        return true;
    }

    /**
     * Destroy tokens from other account
     *
     * Remove `_value` tokens from the system irreversibly on behalf of `_from`.
     *
     * @param _from the address of the sender
     * @param _value the amount of money to burn
     */
    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);                // Check if the targeted balance is enough
        require(_value <= allowance[_from][msg.sender]);    // Check allowance
        balanceOf[_from] -= _value;                         // Subtract from the targeted balance
        allowance[_from][msg.sender] -= _value;             // Subtract from the sender's allowance
        totalSupply -= _value;                              // Update totalSupply
        Burn(_from, _value);
        return true;
    }
}

image.png

接下来选择Token ERC 20
image.png

你会看见下面出现了3个输入框,填入对应信息
image.png

下一步,选择手续费,这个看你了,不过肯定是越高,矿工处理速度越快(在主链要注意这点,我们现在是私有链,无所谓),点击DEPLOY,输入你账户的密码。
image.png
image.png
在主链上部署时要注意,有时候会提示你部署错误,通常原因都是你手续费给的不够,调高一点点手续费吧。另外,我还碰到过交易提交了,但是没有任何矿工处理我的交易,几天都如此,开始我很郁闷,不敢再部署,怕多给钱。不过后面等不下去了,又建了一个,手续费调高了一点,马上就处理了。目测要么是手续费太低,没矿工处理,要么是以太坊拥堵(直到现在一个月过去了,还是没处理,估计废了)。

最后一步,开启挖矿,处理自己的交易。其实可以不用等到12个确认,有一个确认,你的交易就被处理了。挖矿完成后,再次点击合约(CONTRACTS),看,代币做好了,200w个!
image.png

你现在是代币的发行者了!我们试着把代币转一些给我们的另一个节点。
点击钱包的发送(SEND),输入另一个节点的地址,输入转账金额,先转它10w个,币太多,没办法。下面注意了,前面转账的时候,只有ETHER,现在多了个刚才创建的代币,毫不犹豫选择它(注意下,千万不要把主链上的以太币转到私有链的钱包地址,否则你的以太币就消失在茫茫区块链中了)。
image.png

同样,选择手续费额度,点击发送(SEND),输入密码后,开启挖矿处理交易。交易处理完后,再看我们的CONTRACTS里的JHCoin,少了10w个
image.png
现在请点击JHCOIN(也就是你的代币),拷贝你的代币地址
image.png

我们可以把钱包连接到另一个节点(如果钱包老是在连接节点中,开启钱包连接节点的挖矿程序,一下就能连上),发现并没有看到我们刚才转的代币,怎么回事呢?是这样,钱包不会自动识别新代币,要手动添加后,才能显示,这就是为什么要拷贝代币地址的原因。
还是点击钱包右上方的合约(CONTRACTS)按钮,点击最下面的关注代币(乱翻译的…原文是WATCH TOKEN)
image.png

将刚才拷贝的代币地址粘贴过来,点击OK
image.png
再看看,10w代币到账!
image.png

到此为止,1天过去了,不易啊,腰都坐酸了。

写在后面

写这篇教程,或者说我自己搭建的时候,搜索了很多资料,总结出一个经验,官方文档或者Github上,都会给出最基本,最简单的操作方法,结合网友们的文章看,更容易搭建起来。
在搭建过程中,你会更加具体的感受到区块链的工作方式,我觉得还是很有助于理解以太坊或其它基于区块链技术的项目。
有兴趣的可以加群讨论,一起学习 701477586

经作者同意,转载自简书

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊私有链搭建教程 的相关文章

  • 10个程序员可以接私活的平台和一些建议!

    来源 http mrw so 5isQLi 什么样的私活不能接 1 没有第三方担保的个人对个人的尽量不要接 双方都没保障 出了问题很大的可能撕破脸皮不了了之 2 一上来就直接说给我开发一个什么软件 不说具体需求 没有需求文档的都不靠谱 这样
  • 金融圈:Hoping Club华英会将重金注资收购REVA

    近期 金融圈有消息传出 华英会或将注资收购REVA提高其所持有的股份 来获取REVA中国大陆区ArtStreet质押平台的运营权 这一消息受到了很多业内人士的关注 一旦此次收购坐实成功也就意味着华英会将获得 中国大陆REVA质押平台的运营权
  • 荐读

    本文转自 链闻 ChainNews 作者 Karen 虽然区块链技术诞生至今不过短短十余年 但是东西方天然的文化差异在加密世界中同样留下了一些痕迹 当社交媒体上关于 东方区块链 只关心币价 利益和投机而只有 西方区块链 才关心底层技术的革新
  • 区块链技术及应用概述

    一 基本概念 什么是区块链 区块链是一种以密码学方式保证的不可篡改和不可伪造的分布式账本 关键特点 去中心化 不可篡改性 匿名性 安全可信 区块链架构 1 数据层 主要描述区块链系统的物理形式 它是从Genesis区块开始的区块链链结构 包
  • Gavin Wood Web3峰会最新演讲:波卡不是智能合约平台,而是平台的平台(全文)...

    在波卡上 每个平台都在用高性能 高效率和最优的方式做着自己擅长的事 而不必让它们的用户用底层平台的货币进行支付 从而将可定制性和灵活性提高了一个台阶 本文谨代表作者个人观点 不代表火星财经立场 该内容旨在传递更多市场信息 不构成任何投资建议
  • 区块链学习笔记(六)——区块链的分类

    文章目录 一 强调 二 公有链 联盟链 私有链 1 公有链 2 联盟链 3 私有链 总结 一 强调 先做一下重复强调 区块链技术是集分布式存储 点对点传输 共识机制 加密算法 数据区块等概念于一体的新兴技术集合 二 公有链 联盟链 私有链
  • 区块链技术是如何应用到版权维护上?

    随着视频和音乐行业的迅速发展 数字出版已经形成完整的产业链 带来一些可观的收入 但是也伴随侵权的现象发生 那么区块链技术怎么运用到作品版权保护上呢 1 时间戳 我们知道区块链有一个 时间戳 这个可信时间戳由权威机构签发 能证明数据电文在一个
  • 阿里巴巴都害怕的区块链电商到底是什么?

    近日 区块链权威机构中国通信工业协会区块链专业委员会 CCIAPCB 发出倡议 联合各界将中共中央政治局10月24日集体学习区块链主席讲话日作为 区块链中国日 此次中央将区块链技术放在了国家战略层面高度上 让区块链一时间成了全民热点 特别是
  • 交易的本质 什么样的信仰,决定什么样的交易人生

    什么样的信仰 决定什么样的生活 同样 什么样的理念 也决定了什么样的交易 多数的交易员都把能否在交易市场稳定化盈利归结于自己从事这个行业的时间 通常很多人会说五年入门 十年小成等等 好像只要坚持个五年十年就能够在交易市场找到自己的位置 你信
  • 引介

    转载自 https ethfans org posts rlp encode and decode RLP编码和解码 RLP Recursive Length Prefix 递归的长度前缀 是一种编码规则 可用于编码任意嵌套的二进制数组数据
  • 链语BTChat力推“加密+社交” 引领区块链新社交时代

    近些年来互联网的发展日新月异 大数据化 人工智能 物联网这些都在成为人们生活中触手可及的东西 而区块链技能则被认为是继互联网之后最具颠覆性的创新技术 此前区块链技术在金融服务业 游戏 供应链等不同的产业中都有着广泛应用 同样的对于社交平台而
  • AWS动手实验 - 创建一个Web3网站

    实验操作和录播 亚马逊云科技开发者社区 web3 dApp demo README CN md at main Chen188 web3 dApp demo GitHub 注意事项 按照操作手册进行即可 需要注意到的几个地方 1 EC2 的
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • 波场TRON将致力于推动各方合作打击恐怖主义融资

    随着加密行业的蓬勃发展 新的挑战也接踵而至 近期 有外媒报道称 哈马斯等美国认定的国际恐怖组织涉通过波场TRON进行融资活动 在这场风波中 区块链项目波场TRON似乎成为了质疑的焦点 然而 当我们深入了解事实真相时 或许会发现事情并非传言中
  • NFTScan | 11.27~12.03 NFT 市场热点汇总

    欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总 周期 2023 11 20 2023 11 26 NFT Hot News 01 Web3 教育平台 Open Campus 获 Binance Labs
  • Sui生态DeFi将参加Builder DAO举办的活动,为期三天畅谈如何Build on Sui

    LeadUp the Night是一个定期举办的MeetUp活动 由Builder DAO邀请区块链各方项目开发者 VC担任本活动的讲师 这个活动旨在促进区块链技术的发展和应用 让参与者有机会开发创新的区块链应用 探索区块链技术的潜力 12
  • 默克尔树(Merkle Tree)

    默克尔树 Merkle Tree 是一种哈希树的变体 它是一种有向无环图 DAG 通常用于数据完整性验证 它以密码学家拉尔夫 默克尔的名字命名 是由一系列哈希值构成的树状结构 默克尔树的特点是 它的每个非叶子节点都是其子节点的哈希值的哈希
  • 在区块链中看CHAT的独特见解

    问CHAT 谈谈对区块链以及区块链金融的理解 CHAT回复 区块链是一种去中心化的分布式数据库技术 这种技术通过加密算法 使数据在网络中传输和存储的过程变得更加安全可靠 区块链的出现引领了存储 交易等形式的革命 改变了诸多行业的运作模式 首
  • 英国金融时报关注TRX登陆Mercado Bitcoin交易所:波场TRON强化南美洲布局,国际化进程持续加速

    近日 波场TRON网络原生代币TRX正式上线巴西最大的合规加密交易所Mercado Bitcoin 英国金融时报 Decrypt Blockworks等财经及加密行业权威媒体对该话题进行了报道 表示此次合作是波场TRON全球业务增长的有力证
  • 案例研究:YGG 如何通过 GAP 帮助 Pixels 扩大玩家群体

    在 Sky Mavis 联合创始人 Jeffrey Jihoz Zirlin 在 YGG Web3 游戏峰会 W3GS 上发表主题演讲时 他向在场的人们透露 MMO 农场游戏 Pixels 的日活跃用户数已经超过了 130 000 人 这使

随机推荐

  • Mac 安装openssl

    1 安装openssl brew install openssl 1 1 2 修改环境变量 export PATH usr local opt openssl 1 1 bin PATH 3 创建软链接 cd usr local includ
  • es统计所有数量的坑

    最近在统计线上的数量时 会发现始终都是10000 觉得很奇怪 先来说一下场景 我使用的是7 2版本的es 需要统计所有数量 后来发现数量下面有个relation gte的属性 然后在网上一搜 发现es 7 X在数据量很大时 数量都会是100
  • Linux Ubuntu安装RabbitMQ服务

    文章目录 前言 1 安装erlang 语言 2 安装rabbitMQ 3 内网穿透 3 1 安装cpolar内网穿透 支持一键自动安装脚本 3 2 创建HTTP隧道 4 公网远程连接 5 固定公网TCP地址 5 1 保留一个固定的公网TCP
  • burpsuit to run burp suite using java 17+

    根据报错提示 在命令行运行时后面加上这句代码 add opens java desktop javax swing ALL UNNAMED add opens java base java lang ALL UNNAMED 即 javaw
  • 数据结构第六章——图

    数据结构第六章 图 图的定义和术语 G V E V 顶点 数据元素的 有穷非空集合 E 边的有穷集合 无向图 每条边都是无方向的 有向图 每条边都是有方向的 完全图 任意两个顶点都有一条边两连 无向完全图 n个顶点 n n 1 2条边 有向
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】需要打开多少监控器

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 需要打开多少监控器 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • Linux学习(三):删除命令rm的注意事项

    rm fir 文件或者目录 f 就是force的意思 忽略不存在的文件 不会出现警告信息 i 互动模式 在删除前会询问用户是否确定操作 r 递归删除 最常用的目录删除 这是非常危险的参数
  • vue_elementui_formatter的使用方法_elementui提取table表格使用formatter方法

    后台管理系统中用到了非常多的表格 一般为了方便都会讲表格进行提取 形成公共组件 提取表格时会遇到返回的json数据中要对单个字段进行处理 如时间戳转换 状态转换等 封装的表格组件代码
  • 解决Win10无法安装.Net Framework 3.5,错误代码0x800F081F

    重新安装了一遍Win10 但是不知怎的无法安装 net framework 3 5 即便是下载离线安装包也没法用 网上有人说需要使用win10的ISO文件 个人感觉太麻烦 在这里分享一个很方便的操作 首先 你需要下载cab版的 net3 5
  • caffe学习记录(三):多标签分类/回归训练(下)

    接上篇 我们已经为caffe添加了多标签分类训练功能 多标签分类的训练过程和单标签非常相似 同样包含以下几个步骤 一 准备多标签分类 回归训练的数据集 train txt val txt test txt 这里我们以MTCNN人脸检测网络中
  • 如何基于Llama 2搭建自己的大模型?4位技术大牛手把手教你

    Datawhale分享 大模型应用 机器之心 x Datawhale Meta 的 Llama 2 一开源便获得了 将改变大模型格局 的广泛认同 很大原因是因为它支持了商用 月活用户超过 7 亿需单独申请 这让大模型的竞争不再仅限于巨头之间
  • 网络安全:njRAT远控工具

    远控在渗透实战中的维权操作相当重要 今天为大家介绍一款工具 njrat 一 远控木马 远程控制型木马 远程控制可以对目标计算机进行交互性访问 实时或非实时 可以下发相应的指令触发恶意软件的功能 也能获取目标的各种数据 二 工具使用 1 在一
  • Mac的yarn安装教程,解决zsh: command not found: yarn

    curl o L https yarnpkg com install sh bash open zshrc 文件最后一行添加 export PATH HOME yarn bin HOME config yarn global node mo
  • Android Sqlite Failed to open database(无法打开数据库文件)

    在学习和使用Android SQLite操作的时候碰到一个错误 无法打开文件 10 11 15 00 44 374 E SQLiteDatabase 18129 Failed to open database data data com e
  • ZooKeeper 典型应用场景一览

    ZooKeeper 典型应用场景一览 数据发布与订阅 配置中心 发布与订阅模型 即所谓的配置中心 顾名思义就是发布者将数据发布到ZK节点上 供订阅者动态获取数据 实现配置信息的集中式管理和动态更新 例如全局的配置信息 服务式服务框架的服务地
  • rts5129无线驱动linux,ubuntu下adb工具的安装以及usb接口权限问题error: insufficient permissions for device: user in plugd...

    简述 adb Android Debug Bridge安卓调试桥接器 是Android sdk 安卓开发工具包 里的一个工具 使用该工具可以用CLI直接操作管理真机andriod设备或android模拟器 安装 直接使用apt命令安装and
  • jeecg问题解决方案

    1 jeecg数据库脚本问题 注意 jeecg3 5 2之前版本 不需要数据库脚本 程序会自动初始化数据库 从3 5 2 开始 需要手工执行SQL脚本 初始化数据库 2 Eclipse内存溢出 2014 6 27 15 29 21 org
  • python如何输出数组_python如何显示数组

    np set printoptions方法的相关属性 set printoptions precision None threshold None edgeitems None linewidth None suppress None na
  • 以太坊私有链搭建教程

    写在前面 写这个主要是为了记录下自己的学习过程 同时如果能帮助到同样想搭建私有链的朋友们 那是再好不过了 Step 1 环境搭建 私链搭建有三宝 环境 终端和钱包 我这里用到的是Geth客户端 所以环境当然就是指Go语言运行环境 Ether