Rust 和 Elixir 如何读取以太坊和其他 EVM 智能合约:函数式编程和区块链

本系列将重点介绍两种函数式编程语言:Rust&Elixir。本篇分享函数式编程的思想和实践。

在这篇文章中将展示Elixir&Rust读取以太坊区块链上工作,例如,Polkadot上的Moonbeam !

Ethereumex & ExABI

我更喜欢 Elixir 的两个存储库是 Ethereumex:用于

}]

Ethereumex 的配置

首先,让我们将 Ethereumex 添加到 mix.exs 中的 depsand 应用领域!

# mix.exs:

def application do

 [

 mod: ,

 extra_applications: [:logger, :runtime_tools, :ethereumex]

 ]

end

……

defp deps do

 [

 {:ethereumex, "~> 0.7.0"}

 ]

end

然后,在config/config.exs中。将

Tx结构

在 Elixir 中显示

通过代码很容易理解Elixir中的Struct。

}

gas的机制对新人不友好,所以我们现在可以设置gas_price和gas_limit为一个特定的数字:

@gas %

在 Rust 中显示

它是 Rust 中的一个类似结构:

/// from: https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/

let tx = TransactionRequest {

 from: accounts[0],

 to: Some(accounts[1]),

 gas: None, // gaslimit

 gas_price: None,

 value: Some(U256::from(10000)),

 data: None,

 nonce: None,

 condition: None

};

现在我们应该处理tx的两个参数:

to & data。

地址的字符串到二进制

end

}

eth函数的字符串样式抽象为”function_name(param_type1, param_type2,…)”

深入了解encode函数的实现是很好的!

def encode(function_signature, data, data_type \\ :input)

# string type of function to function_selector

# then call encode function again with function_selector

def encode(function_signature, data, data_type) when is_binary(function_signature) do

 function_signature

 |> Parser.parse!()

 |> encode(data, data_type)

end

def encode(%FunctionSelector{} = function_selector, data, data_type) do

 TypeEncoder.encode(data, function_selector, data_type)

end

FunctionSelector的结构:

iex(5)> ABI.Parser.parse!("baz(uint8)")

%ABI.FunctionSelector{

 function: "baz",

 input_names: [],

 inputs_indexed: nil,

 method_id: nil,

 returns: [],

 type: nil,

 types: [uint: 8]

}

TypeEncoder.encode 的工作是编译数据,function_selector 和 data_type 转换为数据。

end

我们要选择的函数是基于响应的类型,我们可以在ABI中获取它:

{

 "constant": true,

 "inputs": [],

 "name": "get",

 "outputs": [{

 "name": "",

 "type": "string" # The response is string!

 }

 ],

 "payable": false,

 "stateMutability": "view",

 "type": "function"

}

Elixir中的调用者

这是最后一步!只要把上面的功能混合在一起,

end

Rust 中的调用者

最后一个是调用

}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注