起初在構建 MoeKoe Music 插件生態時,還沒有線上插件市場這個功能 後來在社區的建議下便有了這個插件市場 增加官方/社區插件倉庫以擴展產品功能 插件可以由社區開發,那插件市場應該怎麼管? 最直接的做法當然是把所有插件源碼都收進一個大倉庫裡。但這個方案越想越彆扭。每個插件都有自己的作者、自己的發佈節奏、自己的構建方式。把它們全塞進官方倉庫,不僅維護成本高,也會把責任邊界搞得很模糊。 所以這個倉庫最後沒有被設計成「插件源碼倉庫」,而是變成了一個「插件登記與索引倉庫」。它只做幾件事: 接收插件上架、更新、下架和舉報申請 自動做一輪基礎校驗和靜態識別 把人工審核通過時的插件快照記錄下來 維護客戶端可以讀取的 plugins.json 順手把 README 裡的插件列表更新出來,方便人看 一個可追溯的登記簿:誰提交的、審核的是哪個版本、下載地址是什麼、是否有網絡或文件權限,都落在一份清楚的數據裡。 市場索引,而不是源碼倉庫 倉庫根目錄最重要的文件是 plugins.json。它就是插件市場真正消費的數據源。 { "id": "custom-app-background", "name": "自定義背景圖", "description": "為MoeKoe Music提供自定義背景圖能力,支持透明度調節。", "iconUrl": "...", "version": "1.0.0", "minversion": "1.6.1", "...":"....", "buildRequired": false, "networkAccess": false, "fileAccess": false, "binaryContent": false, "snapshot": { "iconUrl": "...", "repository": "MoeKoeMusic/custom-app-background-plugin", "commitSha": "dbf72d38c8cf6b1d1cefdf8ce15798d565678995", "downloadUrl": "hxx.zip", "release": null } } 我不想讓市場記錄永遠指向插件倉庫「當前最新代碼」。因為作者今天提交的代碼,和審核那天看到的代碼,可能已經不是同一份東西了。插件市場真正應該承認的是:審核通過時的那個版本。 所以這個專案裡面有一個核心原則: 上架的不是一個會漂移的倉庫地址,而是一個已經鎖定的快照。 對於不需要編譯的插件,快照鎖到默認分支當時的 commit。對於需要編譯的插件,快照鎖到對應的 Release tag 和發行附件。這樣後面真出了問題,也能回頭知道當時到底審核了什麼。 Action 先跑,人最後拍板 用戶提交 Issue 時,需要選擇: ...
我用WebGL做18+遊戲,輸了「掉裝備」🔞
緊接上文:《同一個動畫,我用三種技術棧實現的區別?》 WebGL 二次元石頭剪刀布小遊戲。 規則很普通: 石頭 > 剪刀 剪刀 > 布 布 > 石頭 但有趣的是在於: 輸了會脫衣服。 對,就是這麼簡單粗暴。 起因其實是「我想研究精靈圖」 一開始我根本沒想做遊戲。 我只是想研究: atlas sprite 圖層疊加 動畫裁剪 這些東西。 然後想著:「總得有個實際應用場景吧?」 於是腦子一抽: 那乾脆做個二次元脫衣猜拳。 然後項目開始朝奇怪方向狂奔。 這個項目最麻煩的其實不是遊戲邏輯 石頭剪刀布規則簡單得離譜。 真正麻煩的是:衣服層級 因為角色不是:「一張完整圖片」 而是: 底圖 (防粿體被抓包,特意加密了) 衣服 A 衣服 B 衣服 C 配飾 遮擋層 不停疊。 「脫衣」其實是圖層管理 玩家贏了: 按設定好的順序移除一件衣服 電腦贏了: 再按逆序穿回來 聽起來簡單。 實際上會遇到一堆問題: 比如「不能瞬間露底圖」 這個特別關鍵。 如果你: 先刪舊衣服 再加新衣服 中間可能會閃出底圖。 於是視覺效果會特別怪。 所以我後來用了:reveal 覆蓋邏輯 新的層會立刻頂上。 盡量避免: 「裸體一幀閃現」。 雖然本身這項目看起來不正經 但至少技術上要優雅。 WebGL 在這裡真的很舒服 這個項目我最後選 WebGL 做。 原因很簡單:圖層太多。 ...
同一個動畫,我用三種技術棧實現的區別?
最近我做了個挺有意思的小實驗。 我把一個二次元角色的小動畫效果,分別用: WebGL Canvas 2D 純 DOM + CSS 實現了三遍。 效果本身不複雜: 眨眼 眉毛/下眼皮聯動 流汗輕微飄動 呆毛甩動 但真正有意思的,其實不是「做出來」。 而是: 同一個東西,用三種技術棧實現時,到底會差多少? 本質上就是一次「前端圖形學味很濃」的復刻實驗。 一開始只是想復刻一個呆毛動畫 靈感來源:https://tamanidamani.itch.io/nijikas-ahoge 我當時想法特別簡單:「如果是我,要怎麼實現?」 然後越做越上頭。最後直接演變成: 那我乾脆把 WebGL、Canvas2D、DOM 三種方案都做一遍算了。 於是倉庫就變成了現在這樣: canvas/ canvas2D/ dom/ 三個版本同效果實現。 先說結論 如果只讓我說一句話: WebGL 最強,但 Canvas2D 最舒服,DOM 最適合業務 1. WebGL 版本:最像「真正遊戲開發」 這個版本是最折騰的。 因為它本質上已經不是「前端動畫」了, 而是:GPU 圖形編程 它到底怎麼實現的? 核心思路其實就是: 底圖一層 精靈圖一層層貼 shader 控制繪製 JS 驅動動畫參數 比如: 呆毛旋轉 眨眼裁剪 alpha 混合 這些其實都在 GPU 那邊做。 你會開始接觸: uniform texture shader UV 頂點座標 紋理座標 然後人會逐漸失去笑容。 但 WebGL 真強 當元素一多的時候, WebGL 那種: 「完全不慌」 的感覺特別明顯。 尤其是: ...
杀死那个手写代码的人
最近寫程式碼的時候,我有一種很奇怪的感覺。 不是寫不動了,也不是不想寫,而是—— 好像越來越不需要我寫了。 以前一個功能,從需求到上線,基本是這樣的路徑: 我理解需求 → 設計方案 → 寫程式碼 → 除錯 → 改 bug → 上線 現在變成什麼樣? 我描述需求 → AI 寫程式碼 → AI 改 bug → 我看一眼 → 上線 中間那一大段「寫程式碼」的過程,突然變得很薄,甚至可以沒有。 這件事,一開始挺爽的。 但爽著爽著,會有一點不安。 過去程式設計師,除了「完成任務」後獲得的成就感,在整個寫程式碼的過程中也能體會到很多樂趣。 寫程式碼這件事,好像沒那麼重要了 我以前一直覺得,程式設計師最核心的能力,就是寫程式碼。 你寫得快不快、優不優雅、抽象得好不好,這些東西構成了「水準」的差異。 但現在,這套標準在慢慢失效。 很多程式碼,其實 AI 寫得比人快,也不一定比人差。 尤其是那種: CRUD 介面串接 常規邏輯處理 這些東西,AI 基本上是碾壓式效率。 有時候我自己寫了一段,還會下意識丟給 AI: 「你幫我優化一下」 結果它不僅優化了,還順手把我沒想到的情況補上了。 那一刻會有一點微妙—— 你開始分不清,這段程式碼到底是誰寫的。 更詭異的是:你開始不想自己寫了 這才是最危險的。 以前寫程式碼,是一種「控制感」: 每一行都是我敲出來的,我知道它為什麼這樣寫,也知道哪裡可能出問題。 但現在,當你習慣把問題丟給 AI,你會發現: 自己寫,反而變慢了。 甚至會有一種感覺: 「我為什麼要親自寫?」 這不是偷懶,這是效率的自然選擇。 就像你不會手算大整數一樣,你也不會再想手動寫那些「可以被自動完成」的程式碼。 程式設計師,正在變成另外一種角色 慢慢你會發現,你每天在做的事情變了。 不再是: ...
履行一場二十年的約定
這件事情聽起來有點像電視劇裡的橋段,但它確確實實發生在我身上。 我這個人呢,很念舊。 因為家庭的原因,我很早就離開了那個地方。關於「從小一起長大(發小)」這種事情,對我來說一直很模糊——也正因如此,我格外羨慕那些能從小陪伴彼此、感情深厚的人。 長大之後,我總覺得自己像是在不斷漂泊。習慣性地提前離開,把朋友丢在身後。 但偏偏就是為了曾經的那一句—— 「我會回來的。」 沒想到,這一等,就是二十年。 我也知道,注定不會有人真的在那裡等我去履行這個約定。 可即便如此,這件事還是成了我心裡的一個執念。 我以為,回到那裡,能把思緒一下子拉回從前。 但真正站在那裡時,腦海裡只剩下零零散散的記憶—— 也許是忘了,亦或者是早已物是人非。 從來沒想過,二十年後我還會站在這裡。 二十年前的我,也一定想不到,未來的自己會重新回到這個地方。 那一刻,有种穿越時空的神奇感,感覺很不可思議. 甚至會忍不住去想—— 或許從另一個維度看,是不是二十年前的我,和現在的我,在同一個時間點重合了。 這趟回來,也算是一場一個人的旅行。 照片都是用手机隨手拍的,一邊走一邊拍,畫面有點晃。 為了不讓自己看起來太孤單,我甚至在照片裡P了一個人進去。 曾經那個操場,在小時候的我眼裡大得不可思議。 每到晚上,總有一大群人在那裡跳廣場舞。 最熟悉的便是《月亮之上》《最炫民族風》,那時可熱鬧了。 給你們看看一個沒有人類十多年之後的城市長什麼樣看看 還記得,當年我在這裡戴上了紅領巾, 由五六年級的哥哥姐姐幫我繫上——那是成為少先隊員的時刻。 那家電影院,我從來沒進去過。 而如今,它的屋頂已经完全塌了。 其實在來之前,從衛星地圖上我就已經看到—— 學校,早就變了樣。 操場被移平了,連大門都找不到。 它已经完全不是記憶裡的樣子了,座椅幾乎已經全部被移走了. 竟然還有好多我不知道的教室—— 標本室,圖書館,器材室….畢竟那時我們的課本上標註著"本課本由國家免費提供" 還在老舊的值日表上看到了曾經熟悉的名字,好奇怪的呀,為什麼這麼久了會在 這是小時候在學校看電影的教室。 那時候覺得特別大,我們一群男生總喜歡躲在最後一排,黑漆漆的地方。 這棵樹也是。 小時候它還沒我大腿粗,也就比我高一點。 現在,已經長成了參天大樹。 你好啊,老朋友。 我又回來了。 給你們看看曾經的老物件,你能認識幾個嗎? 街道空無一人,雜草叢生,路面破破爛爛。 小時候,我們甚至會扒在火車車廂上,隨著火車慢慢往前移動。 我也回到了曾經的家、曾經的學校,還有曾經同學的家附近。 本來還以為,會有一些「意外收穫」。 比如,重新聯繫上舊同學。 但現實比想像要冷靜得多—— 那個年代沒有手機、沒有電腦,我們甚至沒有留下彼此的聯繫方式。 好不容易找到遺留的手機號加上了微信。 結果,第一天加上,第二天就被刪除了。 打電話,第一次没人接。 第二次,我已經猜到結果了—— 果然,被拉黑了。 小時候,這裡是男女生光著腳丫跳皮筋的地方。 而現在,很多地方已經被重新砌牆封住,進不去了。 原本還想去拍一張當年說出那句「我會回來的」的階梯—— ...
🌸 四月、櫻花,還有一個不會停止的謊言
四⽉這件事,⼤概從櫻⾳開始。 也是從那部叫做《四⽉是你的謊⾔》的動畫開始。 有些時間,是被作品定義的。 就像現在,只要一到四⽉,你很難不想起那句: “四⽉,是你的謊⾔。” 有⼀天你突然抬頭,發現街邊那棵你從來沒注意過的樹,已經悄悄開滿了粉⾊。 📷 像從動畫裡走出來的背影 那天只是看到前面兩個⼈—— 一個⾦髮、一個深⾊頭髮,校服、短裙、外套,背影走在櫻⾳樹下的時候,有那麼⼀瞬間真的很像從動畫裡掉出來的角色。 那⼀瞬間真的有點恍惚 現實突然短暫地變成了二次元。 有點像你在看番的時候會想: “如果這種畫⾯出現在現實,會是什麼感覺?” 🎹 四⽉,是被⾳樂記住的四⽉ 在《四⽉是你的謊⾔》裡,四⽉不是⼀個普通的⽉份。 它是開始,也是結束。 是重逢,是改變,也是告別。 故事裡充滿了古典⾳樂,像《蕭邦第⼀敘事曲》這樣的曲⼦,總是帶著⼀種說不清的情緒—— 溫柔,但不穩定。 明亮,但藏著⼀點點疼。 就像四⽉本身。 🌸 櫻⾳為什麼總讓⼈難過⼀點點? 櫻⾳其實沒有什麼特別。 但它開得太短了。 短到你剛意識到「啊,春天來了」,它就已經準備結束了。 就像那部動畫⼀樣—— 你明明覺得故事才剛開始, 卻在不知不覺中走向結尾。 櫻⾳的花期通常只有⼀兩週。 風⼀吹,就開始掉。 你甚⾄來不及留下些什麼,它就已經變成回憶。 🧃 四⽉,是剛剛好來不及的時間 四⽉很奇怪。 它不穩定,但又很真實。 你會更容易去注意一些平時不會在意的東西,比如: 路邊的樹 別人的背影 一陣風 或者⼀段⾳樂 甚⾄只是看到有⼈走在前面,都會忍不住腦補⼀段故事。 就像那天那兩個背影⼀樣。 也許他們什麼都不是。 但在那一刻—— 他們像極了⼀個故事的開頭。 📝 寫在最後 有時候會覺得, 我們喜歡櫻⾳, 不是因為它多好看。 而是因為它太像某些東西了—— 短暫、⽤⼒、然後結束。 就像《四⽉是你的謊⾔》講的那樣。 有些情緒,你當下說不清。 但等它過去之後,就再也回不來了。 所以才會在天⾵吹過的時候, 忍不住多看⼀眼。 多按幾次快⻘。 因為你知道: ...
夜鸋小屋探訪記
上週末,我去了一家二次元風格的小店——夜雀小屋。 其實之前在衝浪的時候就見過這地方,說是一個挺有意思的小據點,藏在一箇公園裡面,喜歡二次元或者東方Project的人基本都會覺得很親切。週末剛好有空,就慕名過去看了一下。 結果進去之後的第一感覺就是: 這地方比我預想的還要「濃度高」。 門口就已經很有氣氛 還沒進門的時候,其實就已經能看出這家店的風格了。 門口放著一個很大的靈夢玩偶,坐在那裡一臉淡定,看起來像是在負責「看店」。 老實說第一眼看到的時候我還愣了一下,這種大小的娃娃擺在門口還是挺有衝擊力的。 而且那種「表情很冷靜但又有一點呆」的感覺,非常符合靈夢的氣質。 好大一坨的靈夢 某種意義上,這玩意已經算是一個打卡點了。 店裡的展示櫃基本是「信仰陳列」 進門之後,最吸引我注意的是一個玻璃展示櫃。 裡面擺了不少手辦、CD,還有一些東方相關的周邊。 看得出來這些東西不是隨便堆的,而是比較用心地擺了一整排。 最大的那個手辦特別顯眼,做工也很精緻,燈光打下來之後整體氛圍感挺強的。 牆上的柜子簡直像一個小型博物館 店裡還有一整面牆的木柜子,上面擺滿了各種東西。 包括: 各種東方角色的玩偶 小手辦 吊飾 同人周邊 整體感覺有點像是把很多年的興趣全部擺出來展示。 中間還有一張芙蘭的立牌,被放在很顯眼的位置。 整個柜子看下來其實挺有意思的,因為你會不斷看到一些熟悉的角色突然出現在角落裡。 那種感覺就像是在翻一個老宅男的收藏柜。 整體氛圍其實挺輕鬆 我去的時間是週末下午,店裡人不算很多。 整體氣氛比較安靜,燈光也比较柔和。 沒有那種很商業化的感覺,更像是一個朋友聚會的小據點。 有點像: 小型二次元據點 同好聚集地 或者說是一個「宅文化客廳」 如果你是東方玩家或者平時混二次元圈,其實在這種地方會有一種挺微妙的親切感。 因為很多擺設一看就知道: 這不是為了營業擺出來的,是因為真的喜歡。 一些小感想 其實像這種店現在已經不太常見了。 很多地方的二維元店鋪都越來越商業化,要么就是咖啡店,要么就是賣周邊的商店。 但夜雀小屋這種感覺更像是: 「有人把自己的興趣變成了一個空間。」 哪怕只是進去轉一圈、看看擺設,也挺有意思的。 至少對我來說,這算是一個挺有趣的小發現。
🎉 年輕人第一台微單相機
🎉 達成新的成就 最近給自己的攝影設備做了一次迭代,從用了段時間的 佳能60D 換成了 佳能R50。 一個是2010年的經典中端單反,一個是2023年的入門無反。兩台相機跨越了十幾年的技術代差,就想試試現在的無反到底是什麼感覺。 一、我的第一台單反:佳能60D 佳能60D算是很多攝影愛好者曾經的「夢想機」。 我當初買它主要因為: 手感很好 操控專業 價格比7D更親民 EF鏡頭很多 那時候覺得60D挺「專業」的:機身不小,按鍵也多,看起來很像攝影師用的相機(笑)。 60D最大的特點其實是 可靠和耐用: 電池特別耐用,一塊電池可以拍很久 機身扎實,拿在手裡很有「相機的感觉」 光學取景器拍照很有儀式感 但隨著時間推移,我也慢慢感受到它的一些不足: 對焦點只有9個 對焦速度不算快 影片只有1080p 機身比較重 尤其是現在手機和新相機發展很快,這台老單反開始顯得有點「跟不上時代」。 二、為什麼我選擇了R50 在考慮升級的時候,我其實看了很多機型,比如: R100 R5 索尼或者尼康 最後我選擇了 R50,原因很簡單: 價格相對友好 機身非常輕 對焦系統很強 支援4K影片 R50是一台非常典型的 入門級無反相機,但技術其實來自更高階機型。 三、從單反到無反的變化 拿到R50的第一感覺就是: 真的太輕了,太小了。 甚至有种塑膠的廉價感,比較適合手小的女生 60D差不多 755g,而R50只有 375g,幾乎輕了一半。 以前如果背著60D出去走一天,多少還是會有一點累。 現在R50隨便背著,基本沒什麼感覺。 另一個很大的變化是 電子取景器。 單反是光學取景器,你看到的是鏡頭直接成像; 而R50是電子取景器,你看到的是 最終曝光效果的預覽。 四、對焦體驗的巨大提升 如果說升級最明顯的地方,那一定是 Ai+自動對焦。 60D: 9點對焦 大部分時間用中心點 跟焦能力一般 R50: 全畫面對焦 人臉識別 眼睛識別 動物識別 拍人像的時候,相機幾乎會自動找到眼睛對焦,非常省心。 ...
《亞托莉-我摯愛的時光(ATRI -My Dear Moments)》
雖然看完《亞托莉 -我摯愛的時光-(ATRI -My Dear Moments-)》已經大半年了大概 最近在社群中亞托莉的表情包突然多了起來,又把我拉回了思緒. 在我的推薦下@九日同學也去看了,並也玩了game. 本來以為是那種「可愛機器人 × 日常治癒」的輕鬆番,結果看著看著發現: 诶?怎麼心裡開始有點堵了? 🌊 世界觀:末世 + 海水上漲,但不走廢土風 故事背景其實挺殘酷的: 未來世界因為海平面上升,很多城市都被淹了。 但作品的畫風完全不是那種陰沉沉的廢土風,而是—— 陽光、藍天、舊城、海面反光、安靜的小鎮。 這種反差感特別有感覺: 世界已經壞掉了一半,但生活還在繼續。 🤖 亞托莉這個角色(蘿蔔子),真的很犯規 亞托莉是個高性能仿生機器人,但她的人設不是那種「高冷女仆型AI」,而是: 有點毒舌 有點天然 情緒很真實,還會哭 甚至比很多人類還「像人類」 她經常說一些看似輕鬆的話,但你仔細想想,這話其實挺扎心的。 而且她那種**「明明快沒時間了,還拼命想留下些什麼」的感覺**,真的很容易讓人破防。 簡單說一句: 👉 她不是賣萌的工具人,她是這部作品的靈魂。 🧑 男主不算爽文主角,但很真實 男主不是那種開局自帶光環的爽文型選手, 更多是: 有點消極 有點逃避現實 對未來也沒啥信心 但正因為這樣,和亞托莉的相處才顯得特別真實。 一個對世界失望的人,遇上一個即將「走到盡頭」的存在, 兩個人互相影響、互相拉一把,這種關係比「拯救世界」更打動我。 感想 這部作品最狠的地方在於: 它不是用大刀直接砍你, 而是一直在提醒你—— 美好的時光,本來就是有限的。 你明知道會走到那個結局, 但中途還是會貪戀那些平凡的小瞬間。 等真正結束的時候,你會發現: 難受的不是「失去」, 而是「那些日常真的回不來了」。 「記憶」 如果一個存在終將消失,那留下些什麼才算「存在過」? 是數據?是記錄?還是別人心裡記憶? 亞托莉的記憶更像是一種「可以被保存和複製的東西」, 理論上來說,只要數據還在,她就「沒有真正消失」。 但作為觀眾,看完整個故事之後,很難真的把她當成一份冷冰冰的備份文件。 真正讓人難受的點在於: 就算記憶被保存下來了, 那一塊一起度過的時光,也已經回不去了。 ...
Web3 鏈上紅包 DApp
這是一個100%去中心化的區塊鏈紅包應用。用戶可以連接錢包,設定金額和數量發送紅包,然後透過連結分享給他人領取。所有資料和操作都基於區塊鏈,完全不需要中心化伺服器,整個過程安全、透明、可追溯。 如果你感興趣,可以在 GitHub 上看看我的程式碼:redpacket‑dapp 功能亮點 🧧 發送紅包: 連接錢包後,設定金額和數量發送紅包到區塊鏈 🎁 領取紅包: 透過分享連結,別人可以連接錢包直接從區塊鏈領取紅包 🔗 智能合約: 使用 Solidity 編寫的安全智能合約處理所有邏輯 🌐 多鏈支援: 支援本地測試網和 BSC 測試網 💼 Web3 整合: 使用 MetaMask 錢包連接 🚀 完全去中心化: 沒有後端伺服器,所有資料儲存在區塊鏈 技術棧 前端:React 19、React Router 6、TypeScript、Vite、Ethers v6 合約層:Hardhat、Solidity 0.8.x 工具:ESLint、Prettier 不需要後端: 零依賴伺服器 ❌ 快速啟動 # 1. 安裝專案依賴 npm install cd react-dapp && npm install && cd .. # 2. 啟動本地區塊鏈節點 npm run node # 3. 編譯智能合約 npx hardhat compile # 4. 部署智能合約 npm run deploy # 5. 啟動前端 npm run frontend 目錄結構 redpacket-web3/ ├─ contracts/ # Solidity 智能合約 │ └─ RedPacket.sol ├─ react-dapp/ # React + Vite 前端 │ ├─ src/ │ │ ├─ components/ # 通用組件(錢包按鈕、創建表單等) │ │ ├─ config/ # ABI、合約地址配置 │ │ ├─ hooks/ # 自定義 hooks(useWallet) │ │ ├─ pages/ # 頁面(Home、ClaimPacket) │ │ ├─ styles/ # 全域樣式 │ │ ├─ utils/ # Web3 工具函數 │ │ └─ App.tsx # 路由與佈局 │ ├─ .env.example # 前端所需環境變數說明 │ └─ package.json ├─ scripts/ │ └─ deploy.js # Hardhat 部署腳本(會自動寫入前端配置) ├─ hardhat.config.js └─ package.json # 根目錄腳本(Hardhat + 前端一鍵啟動) 使用指南 創建紅包 打開前端並點擊右上角「連接錢包」。 填寫紅包總金額與份數,應用會在前端隨機拆分金額。 提交後在 MetaMask 中確認交易,等待區塊確認。 成功後可複製系統生成的領取連結,分享給朋友。 領取紅包 打開分享連結(URL 帶有 /claim/{packetId})。 同樣先連接錢包,然後點擊「點擊領取」。 簽名確認後等待區塊打包,頁面會顯示結果與剩餘份數。 環境變數 dapp/.env(開發環境會自動忽略,請參考 .env.example) VITE_RPC_URL:前端直連節點 RPC,預設為 http://127.0.0.1:8545 VITE_CONTRACT_ADDRESS:可覆蓋部署腳本寫入的地址 VITE_CHAIN_ID:前端提示使用的鏈 ID(十六進制) root/.env:若需要在 Hardhat 中引用私鑰或 BSC RPC,可繼續沿用原有寫法。 智能合約(RedPacket.sol) 核心方法: ...