以太坊区块链私有链相关操作

以太坊区块链私有链相关操作

小小怪专属

一、安装Geth(Windows版)

安装好后如图有两个文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aEL5XERb-1678259756155)(D:\学习\区块链\image\1.png)]

其中genesis.json是自己创建的文件,也就是创世区块(对整个私链进行初始化设置)

{
	"config": {
	"chainId": 123,
	"homesteadBlock": 0,
	"eip150Block": 0,
	"eip155Block": 0,
	"eip158Block": 0,
	"byzantiumBlock": 0,
	"constantinopleBlock": 0,
	"petersburgBlock": 0,
	"istanbulBlock": 0
	},
	"alloc": {
	 "0x634c4CF26680fa8C2Ef3d8B9FA4E6AE748667BB8": { "balance": "300000000000000000000000000000" }
	},
	"coinbase": "0x0000000000000000000000000000000000000000",
	"difficulty": "0x2000",
	"extraData": "",
	"gasLimit": "0xffffff",
	"nonce": "0x0000000000000042",
	"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
	"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
	"timestamp": "0x00"
}

二、初始化Geth

初始化命令:(要在geth安装的根目录cmd再操作)

geth --datadir . init genesis.json

初始化完成之后根目录的文件目录会变为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUROgGGP-1678259756156)(D:\学习\区块链\image\2.png)]

三、运行Geth客户端:

命令:(同样要在geth安装的根目录cmd再操作)

geth --datadir . --networkid 123 --nodiscover --http --http.addr 0.0.0.0 --http.port 8545 --http.corsdomain "*" --port 30305 –http.api eth,net,web3,personal --allow-insecure-unlock console 2>output.log

运行成功的界面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ru8qLcyc-1678259756157)(D:\学习\区块链\image\3.png)]

四、Geth客户端的相关操作:

1、eth

包含一些跟操作区块链相关的方法

查看所有的信息和eth下的方法
eth
枚举系统中的账户(可以通过下标取得对应的账号)
eth.accounts
查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪
(1 ether = 10^18 Wei)
eth.getBalance()
列出区块总数
eth.blockNumber
获取交易
eth.getTransaction()
获取区块
eth.getBlock()
发起交易  from发起者  to获得者  value交易数量
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
查看当前待确认交易
eth.getBlock("pending", true).transactions

2、net

包含一些查看p2p网络状态的方法

查看p2p网络状态和net下的所有方法
net
查看已连接到的节点数量
net.peerCount

3、admin

包含一些与管理节点相关的方法

查看节点信息以及admin下的所有方法
admin
iner.start(1)时使用该命令可以使新区块挖出后,就停止挖矿
admin.sleepBlocks(1)
查看当前节点的 enode 信息(用于节点的同步和加入)
admin.nodeInfo.enode
参数输入另一个NetWorkID相同的节点的enode 信息,就可以连接到该节点
admin.addPeer()
查看连接到的其他节点信息
admin.peers

4、miner

包含启动&停止挖矿的一些方法

查看miner下的所有方法
miner
开始挖矿
miner.start()
miner.start(1)
停止挖矿
miner.stop()

5、personal

主要包含一些管理账户的方法

查看所有的账户以及账户的密钥位置和personal下的所有方法
personal
创建账户
personal.newAccount()
解锁账户
personal.unlockAccount()

6、txpool

包含一些查看交易内存池的方法

查看交易内存池的所有信息
txpool
交易池中的状态
txpool.status

7、web3

包含了以上对象,还包含一些单位换算的方法

查看web3下的所有对象以及对象方法
web3
Wei 换算成以太币
web3.fromWei()
以太币换算成 Wei
web3.toWei()

五、MetaMask连接私链

MetaMask连接Localhost 8545

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQrrs9js-1678259756158)(D:\学习\区块链\image\5.png)]

连接成功后到设置->网络修改Localhost 8545的链ID为123(创世区块中设置的链ID是123)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMka96MD-1678259756159)(D:\学习\区块链\image\4.png)]

保存完成!

六、MetaMask导入私链账号

七、Remix编写合约

八、私有链合约地址

1、水龙头合约(Faucet.sol)

地址:0x60B587C65ef78e7Ba04D29bfA68a729A4226a56b

pragma solidity ^0.4.17;

contract Faucet {
    function withdraw(uint amount) public {
        require(amount <= 1000000000000000000000);
        msg.sender.transfer(amount);
    }
    function () public payable {}
}

2、NFTMarket(NFTMarket.sol)

地址:0x8DdC08135653292C568D7D5793e1b6a0bf530FC0

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
 
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
 
 
contract NFTMarket is ERC721,  ERC721Enumerable, ERC721URIStorage  {
    using Strings for uint256;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    address private owner;
    mapping (uint256 => string) private _tokenURIs;
    
    string private _baseURIextended;
 
    constructor () ERC721("NFTMarket", "NFTMKT") {
    	owner = msg.sender;
	    //currToken = IERC20(_currTokenAddress);
	}
    
    function setBaseURI(string memory baseURI_) external {
        _baseURIextended = baseURI_;
    }
    
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual 
        override(ERC721URIStorage){
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
 
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
        
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return string(abi.encodePacked(base, tokenId.toString()));
    }
 
    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
 
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal  override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
 
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
 
    function burnNFT(uint256 tokenId) public returns (uint256) {
        require(msg.sender == ownerOf(tokenId),"Only the owner of this Token could Burn It!");
        _burn(tokenId);
	    return tokenId;
    }
 
    function mintNFT(address _to,string memory tokenURI_) public returns (uint256){
        _tokenIds.increment();
 
        uint256 newItemId = _tokenIds.current();
        _mint(_to, newItemId);
        _setTokenURI(newItemId, tokenURI_);
 
        return newItemId;
    }
 
    function transNFT(address _from,address _to,uint256 tokenId) public returns (uint256) {
        require(msg.sender == ownerOf(tokenId),"Only the owner of this Token could transfer It!");
        transferFrom(_from,_to,tokenId);
        return tokenId;
    }
 
    function destroy() virtual public {
        require(msg.sender == owner,"Only the owner of this Contract could destroy It!");
        selfdestruct(payable(owner));
    }
}

3、NFT商家合约(NFTStore.sol)

地址:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
 
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
 
contract NFTStore is Context, ERC20 {
    address private owner;
    struct Mints {
        address minter;
	    uint256 amount;
    }
 
    mapping(uint256 => Mints) public tokenToMint;
    mapping(uint256 => uint256) private tokenAmounts;
    /**
     * @dev Constructor that gives _msgSender() all of existing tokens.
     */
    constructor (uint256 tokenNum) ERC20("NFTStore", "NFC") {
        owner = msg.sender;
        _mint(_msgSender(), tokenNum * (10 ** uint256(decimals())));
    }
 
    function mint(address _to,uint256 amount,uint256 tokenId) public {
        require(msg.sender == owner,"Only the owner of this Contract could mint!");  // 本文添加,否则函数 mint 会有逻辑错误
        _mint( _to, amount) ;    // 如果没有添加上一句 require,此处会有逻辑错误,任何人都可以免费获得NFC
        tokenAmounts[tokenId] = amount;
        Mints memory mintted = Mints({
            minter: _to,
            amount: amount
        });
        tokenToMint[tokenId]=mintted;
    }
 
    function getTokenAmount (uint256 tokenId) public view returns (uint256) {
        return tokenAmounts[tokenId];
    }
 
    function gettokenMints(uint256 tokenId) public view returns ( address, uint256){
        Mints memory mintted = tokenToMint[tokenId]; 
        return (mintted.minter,mintted.amount);
    }
    
    function destroy() virtual public {
	    require(msg.sender == owner,"Only the owner of this Contract could destroy It!");
        selfdestruct(payable(owner));
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. 安装Ubuntu系统 首先需要在服务器上安装Ubuntu系统(建议使用16.04及以上版本)。可以使用云服务器或者本地安装。 2. 安装Geth Geth是以太坊的官方客户端,可以用于搭建私有链和联盟链。可以使用以下命令安装: sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install -y ethereum 安装完成后,可以使用以下命令查看版本号: geth version 3. 创建创世块 首先需要创建创世块,创世块是区块链的第一个区块,包含了一些初始化的信息,如初始账户、初始余额、挖矿难度等。可以使用以下命令创建创世块: geth --datadir /path/to/chaindata init /path/to/genesis.json 其中,/path/to/chaindata为存储区块链数据的路径,/path/to/genesis.json为创世块的配置文件。 4. 启动节点 使用以下命令启动节点: geth --datadir /path/to/chaindata --networkid 1234 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi "eth,web3,personal,net" console 其中,/path/to/chaindata为存储区块链数据的路径,--networkid指定联盟链的ID,--nodiscover禁用节点发现功能,--rpc启用RPC服务,--rpcaddr指定RPC服务监听的IP地址,--rpcport指定RPC服务监听的端口号,--rpcapi指定可用的RPC接口,console表示启动控制台。 5. 创建账户 在控制台中使用以下命令创建账户: personal.newAccount("password") 其中,password为账户的密码。 6. 启动挖矿 使用以下命令启动挖矿: miner.start() 7. 部署智能合约 使用Solidity编写智能合约代码,并使用Remix或Truffle等工具进行编译和部署。 以上就是在Ubuntu系统上搭建以太坊联盟链的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值