专注加密货币量化交易 , focus on crypto quant
CCXT:加密货币量化交易神器
CCXT框架 是一个Python/Javascript/PHP的一个交易API框架,对接超过130多个交易所。可用于世界各地的加密货币交易所的连接和交易,以及转账支付处理,可用于存储数据,分析,可视化,指标开发,算法交易,是一个非常容易集成的开箱即用的统一API。 CCXT框架Github地址: https://github.com/ccxt/ccxt 当前功能列表:支持许多交易市场,甚至即将推出的为所有交易提供完整的公共和私人API所有货币,山寨币和标记,价格,订单,交易,代码等…提供用于交叉交换或跨货币分析和套利的可选标准化数据开箱即用的统一的一体化API,非常易于集成适用于Node7.6+,Python2和3,PHP5.4+,Web浏览器认证交易所支持的加密货币交易所 ccxt库目前支持以下131个加密货币交易所和交易API,可以在github查看。上面的列表经常更新,新的加密市场,山寨币交换,错误修复,API端点定期引入和添加。有关详细信息,请参阅手册,如果你没有在上面的列表中找到加密货币交易市场和/或想要添加其他交易所,请通过GitHub或通过电子邮件在此处发布问题来发...
用基于 Python 的开发框架 Brownie 部署以太坊智能合约
在本文中,我们将使用Python部署智能合约。这篇文章可能是您走向智能合约和区块链开发的桥梁! 介绍 我希望可以在任何开发场景都尽量用Python。在区块链开发中,常用的是以太坊虚拟机智能合约语言Solidity,它具有许多不错的功能,并且仍然可以使用 Python 进行部署。刚开始使用Solidity时,我使用了Remix(https://remix.ethereum.org/),这是一个强大的Web IDE,可让您进行智能合约可视化。Remix很棒,我现在仍然使用它,但是在单个IDE之外可以实现很多其他功能。后来我开始学习Truffle(https://www.trufflesuite.com/)和HardHat(https://hardhat.org/guides/mainnet-forking.html),它们是用于部署智能合约的Node.js框架。 这些是到目前为止我所见过的主要框架,这些框架都不错,但是我更喜欢Python。所以当我发现Brownie 和web3.py:一个用于部署智能合约的Python框架和一个用于区块链开发的开源协议之后非常兴奋。我们将在本文中同时...
用 Python 和币安 API 构建数字货币交易机器人(一)
交易数字货币或任何其他资产的首要任务是要有目标和策略来实现。在这里,我们不是在谈论交易策略,而只是构建一个简单而功能强大的数字货币交易机器人来应用您的策略。本系列更像是一个数字货币自动交易机器人框架。 我们将使用python 3.9(3.9.2)首先创建项目文件结构。 /exchanges /strategies /models 在这里,“ exchanges”文件夹存储了Exchange API包装器,为您的策略制定策略并为我们将要使用的业务对象建模。 模型 我们将为此项目定义几个业务对象,例如价格,货币类型或订单。首先,让我们从价格开始,将其用于我们随后将要创建的策略。 在我们为业务对象编写通用抽象层之前: ./models/model.pyfrom datetime import datetime class AbstractModel: created: datetime def __init__(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) 然后是我们的第一个Pr...
CCXT:加密货币量化交易神器
CCXT框架 是一个Python/Javascript/PHP的一个交易API框架,对接超过130多个交易所。可用于世界各地的加密货币交易所的连接和交易,以及转账支付处理,可用于存储数据,分析,可视化,指标开发,算法交易,是一个非常容易集成的开箱即用的统一API。 CCXT框架Github地址: https://github.com/ccxt/ccxt 当前功能列表:支持许多交易市场,甚至即将推出的为所有交易提供完整的公共和私人API所有货币,山寨币和标记,价格,订单,交易,代码等…提供用于交叉交换或跨货币分析和套利的可选标准化数据开箱即用的统一的一体化API,非常易于集成适用于Node7.6+,Python2和3,PHP5.4+,Web浏览器认证交易所支持的加密货币交易所 ccxt库目前支持以下131个加密货币交易所和交易API,可以在github查看。上面的列表经常更新,新的加密市场,山寨币交换,错误修复,API端点定期引入和添加。有关详细信息,请参阅手册,如果你没有在上面的列表中找到加密货币交易市场和/或想要添加其他交易所,请通过GitHub或通过电子邮件在此处发布问题来发...
用基于 Python 的开发框架 Brownie 部署以太坊智能合约
在本文中,我们将使用Python部署智能合约。这篇文章可能是您走向智能合约和区块链开发的桥梁! 介绍 我希望可以在任何开发场景都尽量用Python。在区块链开发中,常用的是以太坊虚拟机智能合约语言Solidity,它具有许多不错的功能,并且仍然可以使用 Python 进行部署。刚开始使用Solidity时,我使用了Remix(https://remix.ethereum.org/),这是一个强大的Web IDE,可让您进行智能合约可视化。Remix很棒,我现在仍然使用它,但是在单个IDE之外可以实现很多其他功能。后来我开始学习Truffle(https://www.trufflesuite.com/)和HardHat(https://hardhat.org/guides/mainnet-forking.html),它们是用于部署智能合约的Node.js框架。 这些是到目前为止我所见过的主要框架,这些框架都不错,但是我更喜欢Python。所以当我发现Brownie 和web3.py:一个用于部署智能合约的Python框架和一个用于区块链开发的开源协议之后非常兴奋。我们将在本文中同时...
用 Python 和币安 API 构建数字货币交易机器人(一)
交易数字货币或任何其他资产的首要任务是要有目标和策略来实现。在这里,我们不是在谈论交易策略,而只是构建一个简单而功能强大的数字货币交易机器人来应用您的策略。本系列更像是一个数字货币自动交易机器人框架。 我们将使用python 3.9(3.9.2)首先创建项目文件结构。 /exchanges /strategies /models 在这里,“ exchanges”文件夹存储了Exchange API包装器,为您的策略制定策略并为我们将要使用的业务对象建模。 模型 我们将为此项目定义几个业务对象,例如价格,货币类型或订单。首先,让我们从价格开始,将其用于我们随后将要创建的策略。 在我们为业务对象编写通用抽象层之前: ./models/model.pyfrom datetime import datetime class AbstractModel: created: datetime def __init__(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) 然后是我们的第一个Pr...
专注加密货币量化交易 , focus on crypto quant

Subscribe to quantbang

Subscribe to quantbang
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers

在本文中,我们将学习如何使用 Brownie、Python 和 Chainlink 来制作非同质化的 NFT 作品,并在 OpenSea NFT 市场上展示和销售我们的成果。
动态和高级 NFT
动态 NFT 是可以随时间变化的 NFT,或者具有我们可以用来相互交互的链上功能。这些 NFT 可以无限定制,让我们可以制作整个游戏、元宇宙(metaverse)或某种互动艺术。下面我们进入高级部分。
高级快速入门
确保您的metamask中有足够的测试网 ETH 和 LINK,然后运行以下命令:
brownie run scripts/advanced_collectible/deploy_advanced.py --network rinkeby
brownie run scripts/advanced_collectible/create_collectible.py --network rinkeby
我们的收藏品是从 Chainlink VRF 返回的随机犬种。Chainlink VRF 是一种获得可证明随机数的方法,因此我们的 NFT 真正稀缺。然后我们想要创建它的元数据。
brownie run scripts/advanced_collectible/create_metadata.py --network rinkeby
然后我们可以选择将此数据上传到 IPFS,以便我们可以拥有一个 tokenURI。稍后我会告诉你如何做到这一点。现在,我们将仅使用以下示例 tokenURI:
https://ipfs.io/ipfs/Qmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=1-PUG.json
如果您将 IPFS Companion 下载到您的浏览器中,您可以使用该 URL 来查看 URI 返回的内容。它看起来像这样:
{
"name": "PUG",
"description": "An adorable PUG pup!",
"image": "https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png",
"attributes": [
{
"trait_type": "cuteness",
"value": 100
}
]
}
然后我们可以运行我们的 set_tokenuri.py 脚本:
brownie run scripts/advanced_collectible/set_tokenuri.py --network rinkeby
我们会得到这样的输出:
Running 'scripts/advanced_collectible/set_tokenuri.py::main'...
Working on rinkeby
Transaction sent: 0x8a83a446c306d6255952880c0ca35fa420248a84ba7484c3798d8bbad421f88e
Gas price: 1.0 gwei Gas limit: 44601 Nonce: 354
AdvancedCollectible.setTokenURI confirmed - Block: 8331653 Gas used: 40547 (90.91%)
Awesome! You can view your NFT at https://testnets.opensea.io/assets/0x679c5f9adC630663a6e63Fa27153B215fe021b34/0
Please give up to 20 minutes, and hit the "refresh metadata" button
我们可以点击给出的链接,看看它在 Opensea 上的样子!您可能需要点击刷新元数据按钮并等待几分钟。

随机品种
然我们看一下刚刚做了什么。这是我们的 AdvancedCollectible.sol:
pragma solidity 0.6.6;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";
contract AdvancedCollectible is ERC721, VRFConsumerBase {
uint256 public tokenCounter;
enum Breed{PUG, SHIBA_INU, BRENARD}
// add other things
mapping(bytes32 => address) public requestIdToSender;
mapping(bytes32 => string) public requestIdToTokenURI;
mapping(uint256 => Breed) public tokenIdToBreed;
mapping(bytes32 => uint256) public requestIdToTokenId;
event requestedCollectible(bytes32 indexed requestId);
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
constructor(address _VRFCoordinator, address _LinkToken, bytes32 _keyhash)
public
VRFConsumerBase(_VRFCoordinator, _LinkToken)
ERC721("Dogie", "DOG")
{
tokenCounter = 0;
keyHash = _keyhash;
fee = 0.1 * 10 ** 18;
}
function createCollectible(string memory tokenURI, uint256 userProvidedSeed)
public returns (bytes32){
bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);
requestIdToSender[requestId] = msg.sender;
requestIdToTokenURI[requestId] = tokenURI;
emit requestedCollectible(requestId);
}
function fulfillRandomness(bytes32 requestId, uint256 randomNumber) internal override {
address dogOwner = requestIdToSender[requestId];
string memory tokenURI = requestIdToTokenURI[requestId];
uint256 newItemId = tokenCounter;
_safeMint(dogOwner, newItemId);
_setTokenURI(newItemId, tokenURI);
Breed breed = Breed(randomNumber % 3);
tokenIdToBreed[newItemId] = breed;
requestIdToTokenId[requestId] = newItemId;
tokenCounter = tokenCounter + 1;
}
function setTokenURI(uint256 tokenId, string memory _tokenURI) public {
require(
_isApprovedOrOwner(_msgSender(), tokenId),
"ERC721: transfer caller is not owner nor approved"
);
_setTokenURI(tokenId, _tokenURI);
}
}
我们使用 Chainlink VRF 从 PUG、SHIBA_INU、BRENARD 列表中创建一个随机品种。当我们这次调用 createCollectible 时,我们实际上向链下的 Chainlink VRF 节点发起了一个请求,并返回一个随机数,以使用这 3 个品种之一创建 NFT。
在你的 NFT 中使用真正的随机性是创造真正稀缺性的好方法,使用 Chainlink oracle 随机数意味着你的数字可以证明是随机的,并且不会受到矿工的影响。
您可以在文档中了解有关 Chainlink VRF 的更多信息。
https://docs.chain.link/docs/chainlink-vrf/
Chainlink 节点通过调用 fulfillRandomness 函数进行响应,并根据随机数创建收藏品。然后我们仍然需要调用 _setTokenURI 来为我们的 NFT 提供它需要的外观。
我们没有在这里给出我们的 NFT 属性,但属性是让我们的 NFT 进行交互的好方法。您可以在此 龙与地下城示例中看到具有属性的 NFT 的一个很好的示例。
https://github.com/PatrickAlphaC/dungeons-and-dragons-nft
来自 IPFS 的元数据
我们使用 IPFS 来存储两个文件:
NFT 的形象(哈巴狗形象)
tokenURI 文件(JSON 文件,其中还包含图像的链接)
我们使用 IPFS 是因为它是一个免费的去中心化平台。我们可以通过下载 IPFS 桌面并点击导入按钮将我们的 tokenURI 和图像添加到 IPFS。

然后,我们可以通过点击要共享的文件旁边的 3 个点、点击共享链接并复制给定的链接来共享 URI。然后我们可以将此链接添加到我们的 set_tokenuri.py 文件中以更改我们想要使用的 tokenURI。
持久性
但是,如果 tokenURI 仅在我们的节点上,这意味着当我们的节点关闭时,没有其他人可以查看它。所以我们希望其他人 pin我们的 NFT。我们可以使用 Pinata 之类的 pin服务来帮助我们的数据保持活动状态,即使我们的 IPFS 节点已关闭。
我想未来会有越来越多的元数据存储在 IPFS 和去中心化存储平台上。集中式服务器可能会宕机,这意味着这些 NFT 上的艺术将永远丢失。请务必检查您使用的 NFT 的 tokenURI 所在的位置!
我也希望更多的人会使用像 Filecoin 这样的 dStorage 平台,因为使用 pin服务也没有像它应该的那样去中心化。
现在,您已经具备了制作漂亮有趣、可定制、交互式 NFT 的技能,并让它们在市场上呈现。
NFT 是一种有趣、强大的方式,可以补偿艺术家们所做的辛勤工作。

在本文中,我们将学习如何使用 Brownie、Python 和 Chainlink 来制作非同质化的 NFT 作品,并在 OpenSea NFT 市场上展示和销售我们的成果。
动态和高级 NFT
动态 NFT 是可以随时间变化的 NFT,或者具有我们可以用来相互交互的链上功能。这些 NFT 可以无限定制,让我们可以制作整个游戏、元宇宙(metaverse)或某种互动艺术。下面我们进入高级部分。
高级快速入门
确保您的metamask中有足够的测试网 ETH 和 LINK,然后运行以下命令:
brownie run scripts/advanced_collectible/deploy_advanced.py --network rinkeby
brownie run scripts/advanced_collectible/create_collectible.py --network rinkeby
我们的收藏品是从 Chainlink VRF 返回的随机犬种。Chainlink VRF 是一种获得可证明随机数的方法,因此我们的 NFT 真正稀缺。然后我们想要创建它的元数据。
brownie run scripts/advanced_collectible/create_metadata.py --network rinkeby
然后我们可以选择将此数据上传到 IPFS,以便我们可以拥有一个 tokenURI。稍后我会告诉你如何做到这一点。现在,我们将仅使用以下示例 tokenURI:
https://ipfs.io/ipfs/Qmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=1-PUG.json
如果您将 IPFS Companion 下载到您的浏览器中,您可以使用该 URL 来查看 URI 返回的内容。它看起来像这样:
{
"name": "PUG",
"description": "An adorable PUG pup!",
"image": "https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png",
"attributes": [
{
"trait_type": "cuteness",
"value": 100
}
]
}
然后我们可以运行我们的 set_tokenuri.py 脚本:
brownie run scripts/advanced_collectible/set_tokenuri.py --network rinkeby
我们会得到这样的输出:
Running 'scripts/advanced_collectible/set_tokenuri.py::main'...
Working on rinkeby
Transaction sent: 0x8a83a446c306d6255952880c0ca35fa420248a84ba7484c3798d8bbad421f88e
Gas price: 1.0 gwei Gas limit: 44601 Nonce: 354
AdvancedCollectible.setTokenURI confirmed - Block: 8331653 Gas used: 40547 (90.91%)
Awesome! You can view your NFT at https://testnets.opensea.io/assets/0x679c5f9adC630663a6e63Fa27153B215fe021b34/0
Please give up to 20 minutes, and hit the "refresh metadata" button
我们可以点击给出的链接,看看它在 Opensea 上的样子!您可能需要点击刷新元数据按钮并等待几分钟。

随机品种
然我们看一下刚刚做了什么。这是我们的 AdvancedCollectible.sol:
pragma solidity 0.6.6;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";
contract AdvancedCollectible is ERC721, VRFConsumerBase {
uint256 public tokenCounter;
enum Breed{PUG, SHIBA_INU, BRENARD}
// add other things
mapping(bytes32 => address) public requestIdToSender;
mapping(bytes32 => string) public requestIdToTokenURI;
mapping(uint256 => Breed) public tokenIdToBreed;
mapping(bytes32 => uint256) public requestIdToTokenId;
event requestedCollectible(bytes32 indexed requestId);
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
constructor(address _VRFCoordinator, address _LinkToken, bytes32 _keyhash)
public
VRFConsumerBase(_VRFCoordinator, _LinkToken)
ERC721("Dogie", "DOG")
{
tokenCounter = 0;
keyHash = _keyhash;
fee = 0.1 * 10 ** 18;
}
function createCollectible(string memory tokenURI, uint256 userProvidedSeed)
public returns (bytes32){
bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);
requestIdToSender[requestId] = msg.sender;
requestIdToTokenURI[requestId] = tokenURI;
emit requestedCollectible(requestId);
}
function fulfillRandomness(bytes32 requestId, uint256 randomNumber) internal override {
address dogOwner = requestIdToSender[requestId];
string memory tokenURI = requestIdToTokenURI[requestId];
uint256 newItemId = tokenCounter;
_safeMint(dogOwner, newItemId);
_setTokenURI(newItemId, tokenURI);
Breed breed = Breed(randomNumber % 3);
tokenIdToBreed[newItemId] = breed;
requestIdToTokenId[requestId] = newItemId;
tokenCounter = tokenCounter + 1;
}
function setTokenURI(uint256 tokenId, string memory _tokenURI) public {
require(
_isApprovedOrOwner(_msgSender(), tokenId),
"ERC721: transfer caller is not owner nor approved"
);
_setTokenURI(tokenId, _tokenURI);
}
}
我们使用 Chainlink VRF 从 PUG、SHIBA_INU、BRENARD 列表中创建一个随机品种。当我们这次调用 createCollectible 时,我们实际上向链下的 Chainlink VRF 节点发起了一个请求,并返回一个随机数,以使用这 3 个品种之一创建 NFT。
在你的 NFT 中使用真正的随机性是创造真正稀缺性的好方法,使用 Chainlink oracle 随机数意味着你的数字可以证明是随机的,并且不会受到矿工的影响。
您可以在文档中了解有关 Chainlink VRF 的更多信息。
https://docs.chain.link/docs/chainlink-vrf/
Chainlink 节点通过调用 fulfillRandomness 函数进行响应,并根据随机数创建收藏品。然后我们仍然需要调用 _setTokenURI 来为我们的 NFT 提供它需要的外观。
我们没有在这里给出我们的 NFT 属性,但属性是让我们的 NFT 进行交互的好方法。您可以在此 龙与地下城示例中看到具有属性的 NFT 的一个很好的示例。
https://github.com/PatrickAlphaC/dungeons-and-dragons-nft
来自 IPFS 的元数据
我们使用 IPFS 来存储两个文件:
NFT 的形象(哈巴狗形象)
tokenURI 文件(JSON 文件,其中还包含图像的链接)
我们使用 IPFS 是因为它是一个免费的去中心化平台。我们可以通过下载 IPFS 桌面并点击导入按钮将我们的 tokenURI 和图像添加到 IPFS。

然后,我们可以通过点击要共享的文件旁边的 3 个点、点击共享链接并复制给定的链接来共享 URI。然后我们可以将此链接添加到我们的 set_tokenuri.py 文件中以更改我们想要使用的 tokenURI。
持久性
但是,如果 tokenURI 仅在我们的节点上,这意味着当我们的节点关闭时,没有其他人可以查看它。所以我们希望其他人 pin我们的 NFT。我们可以使用 Pinata 之类的 pin服务来帮助我们的数据保持活动状态,即使我们的 IPFS 节点已关闭。
我想未来会有越来越多的元数据存储在 IPFS 和去中心化存储平台上。集中式服务器可能会宕机,这意味着这些 NFT 上的艺术将永远丢失。请务必检查您使用的 NFT 的 tokenURI 所在的位置!
我也希望更多的人会使用像 Filecoin 这样的 dStorage 平台,因为使用 pin服务也没有像它应该的那样去中心化。
现在,您已经具备了制作漂亮有趣、可定制、交互式 NFT 的技能,并让它们在市场上呈现。
NFT 是一种有趣、强大的方式,可以补偿艺术家们所做的辛勤工作。
No activity yet