45252


Solidity + Truffleを使用しています

送金した際に任意のメッセージを追加したいです

以下 solidity

[code]

    event Transfer(address indexed from, address indexed to, uint256 value, string comment);
    
    function transfer(address _to, uint _value) public returns (bool success) {
        balances[msg.sender] = balances[msg.sender] - _value;
        balances[_to] = balances[_to] + _value;
    
        emit Transfer(msg.sender, _to, _value, msg.data);
    
        return true;
    }
    
[/code]

以下 truffle console

[code]

    > con.transfer.sendTransaction(web3.eth.accounts[1], 10, "abc")
    > var str = web3.toAscii("トランザクションのinput")
    > consol.log(str)
    V¸Ç$ñR¾öÇ3O­
               W×r·2
    `abc
    
[/code]

abc が取得出来ました

今度は日本語を入力しました

[code]

    > con.transfer.sendTransaction(web3.eth.accounts[1], 10, "いいね")
    > var str = web3.toAscii("トランザクションのinput")
    > consol.log(str)
    M   e©§1K£ÇAAÝÇ¶r»R5ï\Æfñ1! Å
    
[/code]

文字化け起こしました

全角が使用出来ないのかなと思い、（フロントのプログラムで）エンコードした値をセットすればと考えましたが、inputの切れ目(目的のデータ位置)がわからずメッセージだけ取り出す方法がわかりません

トークン送付、Eth送金時にメッセージを追加する方法例がある方教えていただけないでしょうか

* * *

bytesにすべきとアドバイスがあったのでsolidity変更しました

[code]

    event Transfer(address indexed from, address indexed to, uint256 value, bytes comment);
    
    function transfer(address _to, uint _value, bytes comment) public returns (bool success) {
        balances[msg.sender] = balances[msg.sender] - _value;
        balances[_to] = balances[_to] + _value;
        emit Transfer(msg.sender, _to, _value, msg.data);
        return true;
    }
    
[/code]

pythonでの実行(EVMではなくすみません)

成功する場合：ただし引数に含めているので不本意です

[code]

    contract_instance.functions.transfer(W3.eth.accounts[1], 10, com2).transact({'from': ADDRESS_0})
    
[/code]

NGな場合

[code]

    contract_instance.functions.transfer(W3.eth.accounts[1], 10).transact({'from': ADDRESS_0, 'data': com2})
    
    raise ValueError("Cannot set data in transact transaction")
    
[/code]

`data`に含めれば良かったと思うのですが間違っていますでしょうか


CC BY-SA 4.0
2018-07-02T07:00:35.347
45231
2019-05-26T05:51:06.187
2019-05-26T05:51:06.187
3060
27721
question
ethereum solidity
トランザクションへ任意の文字列を追加したい


> event Transfer(address indexed from, address indexed to, uint256 value,
> string comment);

上記string commentの型をbytes32にして見たら如何ですか？  
文字化けは解消しないかもしれませんが、可変長のstringとは違って固定長なのでinputの切れ目(目的のデータ位置)は固定されます。

たしか自分も試してエンコード無しの日本語は駄目だった記憶があります。

それと公式がbytes32型を推奨しているので、特別な理由が無い限りbytes32型を利用した方が良いです。  
固定長でgasの節約が期待出来、eventのデータsizeも固定されたりと色々メリットがあります。


CC BY-SA 4.0
2018-07-03T01:52:17.390
45252
2018-07-05T02:02:39.200
2018-07-05T02:02:39.200
22827
22827
45231
answer