本系列将重点介绍两种函数式编程语言:Rust&Elixir。本篇分享函数式编程的思想和实践。
在这篇文章中将展示Elixir&Rust读取以太坊智能合约的功能。重要的是,该程序不仅在以太坊上工作,而且还在任何支持EVM的区块链上工作,例如,Polkadot上的Moonbeam!
Ethereumex&ExABI
我更喜欢Elixir的两个存储库是Ethereumex:用于以太坊区块链的ElixirJSON-RPC客户端。
ExABI:Solidity的应用程序二进制接口(ABI)描述了如何将二进制数据转换为Solidity编程语言能够理解的类型。
ABI小贴士:
ABI(应用程序二进制接口)是计算机科学中两个程序模块之间的接口。
它与API(应用程序接口)非常相似,API是代码接口的可读表示形式。ABI定义了用于与二进制合约交互的方法和结构,就像API那样,只是在更低的层次上。
.abi文件包含了json格式的函数接口和事件的描述。
这是HelloWorld.sol的示例ABI:
波卡周报:Polkadot更新到runtime v29 Rococo网络重启成功:根据PolkaWorld最新发布的波卡周报,本周重要事件包括:
1. Polkadot已经更新到runtime v29;
2. Polkaregistry提出的国库议案,一个更加去中心化的注册机器,已经被Polkadot理事会通过;
3. 波卡理事会通过了PolkaWorld提出的开发中文网站的国库申请;
4. OpenSquare提出的将doTreasury集成到波卡的国库议案正在讨论中;
5. Polkadot目前staking率是64.1%,最小提名DOT数是226 DOT;
6. Rococo网络在这周重启成功,目前包括了插槽,拍卖,Crowdloan,注册等所有必要的平行链基础模块。随着这些基础模块的添加,平行链的拍卖和众贷功能已经在Polkadot-JS上开始测试。目前Acala的测试网Mandala PC2(id 666)赢得Rococo上的第一个平行链插槽拍卖,Plasm赢得了Rococo上的第二个平行链插槽。此外,Phala、ChainX、Zenlink等生态项目还在进行新一轮的拍卖。[2021/3/28 19:24:14]
,"name":"get","outputs":,"payable":false,"stateMutability":"view","type":"function"}]Ethereumex的配置
波卡周报:Rococo已接入11条平行链,还有21条平行链等待申请接入:根据PolkaWorld最新发布的波卡周报,本周重要事件包括:
1.PolkaBTC的公测测试网上线,同时获得了1300个DOT的国库资助,用于激励开发者使用测试网;
2.Compound公布了基于Compound chain白皮书的原型产品Gateway,这是一个由COMP代币持有者管理的Substrate区块链;
3.Ledger已经集成了波卡;
4.ONTOWallet现在集成了波卡作为他们支持的11条链之一;
5.Polkadot 0.8.29 已经发布,升级优先级低;
6.波卡的第16号公投,提议将波卡的验证人提高到599个,没有通过;
7.18号公投目前正在投票,提案人是一个技术问题的受害者,正在寻求偿还;
8.Staking率在过去几天保持相对稳定,但可以提名的最低DOT数量高达120 DOT;
9.波卡网络在era 1951 slash惩罚了9个验证人;
10.目前波卡平行链测试网Rococo已经接入11条平行链,还有21条平行链等待申请接入。目前因为有些平行链的验证人不在线,所以导致出块比较慢,预计Rococo在下周还有一次重启,以优化网络出块较慢的问题。[2021/3/7 18:22:50]
首先,让我们将Ethereumex添加到mix.exs中的depsand应用领域!
波卡周报:以太坊桥一季度接入Polkadot 一季度发布Kusama及Polkadot平行链:2月2日,波卡Polkadot官方社区PolkaBase发布波卡周报。主要内容包括:在不提供明确的链的情况下将无法启动Substrate;将在所有Polkadot RunTime中使用可扩展多重地址;修复cumulus的状态缓存;增加交易通知的最大度量标准;波卡15号公投,RunTime升级到Polkadot v27;波卡品牌重塑的已更新进入沉浸阶段;Kusama赏金提案子赏金扩展实施已执行;申请参加下一次解码的Polkadot的提案将于2月28日截止;2021 年第一季度比特币将进入Polkadot (PolkaBTC);以太坊桥即将在第一季度接入Polkadot;2021年第一季度,Kusama平行链发布,Polkadot平行链发布。[2021/2/3 18:45:26]
#mix.exs:defapplicationdo},extra_applications:]end……defpdepsdoend然后,在config/config.exs中。将以太坊协议主机参数添加到配置文件中:
#config.exsconfig:ethereumex,url:"http://localhost:8545"#nodeurlTx结构
在Elixir中显示
通过代码很容易理解Elixir中的Struct。
Huobi Trust正式成为美元合规稳定币HUSD的新托管方:据海外媒体报道,美国内华达州持牌信托公司Huobi Trust Company 6月24日宣布,其已被美元合规稳定币 HUSD 任命为新托管方。 Huobi Trust Company已获得美国内华达州工商部金融机构部门许可,并将于2021年7月接管HUSD 的托管业务。
Huobi Trust Company将为流通中的HUSD提供与美元1:1锚定的托管服务,同时为HUSD的发行公司Stable Universal提供一系列合规服务,由Huobi Trust Company托管的美元储备会由独立美国注册会计师事务所进行审计核实。[2021/6/24 0:04:02]
以太坊的tx在Elixir中显示:
Transaction{nonce:nonce,#countertoensurethesequenceoftxsgas_price:我们刚刚读取了以太坊中的数据,因此随机数是没有用的。只有在我们把数据写进合约的时候才需要更改随机数。
eth_call
立即执行一个新的消息调用,而不需要在区块链上创建交易。
参数
Object-交易调用对象
from:DATA,20Bytes-(可选)交易发送的地址
to:DATA,20Bytes-交易被指向到的地址
动态 | 云软件公司Workday收购区块链身份认证公司Trusted Key:商业和云软件公司Workday收购使用区块链技术的身份认证公司Trusted Key。据悉,Trusted Key由甲骨文和微软的两位前任高管于2016年创立。Workday收购Trusted Key,因为希望能够将认证证书(如学位、许可证和证书)转移到区块链上。[2019/7/19]
gas:QUANTITY-(可选)为交易执行提供的gas整数。eth_call消耗零gas,但某些执行可能需要这个参数
gasPrice:QUANTITY-(可选)每一种付费gas使用的gasPrice的整数
value:QUANTITY-(可选)与该交易一起发送的值的整数
data:DATA-(可选)方法签名和编码参数的哈希值
QUANTITY|TAG-整数区块号,或字符串"latest","earliest"或"pending",参见默认区块参数
返回
DATA-已执行合约的返回值。
例子
//Requestcurl-XPOST--data'{"jsonrpc":"2.0","method":"eth_call","params":,"id":1}'//Result{"id":1,"jsonrpc":"2.0","result":"0x"}gas的机制对新人不友好,所以我们现在可以设置gas_price和gas_limit为一个特定的数字:
在Rust中显示
它是Rust中的一个类似结构:
///from:https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/lettx=TransactionRequest{from:accounts,to:Some(accounts),gas:None,//gaslimitgas_price:None,value:Some(U256::from(10000)),data:None,nonce:None,condition:None};现在我们应该处理tx的两个参数:
to&data。
地址的字符串到二进制
区块链中使用的地址(如0x769699506f972A992fc8950C766F0C7256Df601f)可以在Elixir程序中转换为二进制:
eth函数的字符串样式抽象为"function_name(param_type1,param_type2,…)"
深入了解encode函数的实现是很好的!
defencode(function_signature,data,data_type\\:input)#stringtypeoffunctiontofunction_selector#thencallencodefunctionagainwithfunction_selectordefencode(function_signature,data,data_type)whenis_binary(function_signature)dofunction_signature|>Parser.parse!()|>encode(data,data_type)enddefencode(%FunctionSelector{}=function_selector,data,data_type)doTypeEncoder.encode(data,function_selector,data_type)endFunctionSelector的结构:
iex(5)>ABI.Parser.parse!("baz(uint8)")%ABI.FunctionSelector{function:"baz",input_names:,inputs_indexed:nil,method_id:nil,returns:,type:nil,types:}TypeEncoder.encode的工作是编译数据,function_selector和data_type转换为数据。
智能合约响应的翻译器
在Elixir中编写一个TypeTransalator将十六进制数据更改为普通数据用于智能合约的响应是好的:
defmoduleUtils.TypeTranslatordo……defdata_to_int(raw)doraw|>hex_to_bin()|>ABI.TypeDecoder.decode_raw()|>List.first()enddefdata_to_str(raw)doraw|>hex_to_bin()|>ABI.TypeDecoder.decode_raw()|>List.first()enddefdata_to_addr(raw)doaddr_bin=raw|>hex_to_bin()|>ABI.TypeDecoder.decode_raw()|>List.first()"0x"<>Base.encode16(addr_bin,case::lower)end……end我们要选择的函数是基于响应的类型,我们可以在ABI中获取它:
{"constant":true,"inputs":,"name":"get","outputs":,"payable":false,"stateMutability":"view","type":"function"}Elixir中的调用者
这是最后一步!只要把上面的功能混合在一起,智能合约的数据读取就可以工作了!
例如:读取ERC20代币的余额:
=TypeTranslator.hex_to_bytes(addr_str)data=get_data("balanceOf(address)",){:ok,balance_hex}=Ethereumex.HttpClient.eth_call(%{#thetxisencapsulatedbyethereumex.data:data,to:contract_addr})TypeTranslator.data_to_int(balance_hex)endRust中的调用者
最后一个是调用以太坊的例子
externcratehex;usehex_literal::hex;useweb3::{contract::{Contract,Options},types::{U256,H160,Bytes},};#asyncfnmain()->web3::contract::Result<()>{let_=env_logger::try_init();lethttp=web3::transports::Http::new("https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161")?;letweb3=web3::Web3::new(http);letaddr_u8=hex::decode("7Ad11de6d4C3DA366BC929377EE2CaFEcC412A10").expect("Decodingfailed");letaddr_h160=H160::from_slice(&addr_u8);letcontra=Contract::from_json(web3.eth(),addr_h160,include_bytes!("../contracts/hello_world.json"),)?;//letacct:=hex!("f24ff3a9cf04c71dbc94d0b566f7a27b94566cac").into();letresult=contra.query::("get",(),None,Options::default(),None).await?;println!("{}",result);Ok(()。Source:https://hackernoon.com/how-rust-and-elixir-read-ethereum-and-other-evm-smart-contracts-functional-programming-and-blockchain
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。