Chainlink Functions 介紹 & 使用案例

Chainlink發表於2023-03-14

Chainlink Functions 是一個用於 Web3 的 serverless 開發者平臺,它可以使智慧合約能夠連線到任意一個 API,並執行的開發者自定義程式碼以獲得結果,並且最終將結果進行去中心化和可驗證的共識。

這個功能是非常強大的,因為在區塊鏈上執行的傳統智慧合約無法主動去訪問鏈下資料和系統,而且在鏈上進行復雜計算非常昂貴,所以合約通常需要透過鏈下的服務來獲取資料或者“外包”計算工作。

以下是一些示例用例,包括 NFT 贈予,郵件服務,鏈上保險,音樂流媒體的支付等等。這些用例展示了 Chainlink Functions 如何將去中心化應用(dApp)連線到任何鏈下的 API。這些帶有程式碼的示例中整合了頭部的雲和 Web2 平臺(例如 Meta、Twilio、AWS 和 Google Cloud)服務,以展示 Chainlink Functions 可以連線的服務的廣泛性,也展示智慧合約與 Web2 世界結合時的多種可能性。

所有示例都可以在 Chainlink Labs GitHub 上找到,並且可以立即部署。

Meta: 將社交媒體連線到 Web3

InstagramFacebook 等社交媒體平臺為數十億使用者提供服務,使他們能夠與同齡人保持聯絡,釋出和瀏覽內容。大多數企業都在這些平臺上有線上業務,其中許多企業透過這些渠道推動其業務。

將社交 App 的強大連線性和影響力與 Web3 世界相結合的一個用例是社交媒體促銷和活動。全球數百萬企業利用 Facebook 和 Instagram 等社交媒體平臺的影響力,透過競賽、活動和贈品來推廣新產品,客戶可以透過與企業頁面共享的內容互動來贏得特別獎品。

除此之外,數字收藏品於 2022 年被整合到 Instagram 中,讓創作者有機會以 NFT 的形式透過他們的網路分享和展示他們的藝術、影像、影片和音樂。這為企業和創作者提供了一條途徑,可以利用新工具來賺取收入,並更好地控制他們與粉絲和客戶的關係。

隨著 Instagram 對數字藏品的整合以後,這項服務已被數百萬人使用,將數字收藏品與社交媒體上的運營活動相結合就是一個很好的 Chainlink Functions 使用案例。透過這個方式,企業可以透過自動化、可擴充套件和信任最小化的方式,利用數字藏品進行的社交媒體的運營。

使用案例: 新品釋出附贈的 NFT Giveaway

這個用例圍繞一個商業廣告,一個公司透過其 Facebook 或 Instagram 商業頁面釋出了新產品或服務,並且為了慶祝這一時刻,它以 NFT 的形式向客戶提供數量有限的獨特數字收藏品.要獲得這些特殊 NFT 之一的資格,客戶需要向業務頁面傳送一條私信,其中包含錢包地址和推廣兌換碼。

1401.png
透過 Facebook 頁面傳送商業廣告

1402.png
使用者給商家傳送私信以參與活動

一旦促銷的時間期限到了,企業就會與智慧合約進行互動以進行 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);
    }

1403.png
新品釋出時贈送 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。

1404.png
使用者在被選中贈送 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':'Congratulations, you were successful in winning one of our special unique NFTs to celebrate the launch of our new product! Please check your wallet address that you specified in this conversation, you should now be able to see your NFT there, or in the Instagram Digital Collectibles album if you have linked the specified wallet address to your Instagram account.'}&tag=CONFIRMED_EVENT_UPDATE&access_token=${secrets.FACEBOOK_GRAPH_API_KEY}`
    })
}

async function main() {
    const isoStartDate = new Date(args[0]);
    const numberOfWinners = args[1];
    const testerAccounts = JSON.parse(args[2]);

    const eligibleConversations = await getEligibleConversations(isoStartDate);
    if (eligibleConversations === undefined || eligibleConversations.length === 0) {
        throw Error("No eligible conversations");
    }

    // conversations are stored based on the latest update:
    // 1. the newest
    // 2. old
    // 3. the oldest
    // 
    // we want to find the fastest eligible address to award it with an NFT
    const sortedEligibleConversations = eligibleConversations.reverse();

    const chosenWinners = await chooseWinners(sortedEligibleConversations, numberOfWinners);

    const winners = chosenWinners.map(({ walletAddress }) => Buffer.from(walletAddress.slice(2), 'hex'))

    chosenWinners.forEach(async ({ senderId }) => {
        if (testerAccounts.includes(senderId)) {
            await sendNotification(senderId);
        }
    });

    return winners;
}

最後一步是每個贏得獎勵的客戶都會收到一條私人訊息,通知他們成功了。他們將能夠在 Instagram 數字收藏品畫廊或 OpenSea 上的帳戶中看到新鑄造的數字收藏品:

1405.png
在 Instagram 中檢視 NFT

1406.png
在 Opensea 中檢視 NFT

請在這個 repo 中獲取完整的原始碼,以及有關部署和執行此用例的完整說明。

Twilio: 基於鏈上事件產生警告資訊

Twilio 是一個雲通訊平臺,它提供一組 API 和工具,使開發人員能夠將訊息、語音和影片功能整合到他們的應用程式中。藉助 Twilio,開發人員可以輕鬆地將實時通訊功能新增到他們的 Web 和移動應用程式中,而無需任何複雜的基礎設施設定或維護。

由於去中心化應用程式本身無法訪問鏈下資料和 API,因此它們的功能和與鏈下服務互動的能力受到限制。藉助 Chainlink Functions,dApp 構建者現在可以輕鬆設定複雜的自定義工作流程,以去中心化地執行任意程式碼、執行復雜的計算,以及使用 Twilio 的電子郵件、WhatsApp 和 SMS 警報服務等服務。這開闢了許多新功能和用例,從當 DeFi 頭寸有被清算的危險時提醒使用者,到根據數字協議進行的鏈上支付傳送自動電子郵件發票。

使用案例: 音樂藝術家和唱片公司流媒體收入數字協議

這個用例的場景是唱片公司和音樂藝術家之間以智慧合約形式達成的數字協議。智慧合約的設定是根據音樂藝術家在過去一個月收到的 Spotify 音樂流的數量,根據商定的每 Y 流 X 美元的公式支付費用。智慧合約有一個功能,當被呼叫時,執行自定義邏輯來獲取最新的流媒體計數並將其與上次獲取的計數進行比較,計算所需的付款,然後將所需的金額以以下形式支付到指定藝術家的錢包地址。該智慧合約可以作為數字協議及其狀態的單一真實來源,資料可以根據需要被其他系統整合和引用。

智慧合約能夠聯絡並找到藝術家的 Spotify 流並向藝術家生成電子郵件提醒的能力不是智慧合約自己可以做的。在此示例中,智慧合約使用 Chainlink functions 連線到音樂資料 API,就藝術家擁有的 Spotify 流媒體數量達成共識。

const URL = `https://sandbox.api.soundcharts.com/api/v2/artist/${artistId}/streaming/spotify/listeners`

const soundchartsResponse = await Functions.makeHttpRequest({
    url: URL,
    // Get a free sandbox API key from https://doc.api.soundcharts.com/api/v2/doc
    headers: { "x-app-id": secrets.soundchartAppId, "x-api-key": secrets.soundchartApiKey },
  })

然後,它進行鏈下計算以計算支付金額,為藝術家生成一封電子郵件警報,以使用 Twilio 電子郵件 API 通知他們音樂流和支付金額,然後將最新的聽眾計數返回給智慧合約。

 const emailData = {
    personalizations: [
      {
        to: [
          {
            email: artistEmail,
            name: artistName,
          },
        ],
        subject: "A payout is coming your way!",
      },
    ],
    content: [
      {
        type: "text/plain",
        value: `Hey ${artistName}! 
You've got ${latestListenerCount} listeners which is ${
          latestListenerCount - lastListenerCount
        } more than when we last checked!
So you can expect some cool crypto to be sent to your wallet soon!
Best,
TwiLink Records
            `,
      },
    ],
    from: {
      email: VERIFIED_SENDER,
      name: "TwiLink Records",
    },
    reply_to: {
      email: "sam.smith+noreply@example.com",
      name: "Sam Smith",
    },
  }

【圖6】
Twilio email 通知

一旦智慧合約收到聽眾數量,它就會計算並將所需的 USDC 傳送到藝術家的錢包地址,然後將最新的流媒體數量儲存在數字協議中,以用於下個月的計算。

對於這個特定的用例,使用信任最小化智慧合約作為數字協議的流程具有多種優勢:

  • 藝人知道他們一定會獲得報酬,並且可以確定唱片公司不能更改協議的條件。
  • 唱片公司向其藝術家付款的流程更加高效,無需手動付款。
  • 該解決方案有很好的可擴充套件性,並且無論有多少藝術家加入唱片公司,它都是自動化和高效的。

在此示例中,Twilio 電子郵件用作對藝術家的簡單提醒。但它也可以與 Twilio SendGrid 設計編輯器相結合,設計供電子郵件使用的發票,以便向藝術家傳送具有專業發票,以配合實時的付款。

請在這個 repo 中獲取完整的原始碼,以及有關部署和執行此用例的完整說明。

Amazon Web Services (AWS):將 Web3 與雲系統和 API 整合

Amazon Web Services (AWS) 等雲平臺為開發人員提供範圍廣泛的基於雲的計算服務,包括可擴充套件且可靠的基礎設施、儲存解決方案、資料庫管理、機器學習工具和 serverless 計算。這些服務為當今的大部分數字世界提供支援,這要歸功於它們可以以經濟高效的方式輕鬆整合到開發人員的工作流程中。

將這些雲服務整合到 Web3 和智慧合約的世界中,會開闢大量潛在用例,我們可以透過 Chainlink Functions 將 Web2 雲端計算的功能和可擴充套件性與 Web3 去中心化應用程式的高安全性和信任最小化特性融合在一起。

使用案例: 使用 AWS Data API 的通用聯結器

此用例建立一個 Chainlink Function,它可被用於連線到任何 AWS Data Exchange 資料,使開發人員能夠將 AWS 中的第三方資料與智慧合約無縫整合。這使得建立更高階 Web3 應用程式成為可能,這些應用程式可以利用 AWS 中可用的大量資料集。

在這個具體的例子中,Chainlink Functions 將用於連線並從 Rearc Currency Exchange API 獲取貨幣兌換資料,然後將資料返回到鏈上智慧合約。

1407.png
AWS 上的 Rearc currency exchange API

使用者可以透過 JavaScript 函式構建一個通用聯結器,讓它被 Chainlink Functions 去中心化預言機網路 (DON) 中的所有節點執行,然後就 API 呼叫的結果達成共識。

使用者可以透過自定義程式碼實現 Functions 執行的 HTTP 請求,從 Rearc 資料集中獲取許多環境變數,例如資料集 ID、修訂 ID 和資產 ID。

授權標頭是使用 AWS 訪問密碼和金鑰以及簽名構建的。請求資訊被 SHA-256 演算法進行雜湊運算,然後寫入到請求的標頭中,然後由此生成簽名資訊。有關為授權標頭生成簽名的更多資訊,請參閱 Amazon Simple Storage Service API Reference

const signature = buildSignature(method, url, host, secrets.secretKey, secrets.securityToken, date, payload, region, service)

const config = {
  url: `https://${host}${url}`,
  headers: {
    'x-amzn-dataexchange-data-set-id': secrets.dataSetID,
    'x-amzn-dataexchange-revision-id': secrets.revisionID,
    'x-amzn-dataexchange-asset-id': secrets.assetID,
    'X-Amz-Date': date,
    'Authorization': `AWS4-HMAC-SHA256 Credential=${secrets.accessKey}/${shortDate(date)}/${region}/${service}/aws4_request, SignedHeaders=${buildSignedHeaders(secrets.securityToken)}, Signature=${signature}`
  }
}

const response = await Functions.makeHttpRequest(config)

為了計算簽名,AWS 金鑰用於派生簽名金鑰。派生的簽名金鑰特定於日期、服務和區域。最終簽名是待簽名的字串(請求資訊中的串聯字串)的 HMAC-SHA256 雜湊值,雜湊運算中使用的金鑰是派生的簽名金鑰。

  /**
   * To calculate a signature, a special string has to be signed. Canonical request is part of that string. This functions takes various request parts and returns special shaped string that will be hashed later on. Since queries are passed separately we need to remove them from url parameter (if there is any)
   * @param {string} method - request method
   * @param {string} url - absolute url of the request WITHOUT query parameters
   * @param {string} host - host of the request url
   * @param {string} securityToken - optional security token when temporary credentials are used
   * @param {string} queries - encoded and sorted query parameters
   * @param {string} date - current date (ISO 8601)
   * @param {string} payload - request body for POST/PUT request, empty string for GET requests
   * @returns canonical request string
   */
  const buildCanonicalRequest = (method, url, host, securityToken, queries, date, payload) => {
    url = url.split('?')[0]
    return method + '\n'
      + encodeURI(url) + '\n'
      + queries + '\n'
      + 'host:' + host + '\n'
      + 'x-amz-date:' + date + '\n'
      + (securityToken ? 'x-amz-security-token:' + securityToken + '\n' : '')
      + '\n'
      + buildSignedHeaders(securityToken) + '\n'
      + crypto.createHash('sha256').update(payload).digest('hex')
  }

一旦 Chainlink Functions DON 中的每個節點都執行了 AWS API 呼叫並且結果達成了共識,它就會被編碼為 uint256 並回傳到使用者的智慧合約。可以在 AWS Data Exchange GitHub 儲存庫中找到此示例的完整原始碼。

此示例僅展示了將智慧合約與 AWS 整合的眾多方法中的一種。開發人員可以輕鬆修改通用聯結器以適應 AWS 的一些其他功能,讓這些功能可以透過 API 訪問,例如查詢和更新 Amazon 關聯式資料庫服務 (RDS) 上的資料或啟用智慧合約來執行託管在 AWS 的 Lambda Function

Google: 在去中心化應用中整合 BigQuery 和資料分析

Google Analytics 是一種流行的網路分析服務,允許網站所有者跟蹤和分析流量和使用者行為。它在傳統網站中被大量使用,現在它也可以與去中心化應用程式 (dApp) 和智慧合約一起使用。

Google BigQuery 是一個雲原生資料倉儲,使企業能夠實時分析和查詢大型資料集。

將 Google Analytics 和 BigQuery 與智慧合約整合的一個具體示例是使用 Chainlink Functions 和 Chainlink Automation 在鏈上提供有關網站或 dApp 使用者統計資料的實時更新。該演示是與 Google 的 Web3 開發者關係工程師 Allen Day 合作建立的。

使用案例: 使用 Analytics 的資料來觸發鏈上邏輯

此用例展示了開發人員如何使用 Google Analytics 收集的網站資料來驅動和影響鏈上智慧合約中的邏輯。在這個示例中,使用者被定向到一個網站,他們可以在該網站上為狗或貓投票,並將他們的選擇傳送到 Google Analytics。然後,收集的資料會自動上傳到 Google Cloud 的 BigQuery 中的資料集。從這裡開始,Chainlink Automation 將用於定期呼叫 Chainlink Functions 以從 Google BigQuery 中提取投票總數,然後將它們返回到鏈上。智慧合約將使用此分析資料來跟蹤投票總數。一旦投票期結束,智慧合約中的功能將決定誰是獲勝者。

在向 Google BigQuery API 發出請求之前,Chainlink 函式必須請求一個訪問令牌:

const jwtClaimSetObj = {
    "iss": iss,
    "scope": "https://www.googleapis.com/auth/cloud-platform.read-only",
    "aud": "https://oauth2.googleapis.com/token",
    "exp": currentTimeInSeconds + 3500,
    "iat": currentTimeInSeconds
  }

  const jwtBase64ClaimSet = Buffer.from(JSON.stringify(jwtClaimSetObj)).toString('base64')

  const stringToSign = `${jwtBase64Headers}.${jwtBase64ClaimSet}`

  const jwtBase64Signature = crypto.sign('RSA-SHA256', stringToSign, privateKey).toString('base64')

  const jwtRequest = {
    grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    assertion: `${jwtBase64Headers}.${jwtBase64ClaimSet}.${jwtBase64Signature}`
  }

  const jwtRequestString = querystring.stringify(jwtRequest)

  const tokenResponse = await Functions.makeHttpRequest({
    url: 'https://oauth2.googleapis.com/token',
    method: 'post',
    data: jwtRequestString
  })

一旦獲得了這個令牌,就可以使用它構建請求來從 Google BigQuery 中獲取資料:

const getSQLQuery = (propertyId) => {
  return `SELECT COUNT(DISTINCT user_pseudo_id) AS votes FROM \`${secrets.projectId}.analytics_${propertyId}.events_intraday_*\` WHERE event_name = 'page_view' OR event_name = 'user_engagement'`
}

const requestConfig = {
  method: 'post',
  url: `https://bigquery.googleapis.com/bigquery/v2/projects/${secrets.projectId}/queries`,
  headers: {
    "Authorization": `Bearer ${await getOauthToken(secrets.iss, secrets.key)}`,
    "Accept": 'application/json',
    "Content-Type": 'application/json'
  },
  data: {
    "query": getSQLQuery(secrets.property1),
    "useLegacySql": false
  }
}

const request1 = Functions.makeHttpRequest(requestConfig)

requestConfig.data.query = getSQLQuery(secrets.property2)
const request2 = Functions.makeHttpRequest(requestConfig)

const responses = await Promise.all([ request1, request2 ])
The returned results are then combined and sent back on-chain to the consuming smart contract:

let item1Votes
try {
  item1Votes = parseInt(responses[0].data.rows[0].f[0].v)
} catch {
  item1Votes = 0
}

let item2Votes
try {
  item2Votes = parseInt(responses[1].data.rows[0].f[0].v)
} catch {
  item2Votes = 0
}

console.log(`Item 1 votes: ${item1Votes}\nItem 2 votes: ${item2Votes}`)

return Buffer.concat([ Functions.encodeUint256(item1Votes), Functions.encodeUint256(item2Votes) ])

一旦投票期限結束,declareWinner 函式會決定哪兩個動物是贏家:

function declareWinner() public onlyOwner {
    if (charity1Votes == charity2Votes) {
      winner = 'Charity #1 and #2 tied!';
    }

    if (charity1Votes > charity2Votes) {
      winner = 'Charity #1 won!';
    }

    if (charity1Votes > charity2Votes) {
      winner = 'Charity #2 won!';
    }

    emit WinnerDeclared(winner);
  }

可以在 Google BigQuery Demo GitHub 儲存庫中找到此示例的完整原始碼。這個簡單的示例僅限於基於兩個事件的特定分析資料,但可以作為一種工具來展示將去中心化應用程式與 Google Analytics 和 Google BigQuery 等服務相結合的可能性。

去中心化保險: 基於鏈下天氣資料的指數型保險

去中心化保險可以使用區塊鏈技術和智慧合約來取代傳統的保險協議,透過資料驅動的自動化、高度安全、防篡改的智慧合約形式的數字協議,為保險公司及其客戶提供優質的保險產品,以及即時和自動化的索賠處理。

將指數型保險世界引入 Web3 的最大問題是高質量、可驗證資料的可用性。藉助 Chainlink Functions,開發人員可以透過訪問和聚合來自多個來源的資料輕鬆建立自己的鏈下資料獲取機制,然後讓 Chainlink Functions 就鏈下資料聚合的結果達成共識,然後再將資料上鍊.

使用案例: 使用多個資料來源的指數型保險合約

這個用例展示了開發人員如何從三個不同的資料來源中提取天氣資料,在鏈下聚合三個結果,然後讓 Chainlink Functions DON 中的每個節點就返回的中值達成共識,然後再將其釋出到鏈上。

此資料將用於確定是否應向客戶支付保險合同。保險合同 ParametricInsurance 將檢查給定城市(在本例中為紐約)的溫度。如果溫度連續三天低於 60 華氏度,合同將向客戶支付約定的價值。ParametricInsurance 合約定義了協議條款,例如約定的價值,以及支付合約的引數:

function fulfillRequest(
        bytes32 requestId,
        bytes memory response,
        bytes memory err
    ) internal override {
      latestResponse = response;
      latestError = err;
      emit OCRResponse(requestId, response, err);
      // once callback happens, mark the timestamp
      currentTempDateChecked = block.timestamp;
      currentTemperature = uint256(bytes32(response));

      // if current temperature is under temperature which considered as cold, number of cold days increment
      if (currentTemperature > coldTemp) {
          consecutiveColdDays = 0;
      } else {
          consecutiveColdDays += 1;
      }

      // pay the client and shut down the contract
      if(consecutiveColdDays >= COLD_DAYS_THRESHOLD) {
          payoutContract();
      }
    }

Parametric-insurance-example.js 中,Chainlink Functions 對三個不同的天氣資料來源執行 API 呼叫,聚合結果,然後在將天氣資料傳回 ParametricInsurance 智慧合約之前就每個節點的中間結果達成共識。

const openWeatherRequest = Functions.makeHttpRequest({
  url: `http://api.openweathermap.org/data/2.5/weather?lat=${cityLat}&lon=${cityLon}&appid=${secrets.openWeatherApiKey}&units=imperial`,
})

const worldWeatherRequest = Functions.makeHttpRequest({
  url: `http://api.worldweatheronline.com/premium/v1/weather.ashx?key=${secrets.worldWeatherApiKey}&q=${cityName}&format=json`,
})

const ambeeDataRequest = Functions.makeHttpRequest({
  url: `http://api.ambeedata.com/weather/latest/by-lat-lng?lat=${cityLat}&lng=${cityLon}`,
  headers: { "x-api-key": `${secrets.ambeeWeatherApiKey}` }
})

// wait data returned by multiple APIs
const [openWeatherResponse, worldWeatherResponse, ambeeDataResponse] = await Promise.all([
    openWeatherRequest, 
    worldWeatherRequest,
    ambeeDataRequest])

可以在 GitHub repo 中找到此示例的完整原始碼。這個例子是針對指數型保險的,但這個想法展示了從多個來源消費資料,對其進行聚合等鏈下計算,然後使用 Chainlink Functions 的 OCR 共識協議進一步驗證結果,最後將其交付到鏈上的案例。

總結

從社交媒體到雲端計算和保險協議,Chainlink Functions 使開發人員能夠以高度安全和信任最小化的方式輕鬆安全地訪問鏈下資料和計算,從而開闢了大量的智慧合約用例。

要檢視更多用例或提交你自己的用例,我們建議你訪問 Use Chainlink Functions,這是一個顯示社群提交的 Chainlink 函式用例和示例的網站。

將世界上所有的資料和 API 引入去中心化應用程式將引發新用例的爆炸式增長,類似於 Chainlink 喂價是 DeFi 增長的催化劑。但 Chainlink Functions 的不同之處在於,Chainlink 不僅僅是一個價格資料預言機 —— 它成為了一個任何資料預言機 —— 使開發人員能夠訪問鏈上的任何資料,並在整個 Web3 空間中探索更多的用例。

歡迎關注 Chainlink 預言機並且私信加入開發者社群,有大量關於智慧合約的學習資料以及關於區塊鏈的話題!

相關文章