paint-brush
🌈🦄 应用 Bacalhau 搭建您自个儿的 AI 提取技术 NFT DApp 经@developerally
2,423 讀數
2,423 讀數

🌈🦄 使用 Bacalhau 构建您自己的 AI 生成艺术 NFT DApp

DeveloperAlly29m2023/02/08
Read on Terminal Reader

太長; 讀書

使用您自己的文本到图像脚本构建、运行和部署 DApp 的完整指南,以在 FVM 超空间测试网上铸造 AI 生成的艺术 NFT。本博客将带您了解如何基于 Tensorflow 构建基于开源 Python 的文本转图像脚本。我特意选择尽可能多地使用此堆栈中可用的开源和去中心化技术。
featured image - 🌈🦄 使用 Bacalhau 构建您自己的 AI 生成艺术 NFT DApp
DeveloperAlly HackerNoon profile picture
0-item

使用您自己的文本到图像脚本构建、运行和部署 DApp 的完整指南,以在 FVM 超空间测试网上铸造 AI 生成的艺术 NFT!


目录

  • 👩‍💻 我们会做什么...
  • 🏛 架构图(有点)
  • 🥞 DApp 技术栈
  • 🏗️ 构建 Python 文本到图像脚本
  • ⚒️ 构建和部署 Solidity NFT 脚本
  • 🎬 构建前端交互
    • 完整流程
    • Bacalhau 互动
    • NFT.存储
    • 合约交互
  • 🌟 最后的想法:人工智能和区块链的可能性
  • 🐠 Bacalhau 路线图
  • ✍️保持联系!


🦄快速链接:


👩‍💻 我们会做什么...

这篇网赚博客将带您分析怎么样去


  1. 应用场景 Tensorflow 创造出有一个有一个应用场景 Python 的开源网站文本文档到图面代码(假若您此类不感浓厚兴趣,也能能只运行 Bacalhau HTTP 端点)
  2. 在 Bacalhau(一款 休馆的 p2p 链下计算出公司)上使用一个角本
  3. 在 Solidity 中創建 NFT 合約(由于 Open Zeppelin ERC721 合約)
  4. 使用的 Hardhat 将 NFT 合約布署到 Filecoin 虚拟软件机 (FVM) Hyperspace Testnet
  5. 自动化测试人机交互方式——该如何把 React 中与 Bacalhau word文档到图片游戏脚本和你一起的 NFT 合同期对其进行人机交互方式
  6. 如何快速将你的 NFT 元的数据留存到 NFT.Storage
  7. 是怎样的将web前端 DApp 部署安排到 Fleek


我大老远选购尽或许部分地区便用此堆栈中常用的开源网站和去核心化新技术。


这微博会挺长(嘿 - 想必给出其它产品信息并有效确保我门对初专家学者和谐和包容性!) - 故请随意刷到表格对你有效的位置游戏内容 <3

🏛 架构图(有点)

🥞 DApp 技术栈

(明白了 - 这是煎饼堆#sorrynotsorry)


上上下下着手高度重视开源项目和 Web3 :)



  • 智能合约[Solidity, Open Zeppelin]
    • 是一种面向以太坊 (EVM) 兼容区块链的 OO 智能合约编程语言
    • 提供了一个经过安全审核的通用智能合约组件和合约的实施库
  • 智能合约 IDE [Hardhat]
    • 是一个用于编辑、编译、调试和部署以太坊软件的开发环境
  • 区块链测试网 [ Filecoin虚拟机超空间]
    • 是建立在 Filecoin 区块链上的 EVM 兼容测试网
  • NFT元数据存储【NFT.Storage】
    • 是一种建立在 IPFS 和 Filecoin 之上的公共产品,用于不可变且持久地存储 NFT 元数据,并为 NFT 和 javascript sdk 提供免费的去中心化存储。
  • 前端[NextJS / React + NPM]
    • 我们可能都知道这些……对吧? :P
  • 来自客户端的智能合约交互[Metamask、Ethers、Chainstack RPC 节点]
    • 使用——我可以获得与我的区块链合约的只读交互。
    • 使用提供程序(或将指定浏览器的类似钱包),我们启用对区块链合约的写入调用。
    • js 是一个用于与 EVM 兼容的智能合约进行交互的库
  • AI文本转图像稳定扩散脚本[Python, Tensorflow]
    • 是一个开源机器学习平台和库,提供预训练模型和其他数据和 ML 工具。
  • 用于 AI 文本到图像生成的去中心化链下计算[Bacalhau]
    • 是一个点对点的开放式计算网络,它为公共、透明和可选的可验证计算过程提供了一个平台。它是一个去中心化的链下数据计算层。
  • 去中心化DApp 部署[Fleek]
    • 提供在 IPFS 和 Filecoin 上部署网站。它是 Vercel 或 Netlify 的 web3 版本——不能说我们真的有一个去中心化的应用程序然后将它部署到 web2! :D

🏗️ 构建 Python 文本到图像脚本


💡 TLDR 提示💡

该游戏脚本现在已经不错能够 CLI 和 HTTP 端点能够 Bacalhau 用到,从而请轻易关掉这部电视剧分。


稳定扩散的快速介绍


Stable Diffusion 是现在遥遥领先的实用于文件到图案解决的仪器零基础的模形(与 Dall-E 实用的模形相同之处)。它也是种的深度零基础的——仪器零基础的的一款 子集,它零基础审理对应主线任务——在这现状下将文件输进换算为图案伤害。


还有实例中,当我们的适用粘附的几率建模 ,该建模 的适用切换器从文章出现数字图像。


仅仅别害怕——我们的不必须似乎训练法仪器培训仿真模型(仅仅嘿——如果很显然你的事——你基本能能!)


相同,我将在我的 python 游戏脚本中选用产自 Google 的 TensorFlow 慧强机设备学库的预康复训练建模方法,而且 ML 网站权重己经为我优先核算好好。


更准确度地说,人们已经在选用原使 ML 型号的优化调整。


Python 脚本


🦄 您可以在和中找到有关如何构建和 Dockerise 这个文本到图像脚本并在 Bacalhau 上运行它的完整演练。🦄 您也可以在此中运行它


她是完整篇的 python 游戏脚本!


 import argparse from stable_diffusion_tf.stable_diffusion import Text2Image from PIL import Image import os parser = argparse.ArgumentParser(description="Stable Diffusion") parser.add_argument("--h",dest="height", type=int,help="height of the image",default=512) parser.add_argument("--w",dest="width", type=int,help="width of the image",default=512) parser.add_argument("--p",dest="prompt", type=str,help="Description of the image you want to generate",default="cat") parser.add_argument("--n",dest="numSteps", type=int,help="Number of Steps",default=50) parser.add_argument("--u",dest="unconditionalGuidanceScale", type=float,help="Number of Steps",default=7.5) parser.add_argument("--t",dest="temperature", type=int,help="Number of Steps",default=1) parser.add_argument("--b",dest="batchSize", type=int,help="Number of Images",default=1) parser.add_argument("--o",dest="output", type=str,help="Output Folder where to store the Image",default="./") args=parser.parse_args() height=args.height width=args.width prompt=args.prompt numSteps=args.numSteps unconditionalGuidanceScale=args.unconditionalGuidanceScale temperature=args.temperature batchSize=args.batchSize output=args.output generator = Text2Image( img_height=height, img_width=width, jit_compile=False, # You can try True as well (different performance profile) ) img = generator.generate( prompt, num_steps=numSteps, unconditional_guidance_scale=unconditionalGuidanceScale, temperature=temperature, batch_size=batchSize, ) for i in range(0,batchSize): pil_img = Image.fromarray(img[i]) image = pil_img.save(f"{output}/image{i}.png")


顶端的代码可是接收一两个word文档建议投入性能技术参数和某些别的能选性能技术参数,但是传参分叉的 TensorFlow 库来合成图片并将她们手机截图到输出的信息中。


前方完全的各个责任重大的工作全都在以下的位置中做好 - 她是产品學習3d模型发挥出其魔力的好地方。 🪄


 generator = Text2Image( img_height=height, img_width=width, jit_compile=False, ) img = generator.generate( prompt, num_steps=numSteps, unconditional_guidance_scale=unconditionalGuidanceScale, temperature=temperature, batch_size=batchSize, )


太OK了,我需要从文章表示产生形象,但有嗯……是什么里正常运作在这个 GPU 所用的脚本制作……🤔🤔


要说区快链技术水平在本体论上不加强一条事,要不然是大统计数据补救。她是致使在分布图制作式操作系统上进心行核算以供给同一强悍魔抗(诸如去相互信任和核查抗御)的投资成本。


采用您的本市仪器是 小样例是将会的 - 实际上上我切实想尽让此某样例在我的(对于此十分的不不错)Mac M1 上正常运行,不过,报告单超时日期好长(人打兵兵球吗?)全部,迟早会你现在开始工作更强的数据文件,你将需求更好地的 gas(双关语),只要你家中也没有特用服务于器,那就你将需求在一位虚似机子采用虚似机。人工智能技术方法平台网站。


这不仅是中心化的,而且效率低下——由于数据与计算机的距离未知,而且它可能会很快变得昂贵。我没有找到任何为此提供 GPU 处理的免费层级云计算服务(有人说加密采矿禁令......?)并且计划每月超过 400 美元(不,谢谢)。



Bacalhau!


喜欢的是,一下状况是 Bacalhau 检测解決的一下状况。在 Bacalhau 中,使资料库整理和核算对每隔人开发和能作并快速整理准确时间表或许的,应先 - 应用跨另一个端点应用批整理,二将整理端点投入资料库优势的敌方!


Bacalhau 的目的是采用在没有妥协更大量的 IPFS、Filecoin 和 Web3 固定性的去机构化商业价值的情況下,采用多数据源来链下计算的来益处实现了数据源处理的前景民主制度化。


是一个点对点的开放式计算网络,它为公共、透明和可选的可验证计算过程提供了一个平台,用户可以在其中运行 Docker 容器或 Web Assembly 图像作为针对任何数据的任务,包括存储在 IPFS(以及即将推出的 Filecoin)中的数据。它甚至支持 GPU 作业,而且价格不超过 400 美元!

简介 | Bacalhau 文档

在 Bacalhau 上运行脚本


要运转此游戏脚本,我们大家的能能将其 Docker 化以在 Bacalhau 上实用。如若你要想自学如何才能做,你能能应该依照。最后我们大家的能能用这行代码怎么用用 Bacalhau CLI 运转它(用过别的个单行然后):
 bacalhau docker run --gpu 1 ghcr.io/bacalhau-project/examples/stable-diffusion-gpu:0.0.1 -- python main.py --o ./outputs --p "Rainbow Unicorn" 



只不过在整个例中,我将采用一些 HTTP 端点将我联系到整个 dockerised 不稳定性的传播角本,我将在智能家居控制部门向您分享!只是,你要徘徊里提出,这便是的一种启用数剧求算期间的专业而机灵的行为,它也是 web3 合理的——.我这不仅只限这样小模型工具。不通过,要咱们坚持审议 NFT js! :)

⚒️ 构建和部署 Solidity NFT 脚本

智能合约

NFT 智慧期货合同规定针对,但采用 ERC721URIStorage 微信版本,进来涵盖元的统计的数据规格拓张(因小编不错将小编的 IPFS 寻址元的统计的数据——小编将维持在 NFT.Storage 上的元的统计的数据传递信息给期货合同规定) .


该核心协议还给让各位可以提供了 NFT 协议的一样功效,在这其中是指 mint() 和 transfer() 等早已为让各位保证 的功效。


您会重视到你会“添加了多少个 getter 涵数来为我的web前端得的数据,已经每晚压铸新 NFT 时均会在链上发来的新闻。这可以提供了从 DApp 记录链上新闻的工作能力。


💡 💡


BacalhauFRC721.sol


 // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@hardhat/console.sol"; contract BacalhauFRC721 is ERC721URIStorage { /** @notice Counter keeps track of the token ID number for each unique NFT minted in the NFT collection */ using Counters for Counters.Counter; Counters.Counter private _tokenIds; /** @notice This struct stores information about each NFT minted */ struct bacalhauFRC721NFT { address owner; string tokenURI; uint256 tokenId; } /** @notice Keeping an array for each of the NFT's minted on this contract allows me to get information on them all with a read-only front end call */ bacalhauFRC721NFT[] public nftCollection; /** @notice The mapping allows me to find NFT's owned by a particular wallet address. I'm only handling the case where an NFT is minted to an owner in this contract - but you'd need to handle others in a mainnet contract like sending to other wallets */ mapping(address => bacalhauFRC721NFT[]) public nftCollectionByOwner; /** @notice This event will be triggered (emitted) each time a new NFT is minted - which I will watch for on my front end in order to load new information that comes in about the collection as it happens */ event NewBacalhauFRC721NFTMinted( address indexed sender, uint256 indexed tokenId, string tokenURI ); /** @notice Creates the NFT Collection Contract with a Name and Symbol */ constructor() ERC721("Bacalhau NFTs", "BAC") { console.log("Hello Fil-ders! Now creating Bacalhau FRC721 NFT contract!"); } /** @notice The main function which will mint each NFT. The ipfsURI is a link to the ipfs content identifier hash of the NFT metadata stored on NFT.Storage. This data minimally includes name, description and the image in a JSON. */ function mintBacalhauNFT(address owner, string memory ipfsURI) public returns (uint256) { // get the tokenID for this new NFT uint256 newItemId = _tokenIds.current(); // Format info for saving to our array bacalhauFRC721NFT memory newNFT = bacalhauFRC721NFT({ owner: msg.sender, tokenURI: ipfsURI, tokenId: newItemId }); //mint the NFT to the chain _mint(owner, newItemId); //Set the NFT Metadata for this NFT _setTokenURI(newItemId, ipfsURI); _tokenIds.increment(); //Add it to our collection array & owner mapping nftCollection.push(newNFT); nftCollectionByOwner[owner].push(newNFT); // Emit an event on-chain to say we've minted an NFT emit NewBacalhauFRC721NFTMinted( msg.sender, newItemId, ipfsURI ); return newItemId; } /** * @notice helper function to display NFTs for frontends */ function getNFTCollection() public view returns (bacalhauFRC721NFT[] memory) { return nftCollection; } /** * @notice helper function to fetch NFT's by owner */ function getNFTCollectionByOwner(address owner) public view returns (bacalhauFRC721NFT[] memory){ return nftCollectionByOwner[owner]; }


要求

会将此合同协议研究构建到,但您还是可以将此合同协议研究构建到任何 EVM 兼容链,包扩 Polygon、BSC、Optimism、Arbitrum、Avalanche 等。你甚至会还是可以设定你的前面来设计多链 NFT(提示卡: )!


要部署安排到超个人空间检验网,我们都必须要
  1. Metamask 钱包并将其连接到 Hyperspace 测试网
  2. 从水龙头( 或 )获取一些测试 tFIL 资金


使用 Hardhat 部署智能合约

我正在慢慢利用 hardhat 将此期货合约部署工作到 Hyperspace 測試网。


🛸超空间 RPC 和 BlockExplorer 选项:

公众 RPC 端点区快浏览记录器的

开放API


来说配值制定,我们的能能从丝毫可以用的公众 RPC 端点中开始选用。


hardhat.config.ts


 import '@nomicfoundation/hardhat-toolbox'; import { config as dotenvConfig } from 'dotenv'; import { HardhatUserConfig } from 'hardhat/config'; import { resolve } from 'path'; //Import our customised tasks // import './pages/api/hardhat/tasks'; const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || './.env'; dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); // Ensure that we have all the environment variables we need. const walletPrivateKey: string | undefined = process.env.WALLET_PRIVATE_KEY; if (!walletPrivateKey) { throw new Error('Please set your Wallet private key in a .env file'); } const config: HardhatUserConfig = { solidity: '0.8.17', defaultNetwork: 'filecoinHyperspace', networks: { hardhat: {}, filecoinHyperspace: { url: '//api.hyperspace.node.glif.io/rpc/v1', chainId: 3141, accounts: [process.env.WALLET_PRIVATE_KEY ?? 'undefined'], }, // bleeding edge often-reset FVM testnet filecoinWallaby: { url: '//wallaby.node.glif.io/rpc/v0', chainId: 31415, accounts: [process.env.WALLET_PRIVATE_KEY ?? 'undefined'], //explorer: //wallaby.filscan.io/ and starboard }, }, // I am using the path mapping so I can keep my hardhat deployment within the /pages folder of my DApp and therefore access the contract ABI for use on my frontend paths: { root: './pages/api/hardhat', tests: './pages/api/hardhat/tests', //who names a directory in the singular?!!! Grammarly would not be happy cache: './pages/api/hardhat/cache', }, }; export default config;
以便布署智慧合約,公司使用没事个布署游戏脚本——请小心,我还在这儿里专程将手机钱包详细地址设立为个性签名者(其他者)——在编纂中心句时,FEVM 中依然会出现这些地址转换系统错误,这有机会会从而导致这些奇特的操作。


deploy/deployBacalhauFRC721.ts


 import hre from 'hardhat'; import type { BacalhauFRC721 } from '../typechain-types/contracts/BacalhauFRC721'; import type { BacalhauFRC721__factory } from '../typechain-types/factories/contracts/BacalhauFRC721__factory'; async function main() { console.log('Bacalhau721 deploying....'); // !!!needed as hardhat's default does not map correctly to the FEVM const owner = new hre.ethers.Wallet( process.env.WALLET_PRIVATE_KEY || 'undefined', hre.ethers.provider ); const bacalhauFRC721Factory: BacalhauFRC721__factory = < BacalhauFRC721__factory > await hre.ethers.getContractFactory('BacalhauFRC721', owner); const bacalhauFRC721: BacalhauFRC721 = <BacalhauFRC721>( await bacalhauFRC721Factory.deploy() ); await bacalhauFRC721.deployed(); console.log('bacalhauFRC721 deployed to ', bacalhauFRC721.address); // optionally log to a file here } main().catch((error) => { console.error(error); process.exitCode = 1; });
要堡垒机被部署,请采用以上代碼在终端设备中自动运行给出按键精灵脚本(重视:可能咱们在安装海军中将初始线上设立为 filecoinHyperspace,往往没有为线上表达象征,即使下面如下图所示)

> cd ./pages/hardhat/deploy/


 npx hardhat run ./deployBacalhauFRC721.ts --network filecoinHyperspace


献礼!你们上面将 NFT 合同期推广到 Filecoin 超环境测试仪网!

🎬 构建前端交互

哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇


为了能整合自动化测试,我的运行了 NextJS 和 Typescript。而且,老实巴交说——我并都没有用 NextJS 的其中 SSR(服务性器端草图大师渲染)功能表,我什至并都没有的运行我们的网站页面路由(因此它是个单页 Dapp),所以咧你真就可以去的运行 vanilla React 放置(和此外是您选定 的其中方框!)。


至於打字稿......最终,我引入它有些来去匆匆还只能不表示这也不是打字稿的某个特别好的案例 - 总之变量类型看下来很开心......;)



Anyhoo - 当页的关键性如果不是向您动态展示英文该怎样制定前端部位编号,即使向您动态展示英文该怎样与自动化合約、Bacalhau(食用我们公司不稳的扩撒 ML 建模)以其此外同时还有 NFT.Storage 做等交互 - # NotOnIPFSNotYourNFT。

完整流程

[todo:搭建步奏图]
  • 用户在输入字段中输入文本提示 ->
  • 单击生成图像按钮 -> 调用 Bacalhau Job 生成图像
  • Bacalhau Job 完成 -> 格式返回 NFT 元数据 JSON 对象
  • 用户单击 Mint NFT 按钮 -> NFT.Storage 被调用以保存 NFT 元数据并返回文件夹的 IPFS CID -> 使用此 IPFS_URI 调用智能合约的 mint NFT 函数以使用此元数据铸造 NFT ->
  • !! [FEVM 陷阱] -> 在这里我们通常会等待此结果的 TX(交易哈希)返回,但它目前无法正常工作,因此我们使用合约事件侦听器来确定何时完成。
  • 完毕! -> 现在可以重新获取任何显示数据,并在铸币时给用户状态成功反馈。


特好 - 令我门看我门是怎在编号中满足它!

Bacalhau 互动

工程施工师在中登记了为 Bacalhau 建设最前端 API 端点。


该 API 目前直接命中此博客中记录的稳定扩散脚本,但是,该团队正在将其扩展为更通用的 API,以便您可以调用任何示例以及您自己从 HTTP 部署的脚本休息API。请在或


>run/test in terminal


 curl -XPOST -d '{"prompt": "rainbow unicorn"}' '//dashboard.bacalhau.org:1000/api/v1/stablediffusion';


>react / typescript code


 import { CID } from 'multiformats/cid'; export const callBacalhauJob = async (promptInput: string) => { //Bacalahau HTTP Stable Diffusion Endpoint const url = '//dashboard.bacalhau.org:1000/api/v1/stablediffusion'; const headers = { 'Content-Type': 'application/x-www-form-urlencoded', }; const data = { prompt: promptInput, //The user text prompt! }; /* FETCH FROM BACALHAU ENDPOINT */ const cid = await fetch(url, { method: 'POST', body: JSON.stringify(data), headers: headers, }) .then(async (res) => { let body = await res.json(); if (body.cid) { /* Bacalhau returns a V0 CID which we want to convert to a V1 CID for easier usage with http gateways (ie. displaying the image on web), so I'm using the IPFS multiformats package to convert it here */ return CID.parse(body.cid).toV1().toString(); } }) .catch((err) => { console.log('error in bac job', err); }); return cid; };


此函数将返回一个 IPFS CID(内容标识符),其文件夹结构如下所示。然后可以在/outputs/image0.png下找到图像。


💡 💡




啊七色彩虹独角兽......有一些 不感兴趣的!

NFT.存储

NFT.Storage 就是一种公用设施物品(称之为免弗),不错解乏地用到 javascript 或 HTTP SDK 将 NFT 元数据资料长期文件存储在 IPFS 和 Filecoin 上。


NFT 元数据报告不是个 JSON 表格,看出来像下的举例——直接的采用 Open Zeppelin 表格:



在创建 NFT 时,请务必注意,除非您将元数据存储在链上(这对于大文件来说可能变得非常昂贵),否则为了符合令牌的“不可替代性”,您需要存储是持久,可靠和不变。


这样你的 NFT 有条个像上方典例本来的根据位子的联系地址,那么的这是位子绝对路径在消售后被设置成是该是非常简单的,这预兆着你来说你选购的 NFT 转为了彻底区别的玩意 - 或 在那样情况报告下也是两个词义效果上的木地板拉在 NFT 艺术创意创笔者将艺术创意图象变为木地板全部图片的正下方。



甚至会 Open Zeppelin 也会提出提醒!



使用 NFT.Storage 意味着我们为我们的元数据获得一个不可变的 IPFS 文件 CID(内容- 而不是位置 - id entifier),它不仅固定到 IPFS,而且还存储到 Filecoin 以实现持久性。你只需要注册NFT.Storage 并为此获得一个(保存在您的 .env 文件中)。


.env example


 NEXT_PUBLIC_NFT_STORAGE_API_KEY=xxx


让他们还是需要保持让他们以经建设了个各式正规的元统计资料 JSON——可能尽管 FVM(是没有有!)有 NFT 专业市场……让他们着实想保持当它被使用时让他们的 NFT 依然愿意具备基准.


 import { NFTStorage } from 'nft.storage'; //connect to NFT.Storage Client const NFTStorageClient = new NFTStorage({ token: process.env.NEXT_PUBLIC_NFT_STORAGE_API_KEY, }); const createNFTMetadata = async ( promptInput: string, imageIPFSOrigin: string, //the ipfs path eg. ipfs://[CID] imageHTTPURL: string //an ipfs address fetchable through http for the front end to use (ie. including an ipfs http gateway on it like //[CID].ipfs.nftstorage.link) ) => { console.log('Creating NFT Metadata...'); let nftJSON; // let's get the image data Blob from the IPFS CID that was returned from Bacalhau earlier... await getImageBlob(status, setStatus, imageHTTPURL).then( async (imageData) => { // Now let's create a unique CID for that image data - since we don't really want the rest of the data returned from the Bacalhau job.. await NFTStorageClient.storeBlob(imageData) .then((imageIPFS) => { console.log(imageIPFS); //Here's the JSON construction - only name, description and image are required fields- but I also want to save some other properties like the ipfs link and perhaps you have other properties that give your NFT's rarity to add as well nftJSON = { name: 'Bacalhau Hyperspace NFTs 2023', description: promptInput, image: imageIPFSOrigin, properties: { prompt: promptInput, type: 'stable-diffusion-image', origins: { ipfs: `ipfs://${imageIPFS}`, bacalhauipfs: imageIPFSOrigin, }, innovation: 100, content: { 'text/markdown': promptInput, }, }, }; }) .catch((err) => console.log('error creating blob cid', err)); } ); return nftJSON; };


现代让企业们将此元大数据储存空间到 NFT.Storage 中!


 await NFTStorageClient.store(nftJson) .then((metadata) => { // DONE! - do something with this returned metadata! console.log('NFT Data pinned to IPFS & stored on Filecoin!'); console.log('Metadata URI: ', metadata.url); // once saved we can use it to mint the NFT // mintNFT(metadata); }) .catch((err) => { console.log('error uploading to nft.storage'); });


Woot - 你们公司有了基 Bacalhau 的图文,你们公司现已便用 NFT.Strorage 未变且持续地存有了你们公司的元数据统计,现时让你们公司锻造你们公司的 NFT!


💡快速提示💡NFT.Storage 还提供了一系列其他,如 storeCar 和 storeDirectory 以及status() 函数- 它返回 CID 的 IPFS 固定和 Filecoin 存储交易 -> 这可能是一个非常酷的补充用于检查 NFT 状态的 FEVM DApp(或在 FEVM 发布主网后在 FEVM 上实施 NFT)。

合约互动

这儿有 3 总类型的相互(还许多 FEVM 误区 - 测试英文版科技都是都会有许多稀奇古怪的内部错误特点!)


  • 只读传参以从链中检索式的数据而不变更它
  • 编撰所需男士钱包签字和付 92号汽油的电话号码,即。改变了链心态的方程,就比如锻压 NFT!
  • 群体事件真相侦听器——侦跟从期货合约散发的群体事件真相


这对于全部这职能,我门公司将运行——以太坊 API 的轻数据量产品包装器,接触到我门公司的合同协议并实施对它的调节。


使用公共 RPC 以读取模式连接到合约:


 //The compiled contract found in pages/api/hardhat/artifacts/contracts import BacalhauCompiledContract from '@Contracts/BacalhauFRC721.sol/BacalhauFRC721.json'; //On-chain address of the contract const contractAddressHyperspace = '0x773d8856dd7F78857490e5Eea65111D8d466A646'; //A public RPC Endpoint (see table from contract section) const rpc = '//api.hyperspace.node.glif.io/rpc/v1'; const provider = new ethers.providers.JsonRpcProvider(rpc); const connectedReadBacalhauContract = new ethers.Contract( contractAddressHyperspace, BacalhauCompiledContract.abi, provider );


窃听合同期上的事情。因此这都是1个只读(得)事情,我们公司能够在使用公用设施 RPC 来窃听链上的事情发送。


 //use the read-only connected Bacalhau Contract connectedReadBacalhauContract.on( // Listen for the specific event we made in our contract 'NewBacalhauFRC721NFTMinted', (sender: string, tokenId: number, tokenURI: string) => { //DO STUFF WHEN AN EVENT COMES IN // eg. re-fetch NFT's, store in state and change page status } );


写入模式连接到合约 - 这需要以太坊对象通过钱包注入网络浏览器,以便用户可以签署交易并支付 gas - 这就是我们检查 window.ethereum 的原因目的。


 //Typescript needs to know window is an object with potentially and ethereum value. There might be a better way to do this? Open to tips! declare let window: any; //The compiled contract found in pages/api/hardhat/artifacts/contracts import BacalhauCompiledContract from '@Contracts/BacalhauFRC721.sol/BacalhauFRC721.json'; //On-chain address of the contract const contractAddressHyperspace = '0x773d8856dd7F78857490e5Eea65111D8d466A646'; //check for the ethereum object if (!window.ethereum) { //ask user to install a wallet or connect //abort this } // else there's a wallet provider else { // same function - different provider - this one has a signer - the user's connected wallet address const provider = new ethers.providers.Web3Provider(window.ethereum); const contract = new ethers.Contract( contractAddressHyperspace, BacalhauCompiledContract.abi, provider ); const signer = provider.getSigner(); const connectedWriteBacalhauContract = contract.connect(signer); }
用到读取数据相连的期货合约传参 mint 方程。


应先,保证我们的的是一个来自五湖四海选择者的零皮夹联系地址,从而我们的的在 FVM Hyperspace 链上。在等你一些您概率都要的有效的的零皮夹功效,其中包括咋样检验 chainId,并且咋样以java开发途径将 Hyperspace 系统填加到 Metamask / 零皮夹。您能会选择以太坊對象或选择 ethers.js 与零皮夹交互技术。


 declare let window: any; const fetchWalletAccounts = async () => { console.log('Fetching wallet accounts...'); await window.ethereum //use ethers? .request({ method: 'eth_requestAccounts' }) .then((accounts: string[]) => { return accounts; }) .catch((error: any) => { if (error.code === 4001) { // EIP-1193 userRejectedRequest error console.log('Please connect to MetaMask.'); } else { console.error(error); } }); }; const fetchChainId = async () => { console.log('Fetching chainId...'); await window.ethereum .request({ method: 'eth_chainId' }) .then((chainId: string[]) => { return chainId; }) .catch((error: any) => { if (error.code === 4001) { // EIP-1193 userRejectedRequest error console.log('Please connect to MetaMask.'); } else { console.error(error); } }); }; //!! This function checks for a wallet connection WITHOUT being intrusive to to the user or opening their wallet export const checkForWalletConnection = async () => { if (window.ethereum) { console.log('Checking for Wallet Connection...'); await window.ethereum .request({ method: 'eth_accounts' }) .then(async (accounts: String[]) => { console.log('Connected to wallet...'); // Found a user wallet return true; }) .catch((err: Error) => { console.log('Error fetching wallet', err); return false; }); } else { //Handle no wallet connection return false; } }; //Subscribe to changes on a user's wallet export const setWalletListeners = () => { console.log('Setting up wallet event listeners...'); if (window.ethereum) { // subscribe to provider events compatible with EIP-1193 standard. window.ethereum.on('accountsChanged', (accounts: any) => { //logic to check if disconnected accounts[] is empty if (accounts.length < 1) { //handle the locked wallet case } if (userWallet.accounts[0] !== accounts[0]) { //user has changed address } }); // Subscribe to chainId change window.ethereum.on('chainChanged', () => { // handle changed chain case }); } else { //handle the no wallet case } }; export const changeWalletChain = async (newChainId: string) => { console.log('Changing wallet chain...'); const provider = window.ethereum; try { await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: newChainId }], //newChainId }); } catch (error: any) { alert(error.message); } }; //AddHyperspaceChain export const addHyperspaceNetwork = async () => { console.log('Adding the Hyperspace Network to Wallet...'); if (window.ethereum) { window.ethereum .request({ method: 'wallet_addEthereumChain', params: [ { chainId: '0xc45', rpcUrls: [ '//hyperspace.filfox.info/rpc/v0', '//filecoin-hyperspace.chainstacklabs.com/rpc/v0', ], chainName: 'Filecoin Hyperspace', nativeCurrency: { name: 'tFIL', symbol: 'tFIL', decimals: 18, }, blockExplorerUrls: [ '//fvm.starboard.ventures/contracts/', '//hyperspace.filscan.io/', '//beryx.zondax.chfor', ], }, ], }) .then((res: XMLHttpRequestResponseType) => { console.log('added hyperspace successfully', res); }) .catch((err: ErrorEvent) => { console.log('Error adding hyperspace network', err); }); } };


在刻录模试调整用合同规定 mint 涵数....


 // Pass in the metadata return from saving to NFT.Storage const mintNFT = async (metadata: any) => { await connectedWriteBacalhauContract // The name of our function in our smart contract .mintBacalhauNFT( userWallet.accounts[0], //users account to use metadata.url //test ipfs address ) .then(async (data: any) => { console.log('CALLED CONTRACT MINT FUNCTION', data); await data .wait() .then(async (tx: any) => { console.log('tx', tx); //CURRENTLY NOT RETURNING TX - (I use event triggering to know when this function is complete) let tokenId = tx.events[1].args.tokenId.toString(); console.log('tokenId args', tokenId); setStatus({ ...INITIAL_TRANSACTION_STATE, success: successMintingNFTmsg(data), }); }) .catch((err: any) => { console.log('ERROR', err); setStatus({ ...status, loading: '', error: errorMsg(err.message, 'Error minting NFT'), }); }); }) .catch((err: any) => { console.log('ERROR1', err); setStatus({ ...status, loading: '', error: errorMsg( err && err.message ? err.message : null, 'Error minting NFT' ), }); }); }


Woooo - NFT 冶炼!!独角兽民舞玩法时段!

🌟 最后的想法:人工智能和区块链的可能性

Bacalhau 相当适用多数据完成多次重复的、敲定性的补救作业题。
  • ETL 具体步骤
  • POS机练习与人工客服智力
  • 智能物网络数据信息构建
  • 批治理 还包括
    • 财务和市场数据
  • 视频图片和图片除理 - 异常最合适創意


中也会很多范例介绍该怎样实现了上述所说一些作用。虽说 Bacalhau 正忙碌于创设一名结合以随便从 FEVM 智能化协议赋值 Bacalhau,但这下有些对 Bacalhau x FVM 协作的感触:


  • 帮助未来 Filecoin 数据的 Onboarding 和 Offboarding
  • 通过处理在链上检索到的有关交易和存储提供商的数据,帮助 Filecoin 建立声誉和服务质量层。
  • Bacalhau 可以为市场和支付数据提供计算
  • Bacalhau 可以帮助处理来自 DAO 和 DataDAO 的数据
  • Bacalhau 可以帮助实现视频和图像处理等创造性工作的更多自动化
  • Bacalhau 可以实现游戏和元数据处理,包括 VR 和 AR。
  • Bacalhau,物联网和模拟是可能的
  • 人工智能和机器学习应用

🐠 Bacalhau 路线图


咱们当下现在搭配种方式 ,让您会随时从您的自动化合約运营 Bacalhau!!!!这一投资项目被又称 Project Frog / Project Lilypad - 并将将成为一名集成式层,会从 FEVM 自动化合約传参 Bacalhau 上班。


完成申请咱们的时政热点通信或添加下面交际活动组织,点赞这领域的发展。

✍️保持联系!

道贺你看看完!!!


若是这对您要用,我将甚为心存感激,讨论,关注度或分享赚钱! <3


与Bacalhau控制联络!


  • 推特
  • YouTube
  • Filecoin Project Slack #bacalhau
  • 论坛


与 ♥️

你觉得这篇文章有价值吗?

成为赞助商来支持Alison Haire 。任何金额表示赞赏!



也发部。


바카라사이트 바카라사이트 온라인바카라