注:作者是一位业余开发者,他想探索并记录如何在 Pi 平台上创建 Web3 应用。这篇文章将带你经历一段丰富多彩的 Pi 应用开发历程,并逐步剖析他的开发经验。它可以让开发者了解构建 Pi 应用是多么简单直观——即使从经验不足的开发者角度来看也是如此。
享受阅读这篇引人入胜的文章吧!开发者们,亲眼见证将你的应用带给数千万 Pi 社区成员是多么快速!更多信息,请点击此处查看 Pi 平台的正式文档,以及点击此处查看完整的社区开发者指南。
语言,以及他所谓的“特技”,均为作者原创。请读者自行斟酌。
声明:此公告来源(发布)于Pi Network项目方官网,公告时间是2024 年 4 月 10 日。
公告内容(已翻译):
注:作者是一位业余开发者,他想探索并记录如何在 Pi 平台上创建 Web3 应用。这篇文章将带你经历一段丰富多彩的 Pi 应用开发历程,并逐步剖析他的开发经验。它可以让开发者了解构建 Pi 应用是多么简单直观——即使从经验不足的开发者角度来看也是如此。
享受阅读这篇引人入胜的文章吧!开发者们,亲眼见证将你的应用带给数千万 Pi 社区成员是多么快速!更多信息,请点击此处查看 Pi 平台的正式文档,以及点击此处查看完整的社区开发者指南。
语言,以及他所谓的“特技”,均为作者原创。请读者自行斟酌。
我之前尝试过 Python 开发,但还是很烂。Pi 区块链,我来了。游戏开始!
如果你想直接跳到步骤说明,我会很难过,但我理解。以下是目录:
或者,您可以在此处获取最终应用程序的所有代码:https://github.com/pi-apps/insult-o-meter。
我之前尝试编程的时候……总是很粗糙。半心半意的尝试,半途而废的工作。总之,什么都好说。
所以,当我决定在 Pi 平台上编写一个区块链应用程序并创建一份新手指南时,我开始紧张起来。天哪,我心想。又来了。
剧透:我惊喜万分。我敢说,这真的挺有意思的。以下是我使用 Pi 构建区块链应用的分步指南。
为了跟进和/或获取我的代码并弄清楚,您需要:
我是:
另外,我不懂开发者的语言。对我来说,代币就像我在 1990 年代乘坐地铁一样。所以,如果我偶尔会说“那个 API 玩意儿”,请原谅我。我会举例说明,希望您能理解。
Pi SDK 将您的应用连接到所有 Pi 货币。真正的加密货币爱好者可能会因为这个比喻而打我的脸,但 SDK 就像您商店里的信用卡终端一样。
工作原理如下:
如果你不是像我一样的 Python 专家(咳嗽),下面是我设置环境的方法:
就是这样。
我就不多说细节了。我用 Flask 后端搭建了一个简单的网页。这个应用会从文本文件中读取辱骂内容,抓取随机内容,然后使用一些基本的 JavaScript 代码将其传递到网页上。
目前,我们只是在构建不带 SDK 连接的应用。这意味着三种途径:
相当简单。你可以做得更花哨。
请务必记下应用程序 URL:
在 Pi 上设置应用程序时您将需要它。
如果你有步骤说明,这很容易。我是个乐于助人的人,所以步骤如下:
注意:您将使用两个应用程序:Pi 浏览器(基于 Pi 平台构建的 Web 浏览器)和 Pi 挖矿应用程序(用于生成所有 Pi 功能)。您需要来回切换。这可能会让您有点抓狂,但从长远来看,这确实很有意义。一旦您习惯了,它会让工作流程更轻松。相信我,我不会误导您。
在进行其他操作之前,你需要安装 Pi Mining App。这是一个可以在 iPhone 或 Android 设备上运行的小程序。获取方式:
Google Play 商店:https://play.google.com/store/apps/details ?id= com.blockchainvault,或
App Store:https://itunes.apple.com/us/app/pi-network/id1445472541
它还可以让你挖掘 Pi 货币。无需 GPU。
去吧,我等你。
都准备好了吗?进入下一步。
接下来,您需要下载 Pi 浏览器,这是一个移动网络浏览器,可让您访问使用 Pi SDK 构建的所有应用程序。
Google Play商店:https://play.google.com/store/apps/details? id=pi.browser
苹果应用商店:https://apps.apple.com/us/app/pi-browser/id1560911608
一切就绪。
输入你的应用名称和描述。我使用的App Network是Pi Testnet 。我绝对不会在现实世界中尝试运行这个东西。而且,Testnet 的交易是 100% 纯 Pi 交易,所以你不会因为一个有缺陷的应用而向任何人收费。我建议你也这样做。
您应该会看到这个方便的屏幕:
该清单显示了您在主网上启动应用程序的进程。
现在,我们需要设置一个钱包。
应用钱包相当于你的银行账户。你需要创建并连接一个。
更多神奇的事情将会发生。
完成后,您可能需要单击 Pi 浏览器中的“后退”按钮。我就是这么做的。
现在,您可以将钱包连接到此应用。点击
钱包(如果需要),然后选择要连接的钱包。
噗!您已获得一个应用程序和一个钱包。
注意:别自作聪明,在开发 URL 中使用 https。我这么做了,结果脸色很难看:
我返回并重置为http://127.0.0.1:3000 ,一切正常。
这真的非常非常困难。
我开玩笑的。开玩笑的。很简单。只需将以下内容添加到你的 Python 应用的 HTML 代码中:
Javascript
<script src="https://sdk.minepi.com/pi-sdk.js"></script>
<script> Pi.init({ version: "2.0", sandbox: true }) </script>
注意:仅在 Pi 沙盒中运行应用程序时 沙盒标志才为“true” 。
然后添加以下代码,用于验证用户身份:
Javascript
<script>
// Authenticate the user, and get permission to request payments from them:
const scopes = ['payments'];
// Read more about this callback in the SDK reference:
function onIncompletePaymentFound(payment) {
paymentId = payment.identifier
txid = payment.transaction.txid
$.post('/payment/complete',
{
paymentId: paymentId,
txid: txid,
debug: 'cancel'
}
)
};
Pi.authenticate(scopes, onIncompletePaymentFound).then(function(auth) {
console.log('woot!');
}).catch(function(error) {
console.error(error);
});
</script>
最后,将其添加到你的 Flask app.py 中:
Python
header = {
'Authorization': "Key YOUR-API-KEY"
}
这会将您的 API 密钥提供给 SDK。请练习安全变量包含。
这有点儿复杂。我说的“有点儿”是指“伊恩搞糊涂了”,其实也不难。
沙盒让您可以开发应用、测试交易等,而无需将您的应用暴露给全世界。它是一个包装器,可将 Python 应用连接到 SDK,同时确保所有内容都得到妥善隔离。
汉堡菜单并选择Pi Utilities胜利!第一次加载应用程序时,你应该会看到以下内容:
注意:这假设你有一个 Pi 帐户,里面有一点 Pi,这是你应该有的。毕竟,你已经安装了 Pi Mining 应用程序和 Pi 浏览器。
不算构建 Python 应用程序,我只是:
写出这些步骤花费了更多时间。
你可能比这个X世代的程序员还快。如果你说你花了不到1个小时,我就说你装逼了。
这才是“真正的”工作。之所以用引号,是因为一旦你知道怎么做,它就很简单了。我一会儿会一步一步讲解。现在,只需粘贴以下内容:
将其粘贴到 Pi.init 代码后面:
Javascript
<script>
// we're doing payments
const Pi = window.Pi;
// main payments function
function createPayment() {
const paymentData = {
amount: .01,
memo: "This buys you three more insults! What a deal!!!",
metadata: { insultid: 123456 }
};
// the SDK does all this like magic
const paymentCallbacks = {
onReadyForServerApproval: (paymentDTO) => {
paymentId = paymentDTO
$.post('/payment/approve', {
paymentId: paymentId,
accessToken: accessToken
})
},
onReadyForServerCompletion: (paymentDTO, txid) => {
paymentId = paymentDTO
txid = txid
$.post('/payment/complete',
{
paymentId: paymentId,
txid: txid,
debug: 'complete'
}
)
},
onCancel: (paymentDTO) => {
paymentId = paymentDTO.identifier
$.post('/payment/complete',
{
paymentId: paymentId,
debug: 'cancel'
}
)
},
onError: (paymentDTO) => {
console.log('There was an error ', paymentDTO)
paymentId = paymentDTO.identifier
$.post('/payment/error',
{
paymentDTO: paymentDTO,
paymentId: paymentId,
debug: 'error'
}
)
},
onIncompletePaymentFound: function(paymentDTO)
{
paymentId = paymentDTO.identifier
console.log('onIncompletePaymentFound', paymentId)
$.post('/payment/complete',
{
paymentId: paymentId,
txid: paymentDTO.transaction.txid
}
)
}
};
Pi.createPayment(paymentData, paymentCallbacks);
}
</script>
这样就设置好了之前提到的 Flask 路由。这些只是 Pi 的路由。你需要设置一些应用特定的路由。对我来说,这些是get_quote和back 。或者直接下载整个仓库。
Python
@app.route('/payment/approve', methods=['POST'])
def approve():
# Build the header for user authentication
accessToken = request.form.get('accessToken')
userheader = {
'Authorization': f"Bearer {accessToken}"
}
paymentId = request.form.get('paymentId')
approveurl = f"https://api.minepi.com/v2/payments/{paymentId}/approve"
response = requests.post(approveurl, headers=header)
userurl = "https://api.minepi.com/v2/me"
userresponse = requests.get(userurl, headers=userheader)
userjson = json.loads(userresponse.text)
return(response.text)
@app.route('/payment/complete', methods=['POST'])
def complete():
# Build the header for user authentication
accessToken = request.form.get('accessToken')
userheader = {
'Authorization': f"Bearer {accessToken}"
}
paymentId = request.form.get('paymentId')
txid = request.form.get('txid')
userurl = "https://api.minepi.com/v2/me"
userresponse = requests.get(userurl, headers=userheader)
data = {'txid': txid}
approveurl = f"https://api.minepi.com/v2/payments/{paymentId}/complete"
response = requests.post(approveurl, headers=header, data=data)
return(response.text)
@app.route('/payment/cancel', methods=['POST'])
def cancel():
paymentId = request.form.get('paymentId')
approveurl = f"https://api.minepi.com/v2/payments/{paymentId}/cancel"
response = requests.post(approveurl, headers=header)
return(response.text)
@app.route('/payment/error', methods=['POST'])
def error():
paymentId = request.form.get('paymentId')
approveurl = f"https://api.minepi.com/v2/payments/{paymentId}/cancel"
response = requests.post(approveurl, headers=header)
return(response.text)
@app.route('/me', methods=['POST'])
def getme():
userurl = "https://api.minepi.com/v2/me"
response = requests.post(userurl, headers=header)
return(response.text)
这些新路线具有以下功能:
要将你的应用连接到 Pi SDK,你只需要调用 createPayment 函数即可。对我来说,就是“支付”按钮:
Javascript
<a href="#" id="resetBtn" class="btn btn-primary mt-3" OnClick='javascript:createPayment();'>Pay</a>
当有人点击“支付”时,会调用createPayment,后者会调用 Flask 路由 /payments/approve。然后,奇迹发生了。
至此,我的应用已经可以正常运行了。它能显示辱骂内容,给 Pi 充值,还能处理所有相关的操作。
这花了大约 4 个小时,还有一些额外的时间用于:
我会帮你省去这些麻烦。阅读下一部分,了解这一切是如何运作的:
看到这里,你可能已经晕了。这需要大量的剪切粘贴,或者(希望如此)查看代码库。但却无法深入了解它的实际工作原理。以下是分步演示:
这个小函数差点把我逼疯了。它是个很棒的工具,可以检查未完成的交易,还能调用其他函数。我一开始没明白这个道理。
有几次我把系统搞坏了,交易提交了却没完成。这导致我陷入了错误百出的死循环:我尝试调试,尝试提交另一笔付款,失败了,又尝试调试……结果很糟糕。
为了达到我的目的,我让 onIncompletePaymentFound 调用 /payment/complete。这样一来,只要交易进行到一半,用户下次加载应用时,系统就会完成交易,让他们继续辱骂。
这些都是小额交易,而且是测试,所以我宁愿先完成交易,然后继续测试。另外,我想确保全球经济能持续受到冲击。
在生产中,您可能想要取消交易或做一些更花哨的事情。
提供的代码已经完成了所有这些操作。这里仅作解释。
光是构建应用还不够。不行!我还想在几个地方显示用户名。为此,我必须使用身份验证。通常,我听到“身份验证”,就会想到噩梦般的 OAUTH。不过,在这里,SDK 完成了大部分工作。
我将验证用户身份的代码块更改为:
Javascript
// Authenticate the user, and get permission to request payments from them (added 'username' to provide username to API):
const scopes = ['payments','username'];
var accessToken
var username
// Read more about this callback in the SDK reference:
function onIncompletePaymentFound(payment) {
paymentId = payment.identifier
txid = payment.transaction.txid
$.post('/payment/complete',
{
paymentId: paymentId,
txid: txid,
debug: 'cancel'
}
)
};
Pi.authenticate(scopes, onIncompletePaymentFound).then(function(auth) {
accessToken = auth.accessToken
username = auth.user.username
$('#username').text(username); // writes username to the page
}).catch(function(error) {
console.error(error);
});
accessToken = auth.accessToken
username = auth.user.username
$('#username').text(username); // writes username to the page
}).catch(function(error) {
console.error(error);
});
你可以根据需要进行比较,也可以进行剪切和粘贴。以下是变化之处:
我还添加了一个id 为#username 的<span> 元素。这就是用户账户名在页面上显示的位置。
在 app.py 中,我添加了“/me”路由:
Python
@app.route('/me', methods=['POST'])
def getme():
userurl = "https://api.minepi.com/v2/me"
response = requests.post(userurl, headers=header)
return(response.text)
这将调用 API 并检索用户的帐户名。
我还在/payments/complete路由中添加了几行代码。不过因为我比较懒,所以上面的复制粘贴代码块里已经包含了这些代码。如果你下载了整个应用仓库,一切就都搞定了。
就这样!我现在有了一个完整的应用。它提供了一些侮辱性的内容,并进行了个性化设置,甚至还能自动复制预先写好的信息(包括侮辱性的内容),方便您发送电子邮件、发布帖子或其他任何用途:
我经常使用 console.log。如果你和我一样是初学者,可以在这里了解更多信息。
我升级了吗?我不确定。但我从来没想过我能把区块链技术融入到我构建的任何东西中。我没想到这就像加点 JavaScript 那么简单,或者我可以用我的老朋友 Python 来完成这项工作。
所以是平局:区块链 1,Ian 1
猫和狗都因表现良好而得到了奖励,因此它们每人获得 2 分。
原文出处:Pi项目方官网链接-https://minepi.com/blog/tech-product-update-oct-2021/
(注:由于隔着墙,Pi项目方官网需要开梯子才能访问,某些免费梯子不能访问时建议更换梯子再试或使用付费梯子。)