区块链概念

区块链属于比特币延伸出来的内容,是一种分布式数据库技术。特性:分布式、公开、去中心化、不可篡改。

关键词:账本、数据库。

区块是一个和结构体,通过父区块和本区块的哈希值进行链接:

如果其中一个数据不小心被篡改,就会因为哈希值关系发生连锁反应。

数据库特点为中心化,而区块链为分布式的。

数据库存储时是一个数据中心链接上所有服务器,区块链的每个提供服务的人都要储存一个链结构。

共识机制

Proof of work:工作量证明、挖矿(原理就是爆破哈希值)。

难度:服务器决定控制交易的时间,也就是控制难度,使得哈希值符合一定的规则,不能太慢也不能太快。要想达到这个要求,就需要引入nonce,即随机数。

当某个区块的哈希值被爆破出来,这个区块就认为是被打包了,系统会给打包的那个人提供奖励机制。

分层模型

数据层:提供数据结构。

网络层:例如Gossip协议:通过最小的代价告诉全网我发起一笔交易,同时避免网络风暴。

共识层:POW,POS,DPOS,PBFT等。

激励层:给矿工发钱的。

以太坊

区块链为去中心化的东西,没了中心化,提供服务的就是处于世界各地的节点。除了一些主链,还有一些测试链,在项目实施之前阿紫本地测试搭建私链,在私链上可以在自己的账户生成很多测试代币,测试链可以找相应的水龙头(faucets),水龙头是一种网站或者程序,可以无偿获取测试币。

以太坊是一种开源的区块链平台和加密货币,它提供了一种去中心化的计算平台,可以执行智能合约和构建去中心化应用程序。与比特币等其他加密货币不同,以太坊不仅仅是一种数字货币,还具备了更广泛的功能。

以太坊的区块链网络上运行着许多节点,这些节点一起维护着整个网络的安全和一致性。以太坊使用自己的加密货币称为 Ether(ETH),它可以用来支付交易费用和奖励参与网络的节点。

通过以太坊,开发人员可以编写智能合约,这是一段以编程方式定义了合约条款和交易规则的代码。智能合约可以自动执行,无需第三方的干预,并且它们在整个以太坊网络上是不可更改的和可信的。这使得以太坊成为构建和部署各种去中心化应用程序的理想平台,包括去中心化金融(DeFi)、数字艺术品、游戏、社交媒体平台等。

总之,以太坊是一个开放的、去中心化的区块链平台,它提供了基于智能合约的计算功能以及构建各种去中心化应用程序的能力。

0xGame2023区块链部分

signin

下面拿0x的这道签到题来进行一次完整的智能合约。

题目地址 (nc连接)101.37.81.166 10000

RPC节点 101.37.81.166 10001

水龙头 101.37.81.166 10002

先nc链接地址:

1
2
3
4
5
6
7
Can you make the isSolved() function return true?

[1] - Create an account which will be used to deploy the challenge contract
[2] - Deploy the challenge contract using your generated account
[3] - Get your flag once you meet the requirement
[4] - Show the contract source code
[-] input your choice:

注意这里我们是可以得到这题的合约代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
contracts/Example.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.9;

contract Greeter {
string greeting;

constructor(string memory _greeting) {
greeting = _greeting;
}

function greet() public view returns (string memory) {
return greeting;
}

function setGreeting(string memory _greeting) public {
greeting = _greeting;
}

function isSolved() public view returns (bool) {
string memory shctf = "welC0meToSHCTF2023";
return keccak256(abi.encodePacked(shctf)) == keccak256(abi.encodePacked(greeting));
}
}

先输入1创建一个账户:

1
2
3
4
[-] input your choice: 1
[+] deployer account: 0x198eDcd4c761B2a011bBB484C262C4286b2b0b75
[+] token: v4.local.qtv-wNcIsX_Xu0gdtuSQjIXNvY5caToIS3_m4iJb0rkBHAhN-uP8FmV3PJcR3mFNGanW5RiSeiU70qVWlQHCAi-mFo12qzKWwYw9WQjP3A_zSVaBh_8DS0D_Abiab_vvCx2dG9YTgzqvRnk47OUeG64LcPIBkbkf8cRZ06VQM8aoyA.R3JlZXRlcg
[+] please transfer more than 0.001 test ether to the deployer account for next step

提示需要先传输一点测试币给deployer account,这里需要用到metamask添加一个RPC节点:

添加方法:网络→添加网络→手动添加网络→自定义网络名称,RPC URL填入http://101.37.81.166:10001(不要加s),链ID可对应获得并输入,符号也是自定义,保存。

添加网络后还得到了我们账号对应的account,去水龙头给我们的账号领币。

然后在主页面里发送一次交易,发送一点钱发送到我们的deployer account,可以花一点额外的钱加速交易。

交易完成后,再次连接,输入我们之前的token后得到合约账户:

1
2
[+] contract address: 0xA77a43bB582DBCECeF68Da5e7B2b518F1276E2Cf
[+] transaction hash: 0x1bace381e6160bd9350108ab510fd3eee4bb3622db14a697456d98ee0989d292

和合约账户进行交互,完成后局可以得到flag,交互的方法有很多,这里可以用remix:https://remix.ethereum.org/

新建一个sol文件,把之前的合约代码放里面编译一下,然后开始部署:

1.部署的环境有三种:

前两个都是JVM,本地测试用;第三个就是和MetaMask交互,用测试链;第四个就是你自己提供的RPC,就是私链。

部署好之后需要进行一个交互,这里需要传一个字符串即可:

1
string memory shctf = "welC0meToSHCTF2023";

交互完后metamask会帮助我们打包好交易,这个合约就完成了。再次连接nc,获取flag。