anchor.diff:          {write, Key, Value} ->
               map_phase1(Rest, Key, [{rdht_tx_write, Key, Value} | FirstReqs]);
           % special (2-steps) functions:
  -        {set_change, Key, [], []} -> % no op
  -            map_phase1(Rest, Key, FirstReqs);
           {set_change, Key, _ToAdd, _ToRemove} ->
               map_phase1(Rest, Key, [{rdht_tx_read, Key} | FirstReqs]);
  -        {number_add, Key, X} when X == 0 -> % no op
  -            % note: tolerate integer and float
  -            map_phase1(Rest, Key, FirstReqs);
           {number_add, Key, _X} ->
               map_phase1(Rest, Key, [{rdht_tx_read, Key} | FirstReqs]);
           {test_and_set, Key, _Old, _New} ->
  
positive.code:                     X when erlang:is_tuple(X) ->
                          {TLog1, X}
                  end;
              {number_add, _Key, X} when X == 0 -> % no op
                  % note: tolerate integer and float
                  {TLog0, {ok}};
              {number_add, Key, X} ->
                  {TLog1, Result1} = single_req(TLog0, {rdht_tx_read, Key}),
                  case Result1 of
                      {ok, OldValue} when erlang:is_number(OldValue) ->
                          NewValue = OldValue + X,
                          single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue)});
                      {fail, not_found} ->
                          NewValue = X,
                          single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue)});
  
negative.code:             {commit} when AbortCommits ->
                  {TLog0, {fail, abort}};
              % special functions:
              {set_change, Key, ToAdd, ToRemove} ->
                  {TLog1, Result1} = single_req(TLog0, {rdht_tx_read, Key}),
                  case Result1 of
                      {ok, OldValue} when erlang:is_list(OldValue) ->
                          case ToAdd =:= [] andalso ToRemove =:= [] of
                              true -> {TLog1, {ok}}; % no op
                              _ ->
                                  NewValue1 = lists:append(ToAdd, OldValue),
                                  NewValue2 = util:minus(NewValue1, ToRemove),
                                  single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue2)})
                          end;
                      {fail, not_found} ->
                          NewValue2 = util:minus(ToAdd, ToRemove),
                          single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue2)});
  