Ethereum生态的不断壮大,导致交易数量急剧增加,用户不得不在交易速度和手续费之间做出艰难的选择。随着DeFi和NFT项目持续火爆,产生了高额利润催生了大量的“套利”交易,导致用户对区块链数据隐私的需求不断增加。PlatON结合区块链、人工智能和隐私计算技术,建立了一个去中心化的协作式隐私人工智能区块链网络。相较于以太坊在交易速度、交易成本和数据隐私方面有巨大的优势。为提高开发效率,PlatON 1.1.1版本和Alaya0.16.1版本将开始全面兼容Ethereum生态工具。本文将以ENS为例,讲解如何将Ethereum智能合约迁移到PlatON中。
ENS(Ethereum Name Service)是一个基于Ethereum的分布式、开放和可扩展的命名系统。ENS是一个层次结构的域名系统,层次的名称叫做域,不同域之间以“点“作为分隔符,一个域的所有者能够完全控制其子域。ENS主要由注册表和解析器组成。其中,注册表用于维护所有域名和子域名列表,解析器负责将域名转换为地址。通过分析ENS智能合约,ENSRegistry.sol合约实现了注册表功能;ensdomains/resolver/PublicResolver合约实现了解析器功能。为实现子域名自动化注册,需要部署FIFSRegistrar.sol合约。此外,启用ENS反向解析,需部署ReverseRegistrar.sol合约。
在Ethereum生态中,用于智能合约部署的工具主要有Truffle和Remix两种,首先介绍如何使用Truffle部署合约。
首先需要利用高于v8.9.4的nodejs安装Truffle
npm install -g truffle
Step1 下载ENS合约
git clone https://github.com/ensdomains/ens.git && cd ens
Step2 使用truffle初始化一个工程
truffle init
在操作完成之后,就有如下项目结构:
210309http://35.247.155.162:6789、"https://devnetopenapi.platon.network/rpc" 以及 ws://35.247.155.162:6790vim truffle-config.js
truffle-config.js 修改部分内容如下:
development: {
host: "35.247.155.162", // RPC(default: none)
port: 6789, // Standard PlatON port (default: none)
network_id: "*", // Any network (default: none)
from: "地址", // Account to send txs from (default: accounts[0]) 这个地址格式可以是0x或LAT,建议使用0x格式
},
...
compilers: {
solc: {
version: "^0.5.17", // 此版本号与合约声明的版本号保持一致
}
}
Step4 编译合约
truffle compile
在操作完成之后,生成如下目录结构:
Step1 新增合约部署脚本文件
cd migrations/ && vim 2_initial_ens.js
部署脚本文件名建议使用合约名称便于后面维护,如ENS合约对应的部署脚本文件为2_initial_ens.js,内容如下所示:
const ENS = artifacts.require("@ensdomains/ens/ENSRegistry");
const FIFSRegistrar = artifacts.require("@ensdomains/ens/FIFSRegistrar");
const ReverseRegistrar = artifacts.require("@ensdomains/ens/ReverseRegistrar");
const PublicResolver = artifacts.require("@ensdomains/resolver/PublicResolver");
const utils = require('web3-utils');
const namehash = require('eth-ens-namehash');
const tld = "test";
module.exports = function(deployer, network, accounts) {
let ens;
let resolver;
let registrar;
// Registry
deployer.deploy(ENS)
// Resolver
.then(function(ensInstance) {
ens = ensInstance;
return deployer.deploy(PublicResolver, ens.address);
})
.then(function(resolverInstance) {
resolver = resolverInstance;
return setupResolver(ens, resolver, accounts);
})
// Registrar
.then(function() {
return deployer.deploy(FIFSRegistrar, ens.address, namehash.hash(tld));
})
.then(function(registrarInstance) {
registrar = registrarInstance;
return setupRegistrar(ens, registrar);
})
// Reverse Registrar
.then(function() {
return deployer.deploy(ReverseRegistrar, ens.address, resolver.address);
})
.then(function(reverseRegistrarInstance) {
return setupReverseRegistrar(ens, resolver, reverseRegistrarInstance, accounts);
})
};
async function setupResolver(ens, resolver, accounts) {
const resolverNode = namehash.hash("resolver");
const resolverLabel = utils.sha3("resolver");
await ens.setSubnodeOwner("0x0000000000000000000000000000000000000000", resolverLabel, accounts[0]);
await ens.setResolver(resolverNode, resolver.address);
await resolver.setAddr(resolverNode, resolver.address);
}
async function setupRegistrar(ens, registrar) {
await ens.setSubnodeOwner("0x0000000000000000000000000000000000000000", utils.sha3(tld), registrar.address);
}
async function setupReverseRegistrar(ens, resolver, reverseRegistrar, accounts) {
await ens.setSubnodeOwner("0x0000000000000000000000000000000000000000", utils.sha3("reverse"), accounts[0]);
await ens.setSubnodeOwner(namehash.hash("reverse"), utils.sha3("addr"), reverseRegistrar.address);
}
Step2 解锁账户
进入Truffle控制台
truffle console
导入账户
web3.eth.personal.importRawKey('私钥','密码') // 私钥没有0x前缀
解锁账户
web3.eth.personal.unlockAccount('地址', '密码', 999999)
Step3 合约部署
truffle migrate
当看到以下内容代表合约已经部署成功。Gas实际上使用LAT结算,因此用于部署合约的地址中需要有一定的LAT。
Replacing 'ENSRegistry'
-----------------------
> transaction hash: 0x7f166ce0d1287202e0583c739cacb77d0166fb8c5c459b9aecd2491e44bfc5ba
> Blocks: 4 Seconds: 4
> contract address: 0x5215c9F58E1Bf2c4BF6c7B5F80AD612CE0623AA9
> block number: 6157441
> block timestamp: 1637306960253
> account: 0x54AFd12E9e5678F3Fc6f528120e1a13cb9c3c2AF
> balance: 198.00101596
> gas used: 584642 (0x8ebc2)
> gas price: 500 gwei
> value sent: 0 ETH
> total cost: 0.292321 ETH
Replacing 'PublicResolver'
--------------------------
> transaction hash: 0x78b33dc7ca8df8f72c0da17fd8d125207bc7903039c2987578500a150e32499d
> Blocks: 2 Seconds: 4
> contract address: 0xA447FDd6c8BF9Ce3Ce80f52b7075d5651D301369
> block number: 6157448
> block timestamp: 1637306967968
> account: 0x54AFd12E9e5678F3Fc6f528120e1a13cb9c3c2AF
> balance: 196.30776246
> gas used: 3386507 (0x33ac8b)
> gas price: 500 gwei
> value sent: 0 ETH
> total cost: 1.6932535 ETH
Replacing 'FIFSRegistrar'
-------------------------
> transaction hash: 0xcc61e6a21a9ec5b1f4678becbde438846396fbee59616f58898d05d5c8faa9e8
> Blocks: 2 Seconds: 4
> contract address: 0xd72eF5Af584bc13799361505207B3508bc317D93
> block number: 6157470
> block timestamp: 1637306992188
> account: 0x54AFd12E9e5678F3Fc6f528120e1a13cb9c3c2AF
> balance: 196.13476646
> gas used: 202670 (0x317ae)
> gas price: 500 gwei
> value sent: 0 ETH
> total cost: 0.101335 ETH
Replacing 'ReverseRegistrar'
----------------------------
> transaction hash: 0x80a6bb520f60849a385691e84600518a98308bd6e1cc2ecfbca66d79a1c36b3b
> Blocks: 3 Seconds: 4
> contract address: 0x7431eB4F2f8B55c76017b8e26fc0B7205709F08F
> block number: 6157481
> block timestamp: 1637307004348
> account: 0x54AFd12E9e5678F3Fc6f528120e1a13cb9c3c2AF
> balance: 195.85967096
> gas used: 505078 (0x7b4f6)
> gas price: 500 gwei
> value sent: 0 ETH
> total cost: 0.252539 ETH
> Saving artifacts
-------------------------------------
> Total cost: 2.3394485 ETH
Summary
=======
> Total deployments: 4
> Final cost: 2.3394485 ETH
使用Truffle迁移智能合约并非是最佳选择,主要原因包括三点:一是,需部署额外的Migrations.sol合约,增加了部署成本;二是,若部署合约所需时间较长,无法及时根据网络拥堵情况,灵活调整Gas;三是,部署过程中需全程保证网络链接,一旦失去网络链接需从头开始部署合约。而使用Remix可以较好的解决上述问题。
通过分析可知,迁移ENS需要部署四个智能合约。这四个合约分别位于https://github.com/ensdomains/ens/tree/master/contracts和https://github.com/ensdomains/resolvers内。首先进入https://remix.ethereum.org/将所有合约导入Remix中,如图1所示。
根据合约依赖关系,需要第一个部署的是注册表合约,即ENSRegistry.sol。首先,选择所需部署的合约;其次,根据合约声明选择solidity版本;最后,点击Compile ContractName编译合约,如图2、3所示。
若编译成功,则进入Remix的部署界面,完成ENSRegistry合约的部署,如图4所示。部署时,首先将PlatON测试网RPC添加到MateMask中,通过私钥将LAT地址导入到MateMask中;其次,在Remix的deploy界面中将ENVIRONMENT设置为Injected Web3 ,并将CONTRACT设置为所需部署的合约;然后,点击Deploy可以设置该笔交易的Gas Price,如图5所示;最后,在MateMask中点击确认,便成功部署该合约。
同理,使用Remix部署其余三个合约与部署ENSRegistry.sol方法一致。需额外注意的有三点。一是,如果合约通过import "@PATH/contractName.sol"导入其他合约,需要统一修改为import "https://github.com/PATH/contractName.sol";二是,若导入合约所使用solidity版本与项目版本不一致,需修改solidity版本和因此导致的编译错误;三是,构造函数需要传参时,需在Deploy后面传入参数。入参大于一时,使用“,”分割,如图6所示。
如果使用Truffle部署合约,可以使用Web3对部署的合约进行调试。首先,通过npm install web3安装web3包。由于项目需要调试的内容比较多,本文只介绍测试程序的主要框架。
const Web3 = require('web3')
const HttpProvider = ${RPC}
const web3 = new Web3(new Web3.providers.HttpProvider(HttpProvider))
const fs = require("fs");
const ABIString= fs.readFileSync("./build/contracts/fileName.json", "utf-8");
const ABIJSON= JSON.parse(ABIString);
const privateKey = '私钥'
web3.eth.accounts.wallet.add(privateKey)
const myAddr = web3.eth.accounts.wallet[0].address
var ContractName = new web3.eth.Contract(ABIJSON.abi,'ContractAddr');
async function test() {
// 修改合约状态的方法
var renturnsContent = await ContractName.methods.methodsName(param).send({
from:myAddr,
gas:2000000,
gasPrice:"999999"
},function(error,txHash){
console.log("error:",error);
console.log("txHash:",txHash);
})
console.log("renturnsContent:",renturnsContent);
// 查询合约状态
var renturnsContent= await ContractName.methods.methodsName(param).call()
console.log("renturnsContent:",renturnsContent);
}
如果使用Remix部署合约,合约部署成功之后在Deployed Contract下面会显示合约名称,合约地址和合约的对外方法,如图7所示。
至此,将ENS迁移到PlatON的整个流程介绍完毕。整个流程与在Ethereum上部署合约的体验一致,说明PlatON在兼容Ethereum生态方面已经足够成熟,将一步降低了Ethereum开发者在PlatON上的开发成本。期待,PlatON借助自身的隐私计算、AI方面的优势以及Ethereum强悍的生态,打造一更加强悍的生态,更好的服务于实体经济的发展。
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa
文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定
前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:
我正在使用SublimeText2,同时遵循MichaelHartl的RubyonRails教程。可以在http://ruby.railstutorial.org/book/ruby-on-rails-tutorial找到我所指的教程的具体部分。(ctrl+F“list5.26”)。我能够创建规范/支持文件。但是,在尝试创建spec/support/utilities.rb文件时,我收到消息“无法保存~/rails_projects/sample_app/spec/support/utilities.rb”。有人知道为什么会这样吗?SublimeText论坛上有人似乎遇到了完全相同的问
目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装