From f62cefb172e81067dfc2febe9cddc4b79e8a292b Mon Sep 17 00:00:00 2001 From: ASAPSegfault <45430752+ASAPSegfault@users.noreply.github.com> Date: Tue, 15 Nov 2022 18:23:26 +0100 Subject: [PATCH] 218 deploy thyra on innonet 15 (#253) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uses testnet 15 Co-authored-by: Grégory Libert Co-authored-by: Sebastien Valla <83454858+SebastienValla@users.noreply.github.com> --- .../operations/cmd_execute_function.go | 89 +----------------- .../server/restapi/resource/swagger.yml | 18 +--- cmd/callSC/main.go | 2 +- cmd/executeSC/main.go | 2 +- cmd/executeSC/sc/websiteStorer.wasm | Bin 77006 -> 42385 bytes int/api/cmd/execute_function.go | 3 +- int/api/server.go | 2 +- pkg/node/sendoperation/callsc/callsc.go | 53 +++++------ pkg/node/sendoperation/executesc/executesc.go | 64 +++++++++---- pkg/node/sendoperation/sendoperation.go | 6 +- pkg/node/status.go | 7 +- pkg/onchain/dns/dns.go | 7 +- pkg/onchain/sc.go | 11 ++- pkg/onchain/website/sc/websiteStorer.wasm | Bin 77006 -> 42385 bytes pkg/onchain/website/uploader.go | 86 +++++++++++------ 15 files changed, 151 insertions(+), 199 deletions(-) diff --git a/api/swagger/server/restapi/operations/cmd_execute_function.go b/api/swagger/server/restapi/operations/cmd_execute_function.go index 7e4eb3bad..e91f3cfa6 100644 --- a/api/swagger/server/restapi/operations/cmd_execute_function.go +++ b/api/swagger/server/restapi/operations/cmd_execute_function.go @@ -73,8 +73,8 @@ type CmdExecuteFunctionBody struct { // Required: true At string `json:"at"` - // coins - Coins *CmdExecuteFunctionParamsBodyCoins `json:"coins,omitempty"` + // Set the fee amount (in massa) that will be given to the block creator. + Coins float64 `json:"coins,omitempty"` // Set the expiry duration (in number of slots) of the transaction. Expiry *int64 `json:"expiry,omitempty"` @@ -100,7 +100,7 @@ type CmdExecuteFunctionBody struct { func (o *CmdExecuteFunctionBody) UnmarshalJSON(b []byte) error { type CmdExecuteFunctionBodyAlias CmdExecuteFunctionBody var t CmdExecuteFunctionBodyAlias - if err := json.Unmarshal([]byte("{\"args\":\"\",\"at\":\"A1MrqLgWq5XXDpTBH6fzXHUg7E8M5U2fYDAF3E1xnUSzyZuKpMh\",\"coins\":{\"parallel\":0,\"sequential\":0},\"expiry\":3,\"fee\":0,\"gaz\":{\"limit\":700000000,\"price\":0},\"keyId\":\"default\",\"name\":\"test\",\"nickname\":\"test\"}"), &t); err != nil { + if err := json.Unmarshal([]byte("{\"args\":\"\",\"at\":\"A1MrqLgWq5XXDpTBH6fzXHUg7E8M5U2fYDAF3E1xnUSzyZuKpMh\",\"coins\":0,\"expiry\":3,\"fee\":0,\"gaz\":{\"limit\":700000000,\"price\":0},\"keyId\":\"default\",\"name\":\"test\",\"nickname\":\"test\"}"), &t); err != nil { return err } if err := json.Unmarshal(b, &t); err != nil { @@ -118,10 +118,6 @@ func (o *CmdExecuteFunctionBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateCoins(formats); err != nil { - res = append(res, err) - } - if err := o.validateGaz(formats); err != nil { res = append(res, err) } @@ -149,25 +145,6 @@ func (o *CmdExecuteFunctionBody) validateAt(formats strfmt.Registry) error { return nil } -func (o *CmdExecuteFunctionBody) validateCoins(formats strfmt.Registry) error { - if swag.IsZero(o.Coins) { // not required - return nil - } - - if o.Coins != nil { - if err := o.Coins.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "coins") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "coins") - } - return err - } - } - - return nil -} - func (o *CmdExecuteFunctionBody) validateGaz(formats strfmt.Registry) error { if swag.IsZero(o.Gaz) { // not required return nil @@ -209,10 +186,6 @@ func (o *CmdExecuteFunctionBody) validateNickname(formats strfmt.Registry) error func (o *CmdExecuteFunctionBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error - if err := o.contextValidateCoins(ctx, formats); err != nil { - res = append(res, err) - } - if err := o.contextValidateGaz(ctx, formats); err != nil { res = append(res, err) } @@ -223,22 +196,6 @@ func (o *CmdExecuteFunctionBody) ContextValidate(ctx context.Context, formats st return nil } -func (o *CmdExecuteFunctionBody) contextValidateCoins(ctx context.Context, formats strfmt.Registry) error { - - if o.Coins != nil { - if err := o.Coins.ContextValidate(ctx, formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "coins") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "coins") - } - return err - } - } - - return nil -} - func (o *CmdExecuteFunctionBody) contextValidateGaz(ctx context.Context, formats strfmt.Registry) error { if o.Gaz != nil { @@ -273,46 +230,6 @@ func (o *CmdExecuteFunctionBody) UnmarshalBinary(b []byte) error { return nil } -// CmdExecuteFunctionParamsBodyCoins Coins to be send from caller to smart contract address. -// -// swagger:model CmdExecuteFunctionParamsBodyCoins -type CmdExecuteFunctionParamsBodyCoins struct { - - // Number of parallel coins to transfer from the caller to the smart contract address. - Parallel float64 `json:"parallel,omitempty"` - - // Number of sequential coins to transfer from the caller to the smart contract address. - Sequential float64 `json:"sequential,omitempty"` -} - -// Validate validates this cmd execute function params body coins -func (o *CmdExecuteFunctionParamsBodyCoins) Validate(formats strfmt.Registry) error { - return nil -} - -// ContextValidate validates this cmd execute function params body coins based on context it is used -func (o *CmdExecuteFunctionParamsBodyCoins) ContextValidate(ctx context.Context, formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (o *CmdExecuteFunctionParamsBodyCoins) MarshalBinary() ([]byte, error) { - if o == nil { - return nil, nil - } - return swag.WriteJSON(o) -} - -// UnmarshalBinary interface implementation -func (o *CmdExecuteFunctionParamsBodyCoins) UnmarshalBinary(b []byte) error { - var res CmdExecuteFunctionParamsBodyCoins - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *o = res - return nil -} - // CmdExecuteFunctionParamsBodyGaz Gaz attibutes. Gaz is a virtual resource consumed by node while running smart contract. // // swagger:model CmdExecuteFunctionParamsBodyGaz diff --git a/api/swagger/server/restapi/resource/swagger.yml b/api/swagger/server/restapi/resource/swagger.yml index 4c6a0b160..1ac9fb3bf 100644 --- a/api/swagger/server/restapi/resource/swagger.yml +++ b/api/swagger/server/restapi/resource/swagger.yml @@ -440,9 +440,7 @@ paths: gaz: price: 0 limit: 700000000 - coins: - parallel: 0 - sequential: 0 + coins: 0 expiry: 3 fee: 0 keyId: default @@ -476,17 +474,9 @@ paths: description: Maximum number of gaz unit that a node will be able consume. default: 700000000 coins: - type: object - description: Coins to be send from caller to smart contract address. - properties: - parallel: - description: Number of parallel coins to transfer from the caller to the smart contract address. - type: number - default: 0 - sequential: - description: Number of sequential coins to transfer from the caller to the smart contract address. - type: number - default: 0 + description: Set the fee amount (in massa) that will be given to the block creator. + type: number + default: 0 expiry: description: Set the expiry duration (in number of slots) of the transaction. type: integer diff --git a/cmd/callSC/main.go b/cmd/callSC/main.go index ad243b9ae..30c95d468 100644 --- a/cmd/callSC/main.go +++ b/cmd/callSC/main.go @@ -30,7 +30,7 @@ func main() { callSC := callSC.New( addr, "set_dots", NoArgument, sendOperation.NoGazFee, sendOperation.DefaultGazLimit, - sendOperation.NoSequentialCoin, sendOperation.NoParallelCoin) + 0) opID, err := sendOperation.Call(client, sendOperation.DefaultSlotsDuration, sendOperation.NoFee, callSC, wlt.KeyPairs[0].PublicKey, wlt.KeyPairs[0].PrivateKey) diff --git a/cmd/executeSC/main.go b/cmd/executeSC/main.go index 07b73c6fd..b6e36b35f 100644 --- a/cmd/executeSC/main.go +++ b/cmd/executeSC/main.go @@ -30,7 +30,7 @@ func main() { exeSC := executesc.New(websiteStorer, sendOperation.DefaultGazLimit, sendOperation.NoGazFee, - sendOperation.NoParallelCoin) + 0, make(map[[3]uint8][]uint8)) opID, err := sendOperation.Call( client, diff --git a/cmd/executeSC/sc/websiteStorer.wasm b/cmd/executeSC/sc/websiteStorer.wasm index ef745152a4c4cc490668d6fbcc6131d74a3c6487..3893eeeffb9a514c2ea6a9507adb2db61ff72bf3 100644 GIT binary patch literal 42385 zcmchgOKhCkmEXUrB3tY(+0EESjHDgAL~;-(J+WT>G$t5*e3N=LrKVm8pyvA}N~B1M zQp0IA5HGTr1OqroW?>+`7D~h7_5BlDzJt^KP3Vqa`yi>jVk| zp7Lwk1GTZ9b2R$KS_R8ZZR8};d7n^CsK#{xtS*`4+t5s_iuhsin z1z!N!*uMW-y{GxRwOT`q4A#cm;L}2FxZkLiU-aamnn3qA2J0u%^y35dvUaiONm=V{ z)#1UH>&1DY^T!|7%lE%iFaLJ=g*2~THg?M&eNgA_dX;3}o=QaieowaRFN|S%vwfYmV@Bdu+;dl7^)9w7ydYz*|2$2P?AdaI}G z*?3s??=%Ijf2!3eKOfoy)NcmVB${4u>KW(}O+Bq%nBVHv_uf_y>ViNtzh}2qUoY#s zlIuH(*VSvxdZ*PZA*HbzWrn@is_$(}^fg4?)2e%bl(8t^Yc=+^C0<1FXN_8~7-JcO z-=EbiV>3(Qt1#<7?)Q~F>uG?Pwm#4kY)v@y^dHlr!g@XNbbX+aH0i*M6ZNJ>)stR` zW57uAd9Gv0|GqC)=@WpT15hKa3*e^sRxj()YB<#`!v7Tr_efzuXx$0}q5pfoPpezq zWlql^=mvt8B|>9W(7m04{;Pmrw0b*4h*_30G~v_|34N`G_@-+~;vIvz_Kw7wq*iP7 z?j|xBf|%3wo>BtldQbBQHJKIi#y1otH2&XxWh+0sUT$p*;S)8$eQ?}5m!y)%zuyS| zRrYVRdQdimn=tOz)Ml@2`FD>?_Ib{~Xq3G;g{I`NwcV<1NbNr-E0TLe4eHyv-p9q- z{e*td4h#B1Eb5k;iXyc2gX8+F_4hUZH5C1(^r9>-;Qj>sTu~O2y=BqtIaf5x-~N6B zFe3I({H1YD2!39x>!ZF)|9WC|S)8b;Ps-#znN$sv+8^@?S%u#V)F`oi4cXHSrHw0!CQi$bb`_ZJgR`1Yk*NuxaQiR6%^QNPUq* zg`A!?IWeV*%hT{^ys01bRcYvOd&kCdz9H111&!RulbVNiila zCxY8f`$q~R=#JJQ$R@ER%aD|%9le7JRU$>RMZ(6ATKXJFgD;Ef=jFEgUuX_Ke?ml{ z+X`sqi`%7IFSWxZvuoSZmbOKFTX7?;DEFQEtdn9?U$a@hAeq$%L=e`QKKdjIiMD9| z7h6}`L&%#D3Q(F-L3L$gcfG91i|E4tQ*@|Jy)>YU1Ibn3gR`qZ1!WN(G2zd{Or`$z z^F5_3c~^Oe!j5cVRo8p8gkyk=5Y!1swe`v%u{jOs8Nl1O3I4BjXDb3zUln>4Frup2 z{G%QMKvDjLpeCjgkyD!U^?LawI5pTa*sJUHbLIQ}C+gDSdVf=#9&Bih!JdCV{HL|| zhJRGN|9j>8ed|NL$K}=QWikCJCJu|dAVr+A7(VQJjf zpEt_CmxR<)9v8H5UHW?b;!6X){Yr=gMUFvS!9mGkDAevs115Im91%&cL?Vf-E0p$z zNY+b{xL&^hzSODz;Q+C^G5ylHLLNn$*JyvilMz$;ciTo!WNt6n=IKw{Zc@S8TJ*K; z><|C4(GH*jqKJi-$$u&YtV=cb#qvKx?6YVr6i>`Sm0>X;}FCb z=WpqVETV5kaATPPq1w)O@

dH_(sUW^l(tkMATmA^+{7xGB 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 L^*>)<+W3C~O#R#r diff --git a/int/api/cmd/execute_function.go b/int/api/cmd/execute_function.go index 6ee74f74d..1ca41d56c 100644 --- a/int/api/cmd/execute_function.go +++ b/int/api/cmd/execute_function.go @@ -63,8 +63,7 @@ func ExecuteFunctionHandler(params operations.CmdExecuteFunctionParams, app *fyn []byte(params.Body.Args), uint64(params.Body.Gaz.Price), uint64(*params.Body.Gaz.Limit), - uint64(params.Body.Coins.Sequential), - uint64(params.Body.Coins.Parallel)) + uint64(params.Body.Coins)) c := node.NewDefaultClient() diff --git a/int/api/server.go b/int/api/server.go index 57de13865..d03dc747c 100644 --- a/int/api/server.go +++ b/int/api/server.go @@ -50,7 +50,7 @@ func parseNetworkFlag(massaNodeServerPtr *string) { case "LABNET": *massaNodeServerPtr = "https://labnet.massa.net/" case "INNONET": - *massaNodeServerPtr = "https://inno.massa.net/test13" + *massaNodeServerPtr = "https://inno.massa.net/test15" case "LOCALHOST": *massaNodeServerPtr = "http://127.0.0.1" } diff --git a/pkg/node/sendoperation/callsc/callsc.go b/pkg/node/sendoperation/callsc/callsc.go index 560a86357..65c54afa3 100644 --- a/pkg/node/sendoperation/callsc/callsc.go +++ b/pkg/node/sendoperation/callsc/callsc.go @@ -12,13 +12,12 @@ const CallSCOpID = uint64(4) //nolint:tagliatelle type OperationDetails struct { - MaxGaz int64 `json:"max_gas"` - GazPrice string `json:"gas_price"` - ParallelCoins string `json:"parallel_coins"` - SequentialCoins string `json:"sequential_coins"` - TargetAddr string `json:"target_addr"` - TargetFunc string `json:"target_func"` - Param interface{} `json:"param"` + MaxGaz int64 `json:"max_gas"` + GazPrice string `json:"gas_price"` + Coins string `json:"coins"` + TargetAddr string `json:"target_addr"` + TargetFunc string `json:"target_func"` + Param interface{} `json:"param"` } //nolint:tagliatelle @@ -27,35 +26,31 @@ type Operation struct { } type CallSC struct { - address []byte - function string - parameters []byte - gazPrice uint64 - gazLimit uint64 - nbSequentialCoins uint64 - nbParallelCoins uint64 + address []byte + function string + parameters []byte + gazPrice uint64 + gazLimit uint64 + coins uint64 } -func New(address []byte, function string, parameters []byte, gazPrice uint64, gazLimit uint64, nbSequentialCoins uint64, - nbParallelCoins uint64, +func New(address []byte, function string, parameters []byte, gazPrice uint64, gazLimit uint64, coins uint64, ) *CallSC { return &CallSC{ address: address, function: function, parameters: parameters, - gazPrice: gazPrice, gazLimit: gazLimit, nbSequentialCoins: nbSequentialCoins, - nbParallelCoins: nbParallelCoins, + gazPrice: gazPrice, gazLimit: gazLimit, coins: coins, } } func (c *CallSC) Content() interface{} { return &Operation{ CallSC: OperationDetails{ - MaxGaz: int64(c.gazLimit), - GazPrice: fmt.Sprint(c.gazPrice), - ParallelCoins: fmt.Sprint(c.nbParallelCoins), - SequentialCoins: fmt.Sprint(c.nbSequentialCoins), - TargetAddr: "A" + base58.CheckEncode(append(make([]byte, 1), c.address...)), - TargetFunc: c.function, - Param: hex.EncodeToString(c.parameters), + MaxGaz: int64(c.gazLimit), + GazPrice: fmt.Sprint(c.gazPrice), + Coins: fmt.Sprint(c.coins), + TargetAddr: "A" + base58.CheckEncode(append(make([]byte, 1), c.address...)), + TargetFunc: c.function, + Param: hex.EncodeToString(c.parameters), }, } } @@ -72,12 +67,8 @@ func (c *CallSC) Message() []byte { nbBytes = binary.PutUvarint(buf, c.gazLimit) msg = append(msg, buf[:nbBytes]...) - // ParallelCoins - nbBytes = binary.PutUvarint(buf, c.nbParallelCoins) - msg = append(msg, buf[:nbBytes]...) - - // SequentialCoins - nbBytes = binary.PutUvarint(buf, c.nbSequentialCoins) + // Coins + nbBytes = binary.PutUvarint(buf, c.coins) msg = append(msg, buf[:nbBytes]...) // gazPrice diff --git a/pkg/node/sendoperation/executesc/executesc.go b/pkg/node/sendoperation/executesc/executesc.go index 0c1c79b74..19f0e1771 100644 --- a/pkg/node/sendoperation/executesc/executesc.go +++ b/pkg/node/sendoperation/executesc/executesc.go @@ -1,7 +1,9 @@ package executesc import ( + "bytes" "encoding/binary" + "encoding/gob" "fmt" ) @@ -11,7 +13,8 @@ type OperationDetails struct { Data []byte `json:"data"` MaxGas uint64 `json:"max_gas"` GasPrice string `json:"gas_price"` - Coins string `json:"coins"` + //nolint:tagliatelle + DataStore map[[3]uint8][]uint8 `json:"datastore"` } //nolint:tagliatelle @@ -20,28 +23,30 @@ type Operation struct { } type ExecuteSC struct { - data []byte - maxGas uint64 - gasPrice uint64 - Coins uint64 + data []byte + maxGas uint64 + gasPrice uint64 + dataStore map[[3]uint8][]uint8 } -func New(data []byte, maxGas uint64, gasPrice uint64, coins uint64) *ExecuteSC { +func New(data []byte, maxGas uint64, gasPrice uint64, coins uint64, dataStore map[[3]uint8][]uint8) *ExecuteSC { + gob.Register(map[[3]uint8]interface{}{}) + return &ExecuteSC{ - data: data, - maxGas: maxGas, - gasPrice: gasPrice, - Coins: coins, + data: data, + maxGas: maxGas, + gasPrice: gasPrice, + dataStore: dataStore, } } func (e *ExecuteSC) Content() interface{} { return &Operation{ ExecuteSC: OperationDetails{ - Data: e.data, - MaxGas: e.maxGas, - GasPrice: fmt.Sprint(e.gasPrice), - Coins: fmt.Sprint(e.Coins), + Data: e.data, + MaxGas: e.maxGas, + GasPrice: fmt.Sprint(e.gasPrice), + DataStore: e.dataStore, }, } } @@ -58,10 +63,6 @@ func (e *ExecuteSC) Message() []byte { nbBytes = binary.PutUvarint(buf, e.maxGas) msg = append(msg, buf[:nbBytes]...) - // Coins - nbBytes = binary.PutUvarint(buf, e.Coins) - msg = append(msg, buf[:nbBytes]...) - // GasPrice nbBytes = binary.PutUvarint(buf, e.gasPrice) msg = append(msg, buf[:nbBytes]...) @@ -71,5 +72,32 @@ func (e *ExecuteSC) Message() []byte { msg = append(msg, buf[:nbBytes]...) msg = append(msg, e.data...) + // datastore + // Number of entries in the datastore + nbBytes = binary.PutUvarint(buf, uint64(len(e.dataStore))) + msg = append(msg, buf[:nbBytes]...) + + for key, value := range e.dataStore { + compactAndAppendBytes(&msg, key) + compactAndAppendBytes(&msg, value) + } + return msg } + +func compactAndAppendBytes(msg *[]byte, value interface{}) { + buf := make([]byte, binary.MaxVarintLen64) + bytesBuffer := new(bytes.Buffer) + encoder := gob.NewEncoder(bytesBuffer) + err := encoder.Encode(value) + //nolint:golang-ci + if err != nil { + panic(err) + } + + nbBytes := binary.PutUvarint(buf, uint64(bytesBuffer.Len())) + // Value length + *msg = append(*msg, buf[:nbBytes]...) + // Value in bytes + *msg = append(*msg, bytesBuffer.Bytes()...) +} diff --git a/pkg/node/sendoperation/sendoperation.go b/pkg/node/sendoperation/sendoperation.go index 8a531b98d..18d7193cd 100644 --- a/pkg/node/sendoperation/sendoperation.go +++ b/pkg/node/sendoperation/sendoperation.go @@ -22,9 +22,11 @@ const NoGazFee = 0 const NoFee = 0 -const NoSequentialCoin = 0 +const NoCoin = 0 -const NoParallelCoin = 0 +const HundredMassa = 100000000000 + +const OneMassa = 1000000000 //nolint:tagliatelle type sendOperationsReq struct { diff --git a/pkg/node/status.go b/pkg/node/status.go index ebc1f86c4..b132c7362 100644 --- a/pkg/node/status.go +++ b/pkg/node/status.go @@ -15,7 +15,7 @@ type State struct { NextSlot *Slot `json:"next_slot"` NodeID *string `json:"node_id"` NodeIP *string `json:"node_ip"` - PoolStats *PoolStats `json:"pool_stats"` + PoolStats *[]uint `json:"pool_stats"` Version *string `json:"version"` } @@ -53,11 +53,6 @@ type NetworkStats struct { OutConnectionCount *uint `json:"out_connection_count"` } -type PoolStats struct { - EndorsementCount *uint `json:"endorsement_count"` - OperationCount *uint `json:"operation_count"` -} - func Status(client *Client) (*State, error) { rawResponse, err := client.RPCClient.Call( context.Background(), diff --git a/pkg/onchain/dns/dns.go b/pkg/onchain/dns/dns.go index b35499ae3..6801f9a4e 100644 --- a/pkg/onchain/dns/dns.go +++ b/pkg/onchain/dns/dns.go @@ -7,11 +7,12 @@ import ( "github.com/massalabs/thyra/pkg/node" "github.com/massalabs/thyra/pkg/node/base58" + "github.com/massalabs/thyra/pkg/node/sendoperation" "github.com/massalabs/thyra/pkg/onchain" "github.com/massalabs/thyra/pkg/wallet" ) -const DNSRawAddress = "A1mgzGvGthnJuScWUgvnYqB4sDcfTixbE1RYeA9tvpP4N4uQjYQ" +const DNSRawAddress = "A1dLAMrYAwubjiyikhgkU8CBJqPGcJDQBK46JEwF57m56Fnq3H7" func Resolve(client *node.Client, name string) (string, error) { const dnsPrefix = "record" @@ -54,7 +55,7 @@ func SetRecord(client *node.Client, wallet wallet.Wallet, url string, smartContr return "", fmt.Errorf("marshalling '%+v': %w", rec, err) } - result, err := onchain.CallFunction(client, wallet, addr, "setResolver", param) + result, err := onchain.CallFunction(client, wallet, addr, "setResolver", param, sendoperation.OneMassa) if err != nil { return "", fmt.Errorf("calling setResolver with '%+v' at '%s': %w", param, addr, err) } @@ -79,7 +80,7 @@ func SetRecordManager(client *node.Client, wallet wallet.Wallet) (string, error) return "", fmt.Errorf("marshalling '%+v': %w", appr, err) } - result, err := onchain.CallFunction(client, wallet, addr, "setApprovalForAll", param) + result, err := onchain.CallFunction(client, wallet, addr, "setApprovalForAll", param, sendoperation.OneMassa) if err != nil { return "", fmt.Errorf("calling setApprovalForAll with '%+v' at '%s': %w", param, addr, err) } diff --git a/pkg/onchain/sc.go b/pkg/onchain/sc.go index 1d9cc5a19..6f8942600 100644 --- a/pkg/onchain/sc.go +++ b/pkg/onchain/sc.go @@ -18,11 +18,11 @@ const maxWaitingTimeInSeconds = 45 const evenHeartbeat = 2 func CallFunction(client *node.Client, wallet wallet.Wallet, - addr []byte, function string, parameter []byte, + addr []byte, function string, parameter []byte, coins uint64, ) (string, error) { callSC := callsc.New(addr, function, parameter, sendOperation.NoGazFee, sendOperation.DefaultGazLimit, - sendOperation.NoSequentialCoin, sendOperation.NoParallelCoin) + coins) operationID, err := sendOperation.Call( client, @@ -63,7 +63,7 @@ func CallFunctionUnwaited(client *node.Client, wallet wallet.Wallet, expiryDelta ) (string, error) { callSC := callsc.New(addr, function, parameter, sendOperation.NoGazFee, sendOperation.DefaultGazLimit, - sendOperation.NoSequentialCoin, sendOperation.NoParallelCoin) + sendOperation.HundredMassa) operationID, err := sendOperation.Call( client, @@ -78,9 +78,12 @@ func CallFunctionUnwaited(client *node.Client, wallet wallet.Wallet, expiryDelta } func DeploySC(client *node.Client, wallet wallet.Wallet, contract []byte) (string, error) { + datastore := make(map[[3]uint8][]uint8) + + datastore[[3]uint8{1, 2, 3}] = []uint8{1, 2, 3} exeSC := executesc.New(contract, sendOperation.DefaultGazLimit, sendOperation.NoGazFee, - sendOperation.NoParallelCoin) + sendOperation.NoCoin, datastore) opID, err := sendOperation.Call( client, diff --git a/pkg/onchain/website/sc/websiteStorer.wasm b/pkg/onchain/website/sc/websiteStorer.wasm index ef745152a4c4cc490668d6fbcc6131d74a3c6487..3893eeeffb9a514c2ea6a9507adb2db61ff72bf3 100644 GIT binary patch literal 42385 zcmchgOKhCkmEXUrB3tY(+0EESjHDgAL~;-(J+WT>G$t5*e3N=LrKVm8pyvA}N~B1M zQp0IA5HGTr1OqroW?>+`7D~h7_5BlDzJt^KP3Vqa`yi>jVk| zp7Lwk1GTZ9b2R$KS_R8ZZR8};d7n^CsK#{xtS*`4+t5s_iuhsin z1z!N!*uMW-y{GxRwOT`q4A#cm;L}2FxZkLiU-aamnn3qA2J0u%^y35dvUaiONm=V{ z)#1UH>&1DY^T!|7%lE%iFaLJ=g*2~THg?M&eNgA_dX;3}o=QaieowaRFN|S%vwfYmV@Bdu+;dl7^)9w7ydYz*|2$2P?AdaI}G z*?3s??=%Ijf2!3eKOfoy)NcmVB${4u>KW(}O+Bq%nBVHv_uf_y>ViNtzh}2qUoY#s zlIuH(*VSvxdZ*PZA*HbzWrn@is_$(}^fg4?)2e%bl(8t^Yc=+^C0<1FXN_8~7-JcO z-=EbiV>3(Qt1#<7?)Q~F>uG?Pwm#4kY)v@y^dHlr!g@XNbbX+aH0i*M6ZNJ>)stR` zW57uAd9Gv0|GqC)=@WpT15hKa3*e^sRxj()YB<#`!v7Tr_efzuXx$0}q5pfoPpezq zWlql^=mvt8B|>9W(7m04{;Pmrw0b*4h*_30G~v_|34N`G_@-+~;vIvz_Kw7wq*iP7 z?j|xBf|%3wo>BtldQbBQHJKIi#y1otH2&XxWh+0sUT$p*;S)8$eQ?}5m!y)%zuyS| zRrYVRdQdimn=tOz)Ml@2`FD>?_Ib{~Xq3G;g{I`NwcV<1NbNr-E0TLe4eHyv-p9q- z{e*td4h#B1Eb5k;iXyc2gX8+F_4hUZH5C1(^r9>-;Qj>sTu~O2y=BqtIaf5x-~N6B zFe3I({H1YD2!39x>!ZF)|9WC|S)8b;Ps-#znN$sv+8^@?S%u#V)F`oi4cXHSrHw0!CQi$bb`_ZJgR`1Yk*NuxaQiR6%^QNPUq* zg`A!?IWeV*%hT{^ys01bRcYvOd&kCdz9H111&!RulbVNiila zCxY8f`$q~R=#JJQ$R@ER%aD|%9le7JRU$>RMZ(6ATKXJFgD;Ef=jFEgUuX_Ke?ml{ z+X`sqi`%7IFSWxZvuoSZmbOKFTX7?;DEFQEtdn9?U$a@hAeq$%L=e`QKKdjIiMD9| z7h6}`L&%#D3Q(F-L3L$gcfG91i|E4tQ*@|Jy)>YU1Ibn3gR`qZ1!WN(G2zd{Or`$z z^F5_3c~^Oe!j5cVRo8p8gkyk=5Y!1swe`v%u{jOs8Nl1O3I4BjXDb3zUln>4Frup2 z{G%QMKvDjLpeCjgkyD!U^?LawI5pTa*sJUHbLIQ}C+gDSdVf=#9&Bih!JdCV{HL|| zhJRGN|9j>8ed|NL$K}=QWikCJCJu|dAVr+A7(VQJjf zpEt_CmxR<)9v8H5UHW?b;!6X){Yr=gMUFvS!9mGkDAevs115Im91%&cL?Vf-E0p$z zNY+b{xL&^hzSODz;Q+C^G5ylHLLNn$*JyvilMz$;ciTo!WNt6n=IKw{Zc@S8TJ*K; z><|C4(GH*jqKJi-$$u&YtV=cb#qvKx?6YVr6i>`Sm0>X;}FCb z=WpqVETV5kaATPPq1w)O@

dH_(sUW^l(tkMATmA^+{7xGB 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 L^*>)<+W3C~O#R#r diff --git a/pkg/onchain/website/uploader.go b/pkg/onchain/website/uploader.go index e8bd24d3b..583a0be11 100644 --- a/pkg/onchain/website/uploader.go +++ b/pkg/onchain/website/uploader.go @@ -2,13 +2,15 @@ package website import ( "embed" - "encoding/json" + "encoding/binary" "fmt" "strconv" "strings" + "unicode/utf16" "github.com/massalabs/thyra/pkg/node" "github.com/massalabs/thyra/pkg/node/base58" + "github.com/massalabs/thyra/pkg/node/sendoperation" "github.com/massalabs/thyra/pkg/onchain" "github.com/massalabs/thyra/pkg/onchain/dns" "github.com/massalabs/thyra/pkg/wallet" @@ -51,10 +53,6 @@ func PrepareForUpload(url string, wallet *wallet.Wallet) (string, error) { type InitialisationParams struct { TotalChunks string `json:"total_chunks"` } -type AppendParams struct { - Data string `json:"data"` - ChunkID string `json:"chunk_id"` -} func Upload(atAddress string, content string, wallet *wallet.Wallet) ([]string, error) { client := node.NewDefaultClient() @@ -76,15 +74,10 @@ func Upload(atAddress string, content string, wallet *wallet.Wallet) ([]string, func upload(client *node.Client, addr []byte, chunks []string, wallet *wallet.Wallet) ([]string, error) { operations := make([]string, len(chunks)+1) + totalChunksUTF16 := encodeUint64ToUTF16String(uint64(len(chunks))) - paramInit, err := json.Marshal(InitialisationParams{ - TotalChunks: strconv.Itoa(len(chunks)), - }) - if err != nil { - return nil, fmt.Errorf("marshaling '%s': %w", InitialisationParams{TotalChunks: strconv.Itoa(len(chunks))}, err) - } - - opID, err := onchain.CallFunction(client, *wallet, addr, "initializeWebsite", paramInit) + opID, err := onchain.CallFunction(client, *wallet, addr, "initializeWebsite", []byte(totalChunksUTF16), + sendoperation.OneMassa) if err != nil { return nil, fmt.Errorf("calling initializeWebsite at '%s': %w", addr, err) } @@ -92,16 +85,17 @@ func upload(client *node.Client, addr []byte, chunks []string, wallet *wallet.Wa operations[0] = opID for index := 0; index < len(chunks); index++ { - param, err := json.Marshal(appendParams(index, chunks)) - if err != nil { - return nil, - fmt.Errorf("marshaling '%s': %w", appendParams(index, chunks), err) - } + // Chunk ID encoding + params := encodeUint64ToUTF16String(uint64(index)) + // Chunk data length encoding + params += encodeUint32ToUTF16String(uint32(len(chunks[index]))) + // Chunk data encoding + params += chunks[index] //nolint:lll - opID, err = onchain.CallFunctionUnwaited(client, *wallet, baseOffset+uint64(index)*multiplicator, addr, "appendBytesToWebsite", param) + opID, err = onchain.CallFunctionUnwaited(client, *wallet, baseOffset+uint64(index)*multiplicator, addr, "appendBytesToWebsite", []byte(params)) if err != nil { - return nil, fmt.Errorf("calling initializeWebsite at '%s': %w", addr, err) + return nil, fmt.Errorf("calling appendBytesToWebsite at '%s': %w", addr, err) } operations[index+1] = opID @@ -132,21 +126,24 @@ func UploadMissedChunks(atAddress string, content string, wallet *wallet.Wallet, //nolint:lll func uploadMissedChunks(client *node.Client, addr []byte, chunks []string, missedChunks string, wallet *wallet.Wallet) ([]string, error) { operations := make([]string, len(chunks)+1) - arrMissedChunks := strings.Split(missedChunks, "") + arrMissedChunks := strings.Split(missedChunks, ",") for index := 0; index < len(arrMissedChunks); index++ { - rawParams := appendParams(index, chunks) - - param, err := json.Marshal(rawParams) + chunkID, err := strconv.Atoi(arrMissedChunks[index]) if err != nil { - return nil, - fmt.Errorf("marshaling '%s': %w", rawParams, err) + return nil, fmt.Errorf("error while converting chunk ID") } + params := encodeUint64ToUTF16String(uint64(chunkID)) + // Chunk data length encoding + params += encodeUint32ToUTF16String(uint32(len(chunks[chunkID]))) + // Chunk data encoding + params += chunks[chunkID] + //nolint:lll - opID, err := onchain.CallFunctionUnwaited(client, *wallet, baseOffset+uint64(index)*multiplicator, addr, "appendBytesToWebsite", param) + opID, err := onchain.CallFunctionUnwaited(client, *wallet, baseOffset+uint64(index)*multiplicator, addr, "appendBytesToWebsite", []byte(params)) if err != nil { - return nil, fmt.Errorf("calling initializeWebsite at '%s': %w", addr, err) + return nil, fmt.Errorf("calling appendBytesToWebsite at '%s': %w", addr, err) } operations[index] = opID @@ -172,6 +169,35 @@ func chunk(data string, chunkSize int) []string { return chunks } -func appendParams(index int, chunks []string) AppendParams { - return AppendParams{Data: chunks[index], ChunkID: strconv.Itoa(index)} +// We need to add an interface to this function in order to handle uint64 AND uint32 when we have time. +func encodeUint64ToUTF16String(numberToEncode uint64) string { + //nolint:gomnd + buffer := make([]byte, 8) + binary.LittleEndian.PutUint64(buffer, numberToEncode) + //nolint:gomnd + runesBuffer := make([]rune, 8) + + for i := 0; i < len(buffer); i++ { + runesBuffer[i] = utf16.Decode([]uint16{uint16(buffer[i])})[0] + } + + encodedString := string(runesBuffer) + + return encodedString +} + +func encodeUint32ToUTF16String(numberToEncode uint32) string { + //nolint:gomnd + buffer := make([]byte, 4) + binary.LittleEndian.PutUint32(buffer, numberToEncode) + //nolint:gomnd + runesBuffer := make([]rune, 4) + + for i := 0; i < len(buffer); i++ { + runesBuffer[i] = utf16.Decode([]uint16{uint16(buffer[i])})[0] + } + + encodedString := string(runesBuffer) + + return encodedString }