<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Chainlink on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/chainlink/</link>
        <description>Recent content in Chainlink on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Thu, 30 Oct 2025 15:27:33 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/chainlink/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>chainlink</title>
        <link>https://producthunt.programnotes.cn/en/p/chainlink/</link>
        <pubDate>Thu, 30 Oct 2025 15:27:33 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/chainlink/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1600884540504-337c78addb29?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NjE4MDkyNDZ8&amp;ixlib=rb-4.1.0" alt="Featured image of post chainlink" /&gt;&lt;h1 id=&#34;smartcontractkitchainlink&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;smartcontractkit/chainlink&lt;/a&gt;
&lt;/h1&gt;&lt;br/&gt;
&lt;p align=&#34;center&#34;&gt;
&lt;a href=&#34;https://chain.link&#34; target=&#34;_blank&#34;&gt;
&lt;img src=&#34;https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/docs/logo-chainlink-blue.svg&#34; width=&#34;225&#34; alt=&#34;Chainlink logo&#34;&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/r/smartcontract/chainlink/tags&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/v/tag/smartcontractkit/chainlink?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub tag (latest SemVer)&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/blob/master/LICENSE&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/license/smartcontractkit/chainlink?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub license&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/actions/workflows/changeset.yml?query=workflow%3AChangeset&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/actions/workflow/status/smartcontractkit/chainlink/changeset.yml&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub workflow changeset&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/graphs/contributors&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/contributors-anon/smartcontractkit/chainlink?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub contributors&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/commits/master&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/commit-activity/y/smartcontractkit/chainlink?style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitHub commit activity&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://docs.chain.link/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/static/v1?label=docs&amp;amp;message=latest&amp;amp;color=blue&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Official documentation&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://chain.link/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chainlink&lt;/a&gt; expands the capabilities of smart contracts by enabling access to real-world data and off-chain computation while maintaining the security and reliability guarantees inherent to blockchain technology.&lt;/p&gt;
&lt;p&gt;This repo contains the Chainlink core node and contracts. The core node is the bundled binary available to be run by node operators participating in a &lt;a class=&#34;link&#34; href=&#34;https://link.smartcontract.com/whitepaper&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;decentralized oracle network&lt;/a&gt;.
All major release versions have pre-built docker images available for download from the &lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/r/smartcontract/chainlink/tags&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chainlink dockerhub&lt;/a&gt;.
If you are interested in contributing please see our &lt;a class=&#34;link&#34; href=&#34;./docs/CONTRIBUTING.md&#34; &gt;contribution guidelines&lt;/a&gt;.
If you are here to report a bug or request a feature, please &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/issues&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;check currently open Issues&lt;/a&gt;.
For more information about how to get started with Chainlink, check our &lt;a class=&#34;link&#34; href=&#34;https://docs.chain.link/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;community&#34;&gt;Community
&lt;/h2&gt;&lt;p&gt;Chainlink has an active and ever growing community. &lt;a class=&#34;link&#34; href=&#34;https://discordapp.com/invite/aSK4zew&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Discord&lt;/a&gt;
is the primary communication channel used for day to day communication,
answering development questions, and aggregating Chainlink related content. Take
a look at the &lt;a class=&#34;link&#34; href=&#34;./docs/COMMUNITY.md&#34; &gt;community docs&lt;/a&gt; for more information
regarding Chainlink social accounts, news, and networking.&lt;/p&gt;
&lt;h2 id=&#34;build-chainlink&#34;&gt;Build Chainlink
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://golang.org/doc/install&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install Go 1.23&lt;/a&gt;, and add your GOPATH&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://golang.org/doc/code.html#GOPATH&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bin directory to your PATH&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Example Path for macOS &lt;code&gt;export PATH=$GOPATH/bin:$PATH&lt;/code&gt; &amp;amp; &lt;code&gt;export GOPATH=/Users/$USER/go&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;a class=&#34;link&#34; href=&#34;https://nodejs.org/en/download/package-manager/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NodeJS v20&lt;/a&gt; &amp;amp; &lt;a class=&#34;link&#34; href=&#34;https://pnpm.io/installation#using-npm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pnpm v10 via npm&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;It might be easier long term to use &lt;a class=&#34;link&#34; href=&#34;https://nodejs.org/en/download/package-manager/#nvm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;nvm&lt;/a&gt; to switch between node versions for different projects. For example, assuming $NODE_VERSION was set to a valid version of NodeJS, you could run: &lt;code&gt;nvm install $NODE_VERSION &amp;amp;&amp;amp; nvm use $NODE_VERSION&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;a class=&#34;link&#34; href=&#34;https://wiki.postgresql.org/wiki/Detailed_installation_guides&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Postgres (&amp;gt;= 12.x)&lt;/a&gt;. It is recommended to run the latest major version of postgres.
&lt;ul&gt;
&lt;li&gt;Note if you are running the official Chainlink docker image, the highest supported Postgres version is 16.x due to the bundled client.&lt;/li&gt;
&lt;li&gt;You should &lt;a class=&#34;link&#34; href=&#34;https://www.postgresql.org/docs/current/ssl-tcp.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;configure Postgres&lt;/a&gt; to use SSL connection (or for testing you can set &lt;code&gt;?sslmode=disable&lt;/code&gt; in your Postgres query string).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Download Chainlink: &lt;code&gt;git clone https://github.com/smartcontractkit/chainlink &amp;amp;&amp;amp; cd chainlink&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build and install Chainlink: &lt;code&gt;make install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run the node: &lt;code&gt;chainlink help&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For the latest information on setting up a development environment, see the &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/wiki/Development-Setup-Guide&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Development Setup Guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;build-from-pr&#34;&gt;Build from PR
&lt;/h3&gt;&lt;p&gt;To build an unofficial testing-only image from a feature branch or PR. You can do one of the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Send a workflow dispatch event from our &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/actions/workflows/docker-build.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;docker-build&lt;/code&gt; workflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add the &lt;code&gt;build-publish&lt;/code&gt; label to your PR and then either retry the &lt;code&gt;docker-build&lt;/code&gt; workflow, or push a new commit.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;build-plugins&#34;&gt;Build Plugins
&lt;/h3&gt;&lt;p&gt;Plugins are defined in yaml files within the &lt;code&gt;plugins/&lt;/code&gt; directory. Each plugin file is a yaml file and has a &lt;code&gt;plugins.&lt;/code&gt; prefix name. Plugins are installed with &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink-common/tree/main/pkg/loop/cmd/loopinstall&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;loopinstall&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To install the plugins, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make install-plugins
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Some plugins (such as those in &lt;code&gt;plugins/plugins.private.yaml&lt;/code&gt;) reference private GitHub repositories. To build these plugins, you must have a GITHUB_TOKEN environment variable set, or preferably use the &lt;a class=&#34;link&#34; href=&#34;https://cli.github.com/manual/gh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gh&lt;/a&gt; GitHub CLI tool to use the &lt;a class=&#34;link&#34; href=&#34;https://cli.github.com/manual/gh_auth_setup-git&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub CLI credential helper&lt;/a&gt; like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Sets up a credential helper.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh auth setup-git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then you can build the plugins with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make install-plugins-private
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;docker-builds&#34;&gt;Docker Builds
&lt;/h3&gt;&lt;p&gt;To build the experimental &amp;ldquo;plugins&amp;rdquo; Chainlink docker image, you can run this from the root of the repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The GITHUB_TOKEN is required to access private repos which are used by some plugins.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;gh auth token&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# requires the `gh` cli tool.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make docker-plugins
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;ethereum-execution-client-requirements&#34;&gt;Ethereum Execution Client Requirements
&lt;/h3&gt;&lt;p&gt;In order to run the Chainlink node you must have access to a running Ethereum node with an open websocket connection.
Any Ethereum based network will work once you&amp;rsquo;ve &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink#configure&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;configured&lt;/a&gt; the chain ID.
Ethereum node versions currently tested and supported:&lt;/p&gt;
&lt;p&gt;[Officially supported]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/openethereum/openethereum&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Parity/Openethereum&lt;/a&gt; (NOTE: Parity is deprecated and support for this client may be removed in future)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ethereum/go-ethereum/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Geth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/hyperledger/besu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Besu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[Supported but broken]
These clients are supported by Chainlink, but have bugs that prevent Chainlink from working reliably on these execution clients.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/NethermindEth/nethermind&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nethermind&lt;/a&gt;
Blocking issues:
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/NethermindEth/nethermind/issues/4384&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/NethermindEth/nethermind/issues/4384&lt;/a&gt;&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ledgerwatch/erigon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Erigon&lt;/a&gt;
Blocking issues:
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ledgerwatch/erigon/discussions/4946&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/ledgerwatch/erigon/discussions/4946&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ledgerwatch/erigon/issues/4030#issuecomment-1113964017&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/ledgerwatch/erigon/issues/4030#issuecomment-1113964017&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We cannot recommend specific version numbers for ethereum nodes since the software is being continually updated, but you should usually try to run the latest version available.&lt;/p&gt;
&lt;h2 id=&#34;running-a-local-chainlink-node&#34;&gt;Running a local Chainlink node
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: By default, chainlink will run in TLS mode. For local development you can disable this by using a &lt;code&gt;dev build&lt;/code&gt; using &lt;code&gt;make chainlink-dev&lt;/code&gt; and setting the TOML fields:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;WebServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;SecureCookies&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;TLS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;HTTPSPort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Insecure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;DevWebServer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Alternatively, you can generate self signed certificates using &lt;code&gt;tools/bin/self-signed-certs&lt;/code&gt; or &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/wiki/Creating-Self-Signed-Certificates&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;manually&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To start your Chainlink node, simply run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chainlink node start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;By default this will start on port 6688. You should be able to access the UI at &lt;a class=&#34;link&#34; href=&#34;http://localhost:6688/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:6688/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chainlink provides a remote CLI client as well as a UI. Once your node has started, you can open a new terminal window to use the CLI. You will need to log in to authorize the client first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chainlink admin login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;(You can also set &lt;code&gt;ADMIN_CREDENTIALS_FILE=/path/to/credentials/file&lt;/code&gt; in future if you like, to avoid having to login again).&lt;/p&gt;
&lt;p&gt;Now you can view your current jobs with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chainlink &lt;span class=&#34;nb&#34;&gt;jobs&lt;/span&gt; list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To find out more about the Chainlink CLI, you can always run &lt;code&gt;chainlink help&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a class=&#34;link&#34; href=&#34;https://docs.chain.link/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;doc&lt;/a&gt; pages on &lt;a class=&#34;link&#34; href=&#34;https://docs.chain.link/docs/jobs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jobs&lt;/a&gt; to learn more about how to create Jobs.&lt;/p&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration
&lt;/h3&gt;&lt;p&gt;Node configuration is managed by a combination of environment variables and direct setting via API/UI/CLI.&lt;/p&gt;
&lt;p&gt;Check the &lt;a class=&#34;link&#34; href=&#34;https://docs.chain.link/docs/configuration-variables&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;official documentation&lt;/a&gt; for more information on how to configure your node.&lt;/p&gt;
&lt;h3 id=&#34;external-adapters&#34;&gt;External Adapters
&lt;/h3&gt;&lt;p&gt;External adapters are what make Chainlink easily extensible, providing simple integration of custom computations and specialized APIs. A Chainlink node communicates with external adapters via a simple REST API.&lt;/p&gt;
&lt;p&gt;For more information on creating and using external adapters, please see our &lt;a class=&#34;link&#34; href=&#34;https://docs.chain.link/docs/external-adapters&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;external adapters page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;verify-official-chainlink-releases&#34;&gt;Verify Official Chainlink Releases
&lt;/h2&gt;&lt;p&gt;We use &lt;code&gt;cosign&lt;/code&gt; with OIDC keyless signing during the &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/actions/workflows/build-publish.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Build, Sign and Publish Chainlink&lt;/a&gt; workflow.&lt;/p&gt;
&lt;p&gt;It is encourage for any node operator building from the official Chainlink docker image to verify the tagged release version was did indeed built from this workflow.&lt;/p&gt;
&lt;p&gt;You will need &lt;code&gt;cosign&lt;/code&gt; in order to do this verification. &lt;a class=&#34;link&#34; href=&#34;https://docs.sigstore.dev/system_config/installation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Follow the instruction here to install cosign&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# tag is the tagged release version - ie. 2.16.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cosign verify index.docker.io/smartcontract/chainlink:&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      --certificate-oidc-issuer https://token.actions.githubusercontent.com &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      --certificate-identity &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://github.com/smartcontractkit/chainlink/.github/workflows/build-publish.yml@refs/tags/v&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;development&#34;&gt;Development
&lt;/h2&gt;&lt;h3 id=&#34;running-tests&#34;&gt;Running tests
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://pnpm.io/installation#using-npm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install pnpm 10 via npm&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;a class=&#34;link&#34; href=&#34;https://github.com/fjl/gencodec&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gencodec&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://stedolan.github.io/jq/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;jq&lt;/a&gt; to be able to run &lt;code&gt;go generate ./...&lt;/code&gt; and &lt;code&gt;make abigen&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install mockery&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;make mockery&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Using the &lt;code&gt;make&lt;/code&gt; command will install the correct version.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Generate and compile static assets:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make generate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Prepare your development environment:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The tests require a postgres database. In turn, the environment variable
&lt;code&gt;CL_DATABASE_URL&lt;/code&gt; must be set to value that can connect to &lt;code&gt;_test&lt;/code&gt; database, and the user must be able to create and drop
the given &lt;code&gt;_test&lt;/code&gt; database.&lt;/p&gt;
&lt;p&gt;Note: Other environment variables should not be set for all tests to pass&lt;/p&gt;
&lt;p&gt;There helper script for initial setup to create an appropriate test user. It requires postgres to be running on localhost at port 5432. You will be prompted for
the &lt;code&gt;postgres&lt;/code&gt; user password&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make setup-testdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This script will save the &lt;code&gt;CL_DATABASE_URL&lt;/code&gt; in &lt;code&gt;.dbenv&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Changes to database require migrations to be run. Similarly, &lt;code&gt;pull&lt;/code&gt;&amp;lsquo;ing the repo may require migrations to run.
After the one-time setup above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;source .dbenv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make testdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you encounter the error &lt;code&gt;database accessed by other users (SQLSTATE 55006) exit status 1&lt;/code&gt;
and you want force the database creation then use&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;source .dbenv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make testdb-force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Run tests:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; ./...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;notes&#34;&gt;Notes
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;parallel&lt;/code&gt; flag can be used to limit CPU usage, for running tests in the background (&lt;code&gt;-parallel=4&lt;/code&gt;) - the default is &lt;code&gt;GOMAXPROCS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;p&lt;/code&gt; flag can be used to limit the number of &lt;em&gt;packages&lt;/em&gt; tested concurrently, if they are interferring with one another (&lt;code&gt;-p=1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-short&lt;/code&gt; flag skips tests which depend on the database, for quickly spot checking simpler tests in around one minute&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;race-detector&#34;&gt;Race Detector
&lt;/h4&gt;&lt;p&gt;As of Go 1.1, the runtime includes a data race detector, enabled with the &lt;code&gt;-race&lt;/code&gt; flag. This is used in CI via the
&lt;code&gt;tools/bin/go_core_race_tests&lt;/code&gt; script. If the action detects a race, the artifact on the summary page will include
&lt;code&gt;race.*&lt;/code&gt; files with detailed stack traces.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;It will not issue false positives, so take its warnings seriously.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For local, targeted race detection, you can run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GORACE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;log_path=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/race&amp;#34;&lt;/span&gt; go &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -race ./core/path/to/pkg -count &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GORACE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;log_path=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/race&amp;#34;&lt;/span&gt; go &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -race ./core/path/to/pkg -count &lt;span class=&#34;m&#34;&gt;100&lt;/span&gt; -run TestFooBar/sub_test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://go.dev/doc/articles/race_detector&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://go.dev/doc/articles/race_detector&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;fuzz-tests&#34;&gt;Fuzz tests
&lt;/h4&gt;&lt;p&gt;As of Go 1.18, fuzz tests &lt;code&gt;func FuzzXXX(*testing.F)&lt;/code&gt; are included as part of the normal test suite, so existing cases are executed with &lt;code&gt;go test&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, you can run active fuzzing to search for new cases:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; ./pkg/path -run&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;XXX -fuzz&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;FuzzTestName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://go.dev/doc/fuzz/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://go.dev/doc/fuzz/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;go-modules&#34;&gt;Go Modules
&lt;/h3&gt;&lt;p&gt;This repository contains three Go modules:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart RL
    github.com/smartcontractkit/chainlink/v2
    github.com/smartcontractkit/chainlink/integration-tests --&amp;gt; github.com/smartcontractkit/chainlink/v2
    github.com/smartcontractkit/chainlink/core/scripts --&amp;gt; github.com/smartcontractkit/chainlink/v2
&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;integration-tests&lt;/code&gt; and &lt;code&gt;core/scripts&lt;/code&gt; modules import the root module using a relative replace in their &lt;code&gt;go.mod&lt;/code&gt; files,
so dependency changes in the root &lt;code&gt;go.mod&lt;/code&gt; often require changes in those modules as well. After making a change, &lt;code&gt;go mod tidy&lt;/code&gt;
can be run on all three modules using:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make gomodtidy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;code-generation&#34;&gt;Code Generation
&lt;/h3&gt;&lt;p&gt;Go generate is used to generate mocks in this project. Mocks are generated with &lt;a class=&#34;link&#34; href=&#34;https://github.com/vektra/mockery&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mockery&lt;/a&gt; and live in core/internal/mocks.&lt;/p&gt;
&lt;h3 id=&#34;nix&#34;&gt;Nix
&lt;/h3&gt;&lt;p&gt;A &lt;a class=&#34;link&#34; href=&#34;https://nixos.wiki/wiki/Development_environment_with_nix-shell&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;shell.nix&lt;/a&gt; is provided for use with the &lt;a class=&#34;link&#34; href=&#34;https://nixos.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nix package manager&lt;/a&gt;. By default,we utilize the shell through &lt;a class=&#34;link&#34; href=&#34;https://nixos.wiki/wiki/Flakes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nix Flakes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nix defines a declarative, reproducible development environment. Flakes version use deterministic, frozen (&lt;code&gt;flake.lock&lt;/code&gt;) dependencies to
gain more consistency/reproducibility on the built artifacts.&lt;/p&gt;
&lt;p&gt;To use it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a class=&#34;link&#34; href=&#34;https://nixos.org/download.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;nix package manager&lt;/a&gt; in your system.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Enable &lt;a class=&#34;link&#34; href=&#34;https://nixos.wiki/wiki/Flakes#Enable_flakes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;flakes support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Run &lt;code&gt;nix develop&lt;/code&gt;. You will be put in shell containing all the dependencies.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Optionally, &lt;code&gt;nix develop --command $SHELL&lt;/code&gt; will make use of your current shell instead of the default (bash).&lt;/li&gt;
&lt;li&gt;You can use &lt;code&gt;direnv&lt;/code&gt; to enable it automatically when &lt;code&gt;cd&lt;/code&gt;-ing into the folder; for that, enable &lt;a class=&#34;link&#34; href=&#34;https://github.com/nix-community/nix-direnv&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;nix-direnv&lt;/a&gt; and &lt;code&gt;use flake&lt;/code&gt; on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Create a local postgres database:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p &lt;span class=&#34;nv&#34;&gt;$PGDATA&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PGDATA&lt;/span&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;initdb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg_ctl -l postgres.log -o &lt;span class=&#34;s2&#34;&gt;&amp;#34;--unix_socket_directories=&amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PWD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39;&amp;#34;&lt;/span&gt; start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;createdb chainlink_test -h localhost
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;createuser --superuser --password chainlink -h localhost
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# then type a test password, e.g.: chainlink, and set it in shell.nix CL_DATABASE_URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;When re-entering project, you can restart postgres: &lt;code&gt;cd $PGDATA; pg_ctl -l postgres.log -o &amp;quot;--unix_socket_directories=&#39;$PWD&#39;&amp;quot; start&lt;/code&gt;
Now you can run tests or compile code as usual.&lt;/li&gt;
&lt;li&gt;When you&amp;rsquo;re done, stop it: &lt;code&gt;cd $PGDATA; pg_ctl -o &amp;quot;--unix_socket_directories=&#39;$PWD&#39;&amp;quot; stop&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;changesets&#34;&gt;Changesets
&lt;/h3&gt;&lt;p&gt;We use &lt;a class=&#34;link&#34; href=&#34;https://github.com/changesets/changesets&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;changesets&lt;/a&gt; to manage versioning for libs and the services.&lt;/p&gt;
&lt;p&gt;Every PR that modifies any configuration or code, should most likely accompanied by a changeset file.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;changesets&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;pnpm&lt;/code&gt; if it is not already installed - &lt;a class=&#34;link&#34; href=&#34;https://pnpm.io/installation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pnpm install&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Either after or before you create a commit, run the &lt;code&gt;pnpm changeset&lt;/code&gt; command to create an accompanying changeset entry which will reflect on the CHANGELOG for the next release.&lt;/p&gt;
&lt;p&gt;The format is based on &lt;a class=&#34;link&#34; href=&#34;https://keepachangelog.com/en/1.0.0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Keep a Changelog&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;and this project adheres to &lt;a class=&#34;link&#34; href=&#34;https://semver.org/spec/v2.0.0.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Semantic Versioning&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;tips&#34;&gt;Tips
&lt;/h3&gt;&lt;p&gt;For more tips on how to build and test Chainlink, see our &lt;a class=&#34;link&#34; href=&#34;https://github.com/smartcontractkit/chainlink/wiki/Development-Tips&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;development tips page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;contributing&#34;&gt;Contributing
&lt;/h3&gt;&lt;p&gt;Contributions are welcome to Chainlink&amp;rsquo;s source code.&lt;/p&gt;
&lt;p&gt;Please check out our &lt;a class=&#34;link&#34; href=&#34;./docs/CONTRIBUTING.md&#34; &gt;contributing guidelines&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;Thank you!&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
