可组合性是重用系统组件来开发应用程序的一般能力。例如,乐高积木是许多可以创建的不同结构的构建块。在web3世界中,基于文本的 NFT 只是类似于乐高积木的单词列表,允许社区围绕这些可组合部分构建全自动采集小说网站源码。
源码:xsymz.icu
这篇文章将介绍我如何构建DevDaoStory,这是一部基于DevDaoNFT的动态视觉小说站源码。我将重点介绍我是如何构建以下部分的:
●前端使用服务器端渲染
●使用 OpenSea API 进行身份验证
●使用 Ren'py 引擎生成独特的游戏
前端
用户界面是一个使用 HTML、Bootstrap、JavaScript、jinja2和JQuery构建的网站。我发现使用原语构建最简单,而不是被锁定在像 React 这样的框架中以获得简单的接口。
DevDaoStory 主页
由于我使用 jinja2 进行服务器端渲染,因此该应用程序托管在AWS Lambda和API Gateway上,每个月提供一百万个免费使用的事件,这为托管应用程序提供了一种经济高效的方式。
这个应用只有两个页面,主页和选择你的开发页面。这是用于在用户钱包中呈现 Devs 的代码片段。
{% for dev in devs %}
<div class="col-md-5 offset-md-1">
<div class="card mb-3" style="max-width: 540px;">
<h3 class="card-title mt-3 mx-auto dark-text">Dev #{{dev['id']}}</h3>
<div class="row g-0">
<div class="col-md-5">
<div class="card-body">
<ul class="list-group list-group-flush">
<li class="list-group-item">Os: {{dev['os']}}</li>
<li class="list-group-item">Text Editor: {{dev['textEditor']}}</li>
<li class="list-group-item">Language: {{dev['language']}}</li>
<li class="list-group-item">Vibe: {{dev['vibe']}}</li>
<li class="list-group-item">Location: {{dev['location']}}</li>
<li class="list-group-item">Mind: {{dev['mind']}}</li>
<li class="list-group-item">Industry: {{dev['industry']}}</li>
<li class="list-group-item">Clothing: {{dev['clothing']}}</li>
<li class="list-group-item">Background: {{dev['background']}}</li>
</ul>
</div>
</div>
身份
为了了解 Devs,用户已经连接到后台系统,我利用ethers.js库为用户提供了一种使用 MetaMask签署“登录”消息的方法。
async function connectWallet() {
if (window.ethereum) {
try {
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
console.log("accounts")
console.log(accounts)
walletProvider = new ethers.providers.Web3Provider(window.ethereum)
walletSigner = walletProvider.getSigner();
const base_message = "Login to DevDaoStory"
const signature = await walletSigner.signMessage(base_message)
console.log(signature)
login_info = {}
login_info["address"] = accounts[0]
login_info["signature"] = signature
login_info["message"] = base_message
var login_info_string = JSON.stringify(login_info)
此代码为用户提供了一种允许应用程序读取其公钥的方法,因此可以验证他们的开发人员。
登录 DevDaoStory
一旦用户接受一个 POST 请求,就会发送到服务器以收集用户的详细信息
$.ajax({
type: "POST",
url: "/web3_login",
dataType: "json",
data: login_info_string,
contentType: "application/json",
success: function(data) {
console.log("login finished")
console.log(data)
...
},
error: function(xhr, textStatus, thrownError, data) {
alert("Error: " + thrownError);
$("body").css("opacity", "1");
$("#load_spinner").toggle();
}
})
可以利用web3 python 模块验证该消息。
from web3 import Web3
from eth_account.messages import encode_defunct
def verify_signature(address, signature, message, w3):
"""
Purpose:
Verify user signed the message
Args:
address - address of user
signature - the signature from user
message - message to check
Returns:
boolean - True if verify, false if not
"""
encoded_message = encode_defunct(text=message)
pub_key = w3.eth.account.recover_message(encoded_message, signature=signature)
logging.info(pub_key)
# make sure same case
if w3.toChecksumAddress(pub_key.lower()) == w3.toChecksumAddress(address.lower()):
return True
else:
return False
...
@application.route("/web3_login", methods=["POST"])
def web3_login():
"""
Purpose:
login
Args:
N/A
Returns:
login object
"""
jsonResp = {}
data = request.data
try:
login_info = json.loads(data.decode("utf-8"))
logging.info(login_info)
address = w3.toChecksumAddress(str(login_info["address"]).lower())
message = str(login_info["message"])
signature = str(login_info["signature"])
valid = web3_utils.verify_signature(address, signature, message, w3)
有关设置 python web3 环境的更多信息,请查看文档
开放API
验证消息后,我们现在可以使用OpenSea API为用户获取 Devs。
def get_opensea_assets(userAddress: str, contract: str):
"""
Purpose:
Get assets from opensea
Args:s
userAddress: user to get
contract: contract to get
Returns:
json_obj - Opensea assets
"""
API_KEY = os.environ["OPENSEA_API"]
HEADERS = {"x-api-key": API_KEY, "Accept": "application/json"}
url = "https://api.opensea.io/api/v1/assets"
querystring = {
"owner": userAddress,
"order_direction": "desc",
"offset": "0",
"limit": "20",
"asset_contract_address": contract,
}
json_obj = requests.get(url, params=querystring, headers=HEADERS).json()
return json_obj["assets"]
assets = web3_utils.get_opensea_assets(address, DEVS_CONTRACT)
API 调用将获取有关该项目的所有信息,包括tokenid. 通过在pixel-avatars 项目的基础上构建,我们现在可以获取图像以及定义您的 Dev 的数据,因此可以在前端进行渲染。
结论
DevDaoStory构建带手机版APP小说网站源码很有趣,以确保其他开发者可以从开源源码中易于二开。