11月18, 2019

从web3访问映射变量

web3.js是以太坊提供的一个Javascript库,它封装了以太坊的JSON RPC API,提供了一系列与区块链交互的Javascript对象和函数,包括查看网络状态,查看本地账户、查看交易和区块、发送交易、编译/部署智能合约、调用智能合约等,其中最重要的就是与智能合约交互的API

web3.py是python版本。 通过call的方式调用的函数只在节点本地虚拟机中执行,不会产生交易,不会花费费用,不会修改数据

https://baijiahao.baidu.com/s?id=1612111808998454987&wfr=spider&for=pc

balance = instance.functions.balanceOf().call({'from':send_address})

sv_value = eval("globals.w3.eth.getBalance('" + addressi +"')")

ABI用一个array表示,其中包含数个JSON格式的function或者event.

Function:

包含7种

name:a stringfunction 名称
type:a string"function", "constructor", or "fallback"
inputs:an array,function 输入的参数,包含:
    name:a string,参数名称
    type:a string,参数的 data type(e.g. uint256)
    components:an array,如果输入的参数是 tuple(struct) type 才会有这个。描述 struct 中包含的资料型态
outputs:an array,function 的回传值,和 inputs 使用相同表示方式。如果没有回传值可忽略,值为 []
payable:true,如果 function 可收 Ether,预设为 false
constanttrue,如果 function 不会改写区块链的状态,反之为 false
stateMutability:a string,其值可能为以下其中之一:"pure"(不会读和写区块链状态)、"view"(会读区块链状态,但不会改写区块链状态)、"payable" and "nonpayable"(会改写区块链状态,且如可收 Ether 为 "payable",反之为 "nonpayable"

Solidity v0.4.16 中把 constant 这个修饰 function 的 key words 分成 view(neither reads from nor writes to the state)和 pure(does not modify the state),并从 v0.4.17 开始 Type Checker 会强制检查。constant 改为只用来修饰不能被修改的 variable。并在 ABI 中加入 stateMutability 这个栏位统一表示,payable 和 constant 目前保留是为了向后兼容。这个更新详细的内容和讨论可参考:Introduce a real constant keyword and rename the current behaviour #992

Event 4个类型

name: a string,event 的名称
type: a string,always "event"
inputs: an array,输入的参数,包含:
    name: a string,参数名称
    type: a string,参数的 data type(e.g. uint256)
    components: an array,如果输入的参数是 tuple(struct) type 才会有这个。描述 struct 中包含的资料型态
    indexed: true,如果这个参数为 indexed(被存在 log 的 topics 中),反之为 false(储存在 logdata 中)
anonymous: true,如果 event 为 anonymous

以下是 solidity 记录

Mappings 和哈希表类似,它会执行虚拟初始化,以使所有可能存在的键都映射到一个字节表示为全零的值。

映射是这样定义的:

//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中:
mapping (address => uint) public accountBalance;
//或者可以用来通过userId 存储/查找的用户名
mapping (uint => string) userIdToName;

在第一个例子中,键是一个 address,值是一个 uint,在第二个例子中,键是一个uint,值是一个 string。

格式:mapping(_KeyType => _ValueType)

取值操作:

userIdToName[12]
// 如果键12 不在 映射中,得到的结果是

映射中,实际上并不存储 key,而是存储它的 keccak256 哈希值,从而便于查询实际的值。所以映射是没有长度的,也没有 key 的集合或 value 的集合的概念。,你不能像操作python字典那应该获取到当前 Mappings 的所有键或者值。

msg.sender指的是当前调用者(或智能合约)的 address。

注意:在 Solidity 中,功能执行始终需要从外部调用者开始。 一个合约只会在区块链上什么也不做,除非有人调用其中的函数。所以对于每一个外部函数调用,包括 msg.sender 和 msg.value 在内所有 msg 成员的值都会变化。这里包括对库函数的调用

使用 msg.sender 来更新 mapping 的例子:

mapping (address => uint) favoriteNumber;

function setMyNumber(uint _myNumber) public {
  // 更新我们的 `favoriteNumber` 映射来将 `_myNumber`存储在 `msg.sender`名下
  favoriteNumber[msg.sender] = _myNumber;
  // 存储数据至映射的方法和将数据存储在数组相似
}

function whatIsMyNumber() public view returns (uint) {
  // 拿到存储在调用者地址名下的值
  // 若调用者还没调用 setMyNumber, 则值为 `0`
  return favoriteNumber[msg.sender];
}

区块和交易属性:

block.blockhash(uint blockNumber) returns (bytes32):指定区块的区块哈希——仅可用于最新的 256 个区块且不包括当前区块;而 blocks0.4.22 版本开始已经不推荐使用,由 blockhash(uint blockNumber) 代替
block.coinbase (address): 挖出当前区块的矿工地址
block.difficulty (uint): 当前区块难度
block.gaslimit (uint): 当前区块 gas 限额
block.number (uint): 当前区块号
block.timestamp (uint): 自 unix epoch 起始当前区块以秒计的时间戳
gasleft() returns (uint256):剩余的 gas
msg.data (bytes): 完整的 calldata
msg.gas (uint): 剩余 gas -0.4.21 版本开始已经不推荐使用,由 gesleft() 代替
msg.sender (address): 消息发送者(当前调用)
msg.sig (bytes4): calldata 的前 4 字节(也就是函数标识符)
msg.value (uint): 随消息发送的 wei 的数量
now (uint): 目前区块时间戳(block.timestamptx.gasprice (uint): 交易的 gas 价格
tx.origin (address): 交易发起者(完全的调用链)

错误处理

Solidity 使用状态恢复异常来处理错误。这种异常将撤消对当前调用(及其所有子调用)中的状态所做的所有更改,并且还向调用者标记错误

函数 assert 和 require 可用于检查条件并在条件不满足时抛出异常。

assert 函数只能用于测试内部错误,并检查非变量。 require 函数用于确认条件有效性,例如输入变量,或合约状态变量是否满足条件,或验证外部合约调用返回的值。

require使得函数在执行过程中,当不满足某些条件时抛出错误,并停止执行:

function sayHiToVitalik(string _name) public returns (string) {
  // 比较 _name 是否等于 "Vitalik". 如果不成立,抛出异常并终止程序
  // (敲黑板: Solidity 并不支持原生的字符串比较, 我们只能通过比较
  // 两字符串的 keccak256 哈希值来进行判断)
  require(keccak256(_name) == keccak256("Vitalik"));
  // 如果返回 true, 运行如下语句
  return "Hi!";
}

reference: https://ethfans.org/posts/understanding-smart-contract-abi https://solidity-cn.readthedocs.io/zh/develop/contracts.html https://blog.csdn.net/weixin_41545330/article/details/79550886 https://juejin.im/post/5bcde28b51882577102a3b7b https://me.tryblockchain.org/Solidity-abi-abstraction.html

本文链接:https://harry.ren/post/web3getmapping.html

-- EOF --

Comments