Chainlink Functions 是一个用于 Web3 的 serverless 开发者平台,它可以使智能合约能够连接到任意一个 API,并运行的开发者自定义代码以获得结果,并且最终将结果进行去中心化和可验证的共识。
这个功能是非常强大的,因为在区块链上运行的传统智能合约无法主动去访问链下数据和系统,而且在链上进行复杂计算非常昂贵,所以合约通常需要通过链下的服务来获取数据或者“外包”计算工作。
以下是一些示例用例,包括 NFT 赠予,邮件服务,链上保险,音乐流媒体的支付等等。这些用例展示了 Chainlink Functions 如何将去中心化应用(dApp)连接到任何链下的 API。这些带有代码的示例中集成了头部的云和 Web2 平台(例如 Meta、Twilio、AWS 和 Google Cloud)服务,以展示 Chainlink Functions 可以连接的服务的广泛性,也展示智能合约与 Web2 世界结合时的多种可能性。
所有示例都可以在 Chainlink Labs GitHub 上找到,并且可以立即部署。
Meta: 将社交媒体连接到 Web3
Instagram 和 Facebook 等社交媒体平台为数十亿用户提供服务,使他们能够与同龄人保持联系,发布和浏览内容。大多数企业都在这些平台上有在线业务,其中许多企业通过这些渠道推动其业务。
将社交 App 的强大连接性和影响力与 Web3 世界相结合的一个用例是社交媒体促销和活动。全球数百万企业利用 Facebook 和 Instagram 等社交媒体平台的影响力,通过竞赛、活动和赠品来推广新产品,客户可以通过与企业页面共享的内容互动来赢得特别奖品。
除此之外,数字收藏品于 2022 年被集成到 Instagram 中,让创作者有机会以 NFT 的形式通过他们的网络分享和展示他们的艺术、图像、视频和音乐。这为企业和创作者提供了一条途径,可以利用新工具来赚取收入,并更好地控制他们与粉丝和客户的关系。
随着 Instagram 对数字藏品的集成以后,这项服务已被数百万人使用,将数字收藏品与社交媒体上的运营活动相结合就是一个很好的 Chainlink Functions 使用案例。通过这个方式,企业可以通过自动化、可扩展和信任最小化的方式,利用数字藏品进行的社交媒体的运营。
使用案例: 新品发布附赠的 NFT Giveaway
这个用例围绕一个商业广告,一个公司通过其 Facebook 或 Instagram 商业页面发布了新产品或服务,并且为了庆祝这一时刻,它以 NFT 的形式向客户提供数量有限的独特数字收藏品.要获得这些特殊 NFT 之一的资格,客户需要向业务页面发送一条私信,其中包含钱包地址和推广兑换码。
通过 Facebook 页面发送商业广告
用户给商家发送私信以参与活动
一旦促销的时间期限到了,企业就会与智能合约进行交互以进行 NFT 铸造。智能合约需要一个地址列表作为输入,一旦它收到符合条件的钱包地址,它就会为每个地址创建一个 NFT。在这个例子中,假设有三个赢家:
function fulfillRequest(bytes32 requestId, bytes memory response, bytes memory err) internal override {
latestResponse = response;
latestError = err;
emit OCRResponse(requestId, response, err);
address winner1;
address winner2;
address winner3;
assembly {
winner1 := mload(add(response, 20))
winner2 := mload(add(response, 40))
winner3 := mload(add(response, 60))
}
nft.mint(winner1);
nft.mint(winner2);
nft.mint(winner3);
}
新品发布时赠送 NFT 的工作流
该企业使用 Chainlink Functiosn 和智能合约来查找符合条件的客户钱包地址列表。在这种情况下,智能合约发起对 Chainlink Functions 的调用,传入要执行的 JavaScript 代码。这段 JavaScript 代码连接到 Meta Messaging API,提取并过滤出包含相关主题标签的对话,然后确定哪些客户有资格接收 NFT(在本例中,是前三个做出回应的客户)。
async function getEligibleConversations(isoStartDate) {
const conversationsResponse = await Functions.makeHttpRequest({
url: `https://graph.facebook.com/v16.0/${
secrets.FACEBOOK_PAGE_ID}/conversations?fields=messages.limit(1){message,from},updated_time&access_token=${
secrets.FACEBOOK_GRAPH_API_KEY}`
})
if (conversationsResponse.status === 200) {
const conversationsObject = conversationsResponse.data;
const conversations = conversationsObject.data;
const eligibleConversations = conversations.filter(conversation => new Date(conversation.updated_time) > isoStartDate);
return eligibleConversations;
} else {
throw Error(conversationsResponse.statusText);
}
}
async function chooseWinners(eligibleConversations, numberOfWinners) {
let winnersArray = [];
const length = eligibleConversations.length;
for (let i = 0; i < length;) {
// we are getting only the latest received message from the conversation with the user
const current = eligibleConversations[i].messages.data[0].message;
if (current.includes("#giveaway")) {
const walletAddress = current.substr(current.indexOf("0x"), 42);
if (isAddress(walletAddress)) {
winnersArray.push({
walletAddress: walletAddress,
senderId: eligibleConversations[i].messages.data[0].from.id
});
if (winnersArray.length == numberOfWinners) {
return winnersArray;
}
}
}
++i;
}
throw Error("No eligible addresses");
}
一旦它创建好了有资格接收 NFT 的地址列表,该函数就会使用 Meta API 向每个选定的用户发送一条消息,通知他们已经成功。在这里,它只是以字节数组的形式将地址列表返回给智能合约。一旦智能合约收到来自 Chainlink Functions 的输出,它将为每个指定的钱包地址铸造一个 NFT。
用户在被选中赠送 NFT 以后会收到一个通知
async function sendNotification(recipientId) {
await Functions.makeHttpRequest({
method: 'POST',
url: `https://graph.facebook.com/v16.0/${
secrets.FACEBOOK_PAGE_ID}/messages?recipient={'id':'${
recipientId}'}&messaging_type=MESSAGE_TAG&message={'text':'Co